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

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

點(diǎn)擊加號(hào)。

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


商品id是你獲取商品的標(biāo)示,當(dāng)然id是你自己命名的。
好了,到這里itunesconnect的配置就基本完成了,下面是代碼了。
代碼
導(dǎo)入 StoreKit.Framework 這個(gè)框架
在需要支付的vc里 #import<StoreKit/StoreKit.h>
1在 - (void)viewDidLoad里添加購(gòu)買監(jiān)聽
[[SKPaymentQueue defaultQueue] addTransactionObserver:self];
2 檢測(cè)是否允許內(nèi)購(gòu)
if([SKPaymentQueue canMakePayments]){
? ? ? ? ? ? [selfrequestProductData:productID]; ? ? ??
}else{
NSLog(@"不允許程序內(nèi)付費(fèi)"); ? ? ??
}
3請(qǐng)求商品信息
- (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(@"商品信息請(qǐng)求錯(cuò)誤:%@", error);
}
- (void)requestDidFinish:(SKRequest*)request {
NSLog(@"請(qǐng)求結(jié)束");
}
5監(jiān)聽購(gòu)買結(jié)果
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transaction {
for(SKPaymentTransaction *tranintransaction){
switch(tran.transactionState) {
caseSKPaymentTransactionStatePurchased:
NSLog(@"交易完成");
break;
caseSKPaymentTransactionStatePurchasing:
NSLog(@"商品添加進(jìn)列表");
break;
caseSKPaymentTransactionStateRestored:
NSLog(@"已經(jīng)購(gòu)買過(guò)商品");
break;
caseSKPaymentTransactionStateFailed:
NSLog(@"交易失敗");
break;
default:
[SVProgressHUDdismiss];
break;
}
在請(qǐng)求商品信息的時(shí)候,因?yàn)槭侨フ?qǐng)求蘋果的服務(wù)器,所以請(qǐng)求時(shí)間會(huì)稍微有點(diǎn)長(zhǎng),所以響應(yīng)的解決方法也是有的,就是做一些本地化。不過(guò)我沒搞(啊哈哈),大家有需求的可以弄一下。
測(cè)試
有關(guān)測(cè)試呢,需要添加沙箱的測(cè)試帳號(hào), 在itunsconnect中選擇用戶與職能,然后添加測(cè)試帳號(hào), 這個(gè)帳號(hào)可以用于測(cè)試購(gòu)買。 另外, 在測(cè)試的時(shí)候, 可能比較慢, 所以我的項(xiàng)目中加入了不可交互的HUD進(jìn)行提示, 避免用戶進(jìn)行多次商品的添加與購(gòu)買。

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