IOS應用內購買App開發完整流程

看了一些網上教程,基本上是老版本的了。我針對本身遇到的一些問題,結合官方文檔把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)

協議稅務銀行業務

  • 建立App

    1. 進入iTunes Connect異步

    2. 進入個人App 進入新建Appide

    3. 新建App測試

      這裏說一下,套裝ID就是Bundle ID,保證和Xcode項目中的Bundle ID一致。其實不曉得填的地方點擊那個小問號就有提示了。(我不知道爲嘛要截這麼多圖,或許會讓文章顯得親切點😄) 新建Appui

    對了,新建App時要保證應用內購買的功能時勾選上的。編碼

  • 建立商品

    建好支持應用內購買的App後,就能夠該App可購買的商品了。.net

    1. 建立App內購買項目

      依次點擊*{建立的App名}* -> 功能 -> App內購買項目 -> + 建立App內購買項目

    2. 選擇項目類型 項目類型

通常對項目來講大多數都是選擇「消耗型項目」這個種類,好比遊戲中購買虛擬貨幣等。具體區別請看這裏

3. 項目摘要
    ![項目摘要](https://static.oschina.net/uploads/img/201601/19174703_ZQq8.png "在這裏輸入圖片標題")        

	- 參考名稱:商品名稱,能夠根據商品等實際意義填寫,不會顯示在App Store
	- 產品ID:要求惟一性,能夠用App的Bundle ID加後綴表示
	- 價格等級:蘋果的銷售商品不能隨意訂價,按等級選擇合適的便可。點擊*查看價格表*能夠看到各等級價格,以及商品賣出後你的實際收益。
    ![價格標準](https://static.oschina.net/uploads/img/201601/19174754_vbSk.png "在這裏輸入圖片標題")

	其中**CNY**爲人民幣

4. 項目詳情
    ![項目詳情](https://static.oschina.net/uploads/img/201601/19174734_eBjd.png "在這裏輸入圖片標題")    

	- 語言:至少添加一種語言的項目描述
	- 審覈備註:我填了測試帳戶信息
	- 屏幕快照:按要求上傳,我傳的是支付頁面的屏幕截圖
	
5. 等待審覈
    ![等待審覈](https://static.oschina.net/uploads/img/201601/19174909_jxtW.png "在這裏輸入圖片標題")

**!這個狀態下已經能編碼對相應商品就行購買測試了,*審覈經過*的狀態得等到App提交後才行**
  • 申請測試帳號

用戶與職能

1. 進入**用戶與職能**
2. 點擊**沙箱技術測試員**
3. 點擊**+**添加新帳號

***注意:***
- 帳號記不住密碼就刪除,再用不一樣的郵箱從新建立
- 帳號建立後不能被修改
- 沙盒測試帳戶被刪除後,該Apple ID也不能再用做*沙盒測試用戶*和*iTunes Connect用戶*
- 帳號郵箱能夠是隨意編造
- ***該帳號不能用來在正式的App Store上登陸,只用於測試環境下***
  • 測試帳號的使用

    1. 清除測試設備的帳號信息
    2. 在設備的"設置"裏退出App Store帳號(這能避免測試過程當中真實帳號被使用)
    3. 在Xcode中將App編到測試設備
    4. 在測試時,App會要求登陸,這時候選擇測試帳號登陸,完成交易

代碼部分

  • 購買流程

購買階段

總的來講,交互分爲三個階段:

  1. 獲取商品信息: app向App Store請求商品信息,並展現;
  2. 購買請求: 用戶選擇商品,由app向App Store請求購買;
  3. 交付商品: App Store處理支付請求,app交付商品。

!在Xcode中要加入StoreKit.framework

  • 獲取商品信息

    1. 從App Bundle或者本身的服務器上獲取商品的ID
    // 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。
    1. 將商品ID集合發給App Store(利用SKProductsRequest)
    // 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發起異步請求。
    1. 將App Store返回的商品信息展現(返回的商品用SKProduct表示)
    -(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
    	{
    ...
    	}
  • 購買請求

    1. 向SKPaymentQueue添加一個購買請求
    SKMutablePayment *payment = [SKMutablePayment paymentWithProduct:product];
    	[[SKPaymentQueue defaultQueue] addPayment:payment];

    SKPaymentQueue會自動向App Sotre 提交購買請求。

    1. 給SKPaymentQueue添加監聽器,該監聽器實現了SKPaymentTransactionObserver協議
    // 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工做流,不該該每次啓動時執行,應該讓用戶本身觸發

  • 交付商品

    1. 將購買成功的商品紀錄保存,以便下次啓動時用
    2. 調用SKPaymentQueue的finishTransaction方法
  • demo

    demo項目修改

    • 點擊下載demo
    • 將工程target中的Bundle Identifier改爲前面建立的App ID
    • 在工程中的ProductIds.plist中添加前面在iTunes Connect中建立的商品ID
    • 編譯運行

參考

相關文章
相關標籤/搜索