前段時間公司app需要接入蘋果支付,看了很多有關(guān)IAP的教程,雖然寫的都很不錯,但每篇文章都不是很全很詳細,有的容易出問題的地方都一筆而過了。當(dāng)然,如果你有一定的iOS開發(fā)經(jīng)驗,這些也就應(yīng)該是一筆而過。
最近有很多人問我IAP的問題,所以準(zhǔn)備寫一篇教程,完全面對小白,手把手傳授技能,希望大家不要讓IAP難住或者耽誤較多的開發(fā)時間與成本,也希望大家看過會對自己有所幫助。
首先呢,IAP的工作流程大概是這樣的:
1.向服務(wù)器請求商品訂單號碼以及ituns配置的商品ID
2.根據(jù)商品ID,向服務(wù)器發(fā)起購買商品請求
3.購買流程結(jié)束后, 向服務(wù)器發(fā)起驗證憑證以及支付結(jié)果的請求
4.驗證流程結(jié)束完成購買流程。
itunesconnect
下面是具體的流程了:
1.首先,你要有一個開發(fā)者賬號(這好像是廢話了...)
登錄itunesconnect.apple.com。

點擊協(xié)議、稅務(wù)和銀行業(yè)務(wù),把里面的Contact Info,Bank Info,Tax Info這三個信息填完整(少一個都不會拿到商品信息)
2.創(chuàng)建App或者選擇已經(jīng)有的App, 點擊進入詳情之后, 點擊App內(nèi)購項目這一選項

點擊加號。

這里解釋一下這幾種類型:
1.消耗型項目
對于消耗型 App 內(nèi)購買項目,用戶每次下載時都必須進行購買。一次性服務(wù)通常屬于消耗型項目,例如釣魚 App 中的魚餌。
2.非消耗型項目
對于非消耗型 App 內(nèi)購買項目,用戶僅需要購買一次。不會過期或隨使用而減少的服務(wù)通常為非消耗型項目,例如游戲 App 的新跑道。
3.自動續(xù)訂訂閱
通過自動續(xù)訂訂閱,用戶可以購買指定時間期限內(nèi)的更新和動態(tài)內(nèi)容。除非用戶取消選擇,否則訂閱(例如雜志訂閱等)會自動續(xù)訂。
4.免費訂閱
免費訂閱是開發(fā)人員在“報刊雜志”中推廣其內(nèi)容的絕佳方式。用戶注冊免費訂閱后,此訂閱內(nèi)容在與該用戶 Apple ID 相關(guān)聯(lián)的所有設(shè)備上可用。免費訂閱不會過期,并且僅能在位于“報刊雜志”類別中的 App 中提供。
5.非續(xù)訂訂閱
非續(xù)訂訂閱允許有時限性的營銷服務(wù)。對于 App 內(nèi)購買項目中的限時訪問內(nèi)容,就需使用非續(xù)訂訂閱。例如,導(dǎo)航 App 中語音導(dǎo)航功能的一周訂閱,或者年度訂閱已存檔的視頻或音頻的在線目錄。
舉個例子:比如Q幣,就屬于消耗型的商品,或比如QQ會員,就屬于非續(xù)訂訂閱了。通常的的開發(fā)是使用這兩種類型的比較多。其他的就不舉例說明了,大家自己發(fā)現(xiàn)吧,啊哈哈。


商品id是你獲取商品的標(biāo)示,當(dāng)然id是你自己命名的。
好了,到這里itunesconnect的配置就基本完成了,下面是代碼了。
代碼
導(dǎo)入 StoreKit.Framework 這個框架
在需要支付的vc里 #import<StoreKit/StoreKit.h>
1在 - (void)viewDidLoad里添加購買監(jiān)聽
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
2 檢測是否允許內(nèi)購
if([SKPaymentQueue canMakePayments]){
? ? ? ? ? ? [selfrequestProductData:productID]; ? ? ??
}else{
NSLog(@"不允許程序內(nèi)付費"); ? ? ??
}
3請求商品信息
- (void)requestProductData:(NSString*)type{
NSArray*product = [[NSArrayalloc] initWithObjects:type,nil];
NSSet*nsset = [NSSetsetWithArray:product];
SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:nsset];
request.delegate=self;? ??
[request start];
}
4.1成功收到產(chǎn)品返回信息
- (void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response{
NSArray*product = response.products;
if([product count] ==0){
NSLog(@"沒有商品");
return;
}
?SKPayment * payment = [SKPayment paymentWithProduct:p];
[[SKPaymentQueue defaultQueue] addPayment:payment];
}
4.2失敗執(zhí)行的方法
- (void)request:(SKRequest*)request didFailWithError:(NSError*)error {
NSLog(@"商品信息請求錯誤:%@", error);
}
- (void)requestDidFinish:(SKRequest*)request {
NSLog(@"請求結(jié)束");
}
5監(jiān)聽購買結(jié)果
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transaction {
for(SKPaymentTransaction *tranintransaction){
switch(tran.transactionState) {
caseSKPaymentTransactionStatePurchased:
NSLog(@"交易完成");
break;
caseSKPaymentTransactionStatePurchasing:
NSLog(@"商品添加進列表");
break;
caseSKPaymentTransactionStateRestored:
NSLog(@"已經(jīng)購買過商品");
break;
caseSKPaymentTransactionStateFailed:
NSLog(@"交易失敗");
break;
default:
[SVProgressHUDdismiss];
break;
}
在請求商品信息的時候,因為是去請求蘋果的服務(wù)器,所以請求時間會稍微有點長,所以響應(yīng)的解決方法也是有的,就是做一些本地化。不過我沒搞(啊哈哈),大家有需求的可以弄一下。
測試
有關(guān)測試呢,需要添加沙箱的測試帳號, 在itunsconnect中選擇用戶與職能,然后添加測試帳號, 這個帳號可以用于測試購買。 另外, 在測試的時候, 可能比較慢, 所以我的項目中加入了不可交互的HUD進行提示, 避免用戶進行多次商品的添加與購買。

恩,我所知道的有關(guān)IAP的大體上這些,可以滿足簡單的支付了。
這篇文章可能會漏掉一些知識點,代碼也不是很健全,大家所需了解的應(yīng)該是原理和流程,其他的就好說了。
希望這篇文章會對一些初學(xué)者,或者對IAP有所疑問的開發(fā)者能有所幫助。