看了一些網上教程,基本上是老版本的了。我針對本身遇到的一些問題,結合官方文檔把IAP(In-App Purchase)過程梳理了一下。 P.S. 官方文檔纔是王道!html
應用內購買要和App Store發生交互,這裏在正式編寫代碼前須要作幾個工做。ios
收費App、含應用內購買的App等有付費功能的須要完善這部分信息。 1. 進入iTunes Connect服務器
iTunes Connect是蘋果提供的一個平臺,主要提供App發佈和管理App的,最重要的功能是建立管理項目信息,項目付費產品(道具)管理、付費的測試帳號、提交App等等。 2. 進入協議、稅務和銀行業務app
這一部分具體能夠參照這篇[iOS App提交指南(二)-協議、稅務和銀行業務](http://www.jianshu.com/p/c7cf65911bc1)
進入iTunes Connect異步
進入個人App ide
新建App測試
這裏說一下,套裝ID就是Bundle ID,保證和Xcode項目中的Bundle ID一致。其實不曉得填的地方點擊那個小問號就有提示了。(我不知道爲嘛要截這麼多圖,或許會讓文章顯得親切點😄) ui
對了,新建App時要保證應用內購買的功能時勾選上的。編碼
建好支持應用內購買的App後,就能夠該App可購買的商品了。.net
建立App內購買項目
依次點擊*{建立的App名}* -> 功能 -> App內購買項目 -> +
選擇項目類型
通常對項目來講大多數都是選擇「消耗型項目」這個種類,好比遊戲中購買虛擬貨幣等。具體區別請看這裏
3. 項目摘要  - 參考名稱:商品名稱,能夠根據商品等實際意義填寫,不會顯示在App Store - 產品ID:要求惟一性,能夠用App的Bundle ID加後綴表示 - 價格等級:蘋果的銷售商品不能隨意訂價,按等級選擇合適的便可。點擊*查看價格表*能夠看到各等級價格,以及商品賣出後你的實際收益。  其中**CNY**爲人民幣 4. 項目詳情  - 語言:至少添加一種語言的項目描述 - 審覈備註:我填了測試帳戶信息 - 屏幕快照:按要求上傳,我傳的是支付頁面的屏幕截圖 5. 等待審覈  **!這個狀態下已經能編碼對相應商品就行購買測試了,*審覈經過*的狀態得等到App提交後才行**
1. 進入**用戶與職能** 2. 點擊**沙箱技術測試員** 3. 點擊**+**添加新帳號 ***注意:*** - 帳號記不住密碼就刪除,再用不一樣的郵箱從新建立 - 帳號建立後不能被修改 - 沙盒測試帳戶被刪除後,該Apple ID也不能再用做*沙盒測試用戶*和*iTunes Connect用戶* - 帳號郵箱能夠是隨意編造 - ***該帳號不能用來在正式的App Store上登陸,只用於測試環境下***
總的來講,交互分爲三個階段:
!在Xcode中要加入StoreKit.framework
// Load the product identifiers fron ProductIds.plist NSURL *plistURL = [[NSBundle mainBundle] URLForResource:@"ProductIds" withExtension:@"plist"]; NSArray *productIds = [NSArray arrayWithContentsOfURL:plistURL];
這裏的product id就是在**iTunes Connect**中建立的應用內購買項目的ID。
// Create a product request object and initialize it with our product identifiers SKProductsRequest *request = [[SKProductsRequest alloc] initWithProductIdentifiers:[NSSet setWithArray:productIds]]; request.delegate = self; // Send the request to the App Store [request start];
這裏由StoreKit發起異步請求。
-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response { ... }
SKMutablePayment *payment = [SKMutablePayment paymentWithProduct:product]; [[SKPaymentQueue defaultQueue] addPayment:payment];
SKPaymentQueue會自動向App Sotre 提交購買請求。
// Attach an observer to the payment queue [[SKPaymentQueue defaultQueue] addTransactionObserver:[StoreObserver sharedInstance]];
demo中是在App啓動時就添加了監聽器。 主要實現的方法是下面這個更新用的:
// Called when there are trasactions in the payment queue -(void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions { for(SKPaymentTransaction * transaction in transactions) { switch (transaction.transactionState ) { ... // 購買成功 case SKPaymentTransactionStatePurchased: ... break; // 恢復交易 case SKPaymentTransactionStateRestored: ... break; // 購買失敗 case SKPaymentTransactionStateFailed: ... break; default: break; } } } ```
Restore這種交易狀態是恢復。若是有些人在iPhone上用一個帳號購買了一個產品,那麼在iPad上又下載了這個應用,就不須要從新購買了。經過Restore在App Store中檢測你這個帳號的購買記錄,若是有購買記錄存在,那就不用再次購買了,直接恢復,就會出現restoreTransaction。關於 商品恢復,請點擊: 會打斷app工做流,不該該每次啓動時執行,應該讓用戶本身觸發
finishTransaction
方法