iOS應用內置付費 In-App Purchase 詳細介紹
In App Purchase(程序內購買)為蘋果開發人員們打開了一個新的盈利渠道,如果您對此并不了解,下面這段 CocoaChina 會員“leon”翻譯的 In App Purchase 詳細介紹一定不能錯過。
一、In App Purchase概覽
Store Kit代表App和App Store之間進行通信。程序將從App Store接收那些你想要提供的產品的信息,并將它們顯示出來供用戶購買。
當用戶需要購買某件產品時,程序調用StoreKit來收集購買信息。下圖即為基本的store kit 模型:
Store Kit的API只是為程序添加In App Purchase功能的一小部分。你需要決定如何去記錄那些你想要提交的產品,如何在程序中將商店功能展現給用戶,還要考慮如何將用戶購買的產品提交。本章的剩余部分會展示整個流程。
Products
產品可以是任意一項你想要出售的特性。產品在iTunes Connect中被組織,這和你添加一個新的App是一樣的。支持的產品種類共有四種:
1. 內容型。包括電子書,電子雜志,照片,插圖,游戲關卡,游戲角色,和其他的數字內容。
2. 擴展功能。這些功能已經包含在App內部。在未購買之前被鎖定。例如,你可以在一個游戲程序中包含若干個小游戲,用戶可以分別來購買這些游戲。
3. 服務。允許程序對單次服務收費。比如錄音服務。
4. 訂閱。支持對內容或服務的擴展訪問。例如,你的程序可以每周提供財務信息或游戲門戶網站的信息。應該設定一個合理的更新周期,以避免過于頻繁的提示困擾用 戶。要記住:你將負責跟蹤訂閱的過期信息,并且管理續費。App Store不會替你監視訂閱的周期,也不提供自動收費的機制。
In App Purchase為創建產品提供了一種通用的機制,如何操作將由你負責。當你設計程序的時候,有以下幾點需要注意:
1. 你必須提供電子類產品和服務。不要使用In App Purchase 去出售實物和實際服務。
2. 不能提供代表中介貨幣的物品,因為讓用戶知曉他們購買的商品和服務是很重要的。
通過App Store注冊產品
每個你想要出售的產品都必須先通過iTunes Connect在App Store注冊。你需提供產品的名稱,描述,價格和其他在程序中用到的元數據。
需為產品指定唯一的標識符。當你的程序利用Store Kit和App Store通信時,會使用產品標識來取回產品的信息。如果用戶購買某個商品時,程序可以用該標識來將產品標注為“已購買”。
App Store將前面提到過的產品種類簡化為以下三種:
1. 消耗性商品。 該類商品在需要時被單次購買。比如,單次服務。
2. 非消耗性商品。 該類商品只需被某個用戶購買一次,一旦被購買,和該用戶iTunes 賬戶關聯的設備都可以使用此商品。Store Kit為在多個設備上重新存儲非消耗性商品提供了內置的支持。
3. 訂閱類。訂閱類商品擁有以上兩種類型的特性。和消耗性商品一樣,訂閱類商品可以被多次購買; 你可以在程序內部加入自己的訂閱計劃更新機制。 另外,訂閱類商品必須提供給和某一用戶關聯的所有設備。In App Purchase期望訂閱類商品可以通過外部服務器交付。你必須為多個設備的訂閱服務提供相應的支持。
關于注冊產品的詳細信息,請參考 iTunes Connect Developer Guide 文檔。
交付方式
交付機制在程序In App Purchase的設計和實現種有很重要的意義。有兩種基本的模型可以用來交付產品:內置類型(Built-in model)和服務器類型(Server model)。 不管使用那種模型,你都需要維護產品列表,并保證當用戶購買后,成功的交付產品。
(一)內置產品類型
使用這種模型。 需要交付的產品已經在程序內部。 這種方式通常用在一些被鎖定的功能上。 也可以用來交付在程序束(App Bundle)中的內容。 該方式的一個重要的優點是你可以及時的給客戶交付產品,大多數的內置產品應為非消耗性商品。
注意:In App Purchase不提供購買補丁的功能。 如果需要更改app的bundle,你必須向App Store提交新的app版本。
為了標識產品,程序要在bundle中存儲產品的標識符。內置模式下,Apple建議使用plist來紀錄產品的標識符。 內容類應用可以使用折衷方式很方便的添加新的內容,而不改動程序本身。(原話為: Content-driven applications can use this to add new content without modifying the source for your application,不是很懂,感覺應該是說類似是用plist來管理產品列表,因此就不需要在添加新產品的時候改動程序了。再議。。。)
當成功購買產品后,程序應將鎖定的功能解鎖,提供給用戶。 解鎖的最簡單方式是修改程序偏好設置(Application Preferences)。 當用戶備份手機數據的時候,程序偏好設置也會隨之備份。 程序可能需要建議用戶在購買產品后備份手機以免丟失購買的內容。
上圖顯示了交付內置型產品的流程。
1. 程序通過bundle存儲的plist文件得到產品標識符的列表。
2. 程序向App Store發送請求,得到產品的信息。
3. App Store返回產品信息。
4. 程序把返回的產品信息顯示給用戶(App的store界面)
5. 用戶選擇某個產品
6. 程序向App Store發送支付請求
7. App Store處理支付請求并返回交易完成信息。
8. App獲取信息并提供內容給用戶。
(二)服務器類型
使用這種方式,要提供另外的服務器將產品發送給程序。 服務器交付適用于訂閱、內容類商品和服務,因為商品可以作為數據發送,而不需改動程序束。 例如,一個游戲提供的新的內容(關卡等)。 Store Kit不會對服務器端的設計和交互做出定義,這方面工作需要你來完成。 而且,Store Kit不提供驗證用戶身份的機制,你需要來設計。 如果你的程序需要以上功能,例如,紀錄特定用戶的訂閱計劃, 你需要自己來設計和實現。
服務器類型的購買過程
1. 程序向服務器發送請求,獲得一份產品列表。
2. 服務器返回包含產品標識符的列表。
3. 程序向App Store發送請求,得到產品的信息。
4. App Store返回產品信息。
5. 程序把返回的產品信息顯示給用戶(App的store界面)
6. 用戶選擇某個產品
7. 程序向App Store發送支付請求
8. App Store處理支付請求并返回交易完成信息。
9. 程序從信息中獲得數據,并發送至服務器。
10. 服務器紀錄數據,并進行審(我們的)查。
11. 服務器將數據發給App Store來驗證該交易的有效性。
12. App Store對收到的數據進行解析,返回該數據和說明其是否有效的標識。
13. 服務器讀取返回的數據,確定用戶購買的內容。
14. 服務器將購買的內容傳遞給程序。
Apple建議在服務器端存儲產品標識,而不要將其存儲在plist中。 這樣就可以在不升級程序的前提下添加新的產品。
在服務器模式下, 你的程序將獲得交易(transaction)相關的信息,并將它發送給服務器。服務器可以驗證收到的數據,并將其解碼以確定需要交付的內容。 這個流程將在“驗證store收據”一節討論。
對于服務器模式,我們有安全性和可靠性方面的顧慮。 你應該測試整個環境來避免威脅。《Secure Coding Guide》文檔中有相關的提示說明。
雖然非消耗性商品可以用內置模式來恢復,訂閱類商品必須通過服務器來恢復。你要負責紀錄訂閱信息、恢復數據。 消耗類商品也可以通過服務器方式來紀錄。例如,由服務器提供的一項服務, 你可能需要用戶在多個設備上重新獲得結果。