自從10月16日蘋果發送給所有開發者的那 一封信 ,通知了程序內購買將可用于免費應用,我認為這也宣告了LITE版的時代結束。
成千上萬的免費版的軟件或游戲,將作為限制了功能的完整版免費發售,如果用戶覺得有意購買,可以直接解鎖完整版的功能或購買附加內容。
本文講闡述如何為你現有的應用或游戲添加程序內購買(In App Purchase)功能。
閱讀前提:假設了你擁有一定的iPhone SDK開發基礎,和App Store實踐經驗。
你的程序需要唯一的Bundle ID, 如果已經發布的程序使用了通配符,那么就不能直接添加該功能。如果擁有了唯一的ID,請在program portal中添加你的app id,允許程序使用內購買(Enable In App Purchase)。
在設計好你的程序內購買的功能以后,首先需要定義元數據。來到 iTunes Connect ,在Manage Your In App Purchases中為你的程序添加一個程序內購買的商品。
上面第一個部分是添加的內部信息。參考名稱,ID,類型,和價格。以及各種本地化信息。
這里簡單說一下類型的選擇,其他信息,以及In App Purchase支持什么類型的商品請查看
Getting Started with In App Purchase
。
Non-consumable 默認類型,非消耗品,具有持久性,特點是一次性購買,可用在所有設備。例如解鎖游戲的儲存關卡功能。
Consumable 消耗品,用完或使用后消失,可多次購買,不能用在所有的設備,例如游戲中的血瓶或技能書。
Subscription 訂閱,和消耗品一樣,除了可以在設備之間共享。
創建購買流程
大致可以分為十個步驟:
-
驗證App Store存取權限
這樣做是因為,家長控制或一些公司的配置文件阻止了此功能,使用支付隊列的查詢功能canMakePayments來確定用戶是否有權限購買,返回值YES代表可以購買/NO代表沒有權限購買。 -
載入目錄
載入儲存在本地或者遠程的商品目錄。 -
獲得商品本地化信息
程序向App Store發起查詢請求獲得目錄中商品的本地化信息。:
myPossibleProds = [NSSet setWithObjects: @”myProd1”, @”myProd2”, @”myProd3, nil];
myProdRequest = [[SKProductsRequest alloc] initWithProductIdentifiers: myPossibleProds];
myProdRequest.delegate = myProductsRequestDelegate;
[myProdRequest start];
程序接收來自App Store的回應:
-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)response
response包含可能的信息
response.products //產品信息
response.invalidProductIdentifiers //錯誤的產品標示符
錯誤的產品可能由下面的原因導致:- 商品未在 iTunes Connect中錄入。
- 商品沒有選擇“Cleared for Sale”。
- 商品還沒有傳播到所有服務器。
-
創建商品信息
前面的步驟獲得了產品信息的數組用以呈現:
myAvailableProductsArray = response.products;
for (SKProduct* aProduct in myAvailableProductsArray) {
diplayTitle = aProduct.localizedTitle;
displayDesc = aProduct.localizedDescription;
displayPrice = aProduct.price;
} -
呈現商品信息
在UI中顯示前面獲得的信息 -
請求支付
myPayment = [SKPayment paymentForProductIdentifier: selectedProdID userInfo: nil];
或
myPayment = [SKPayment paymentForProduct: selectedProduct userInfo: nil];
然后 提交到隊列
defaultPaymentQueue = [SKPaymentQueue defaultQueue];
[defaultPaymentQueue addTransactionObserver: myObserver];
[defaultPaymentQueue addPayment: myPayment];
[defaultPaymentQueue addPayment: myRequest];
- (void)paymentQueue:(SKPaymentQueue *)queue updatedTransactions:(NSArray *)transactions
-
驗證支付的事務
for(SKPaymentTransaction *aTransaction in transactions) {
switch (aTransaction.transactionState ) {// 商品進入購買流程
case SKPaymentTransactionStatePurchasing:
...
break;
// 成功購買商品
case SKPaymentTransactionStatePurchased:
...
break;
// 已經購買過該商品
case SKPaymentTransactionStateRestored:
...
break;
// 用戶取消交易
case: SKPaymentTransactionStateFailed
...
break;
App Store的交易回執
aTransaction.transactionReceipt- Used to validate e-commerce transaction
- Cryptographically signed chunk of data
- Contains information about the purchase
- Can validate using Web-based API
收到交易回執以后可以傳送到你的服務器處理該交易。
你的服務器可以向蘋果發送交易驗證信息。
蘋果的交易驗證地址:https://buy.itunes.apple.com/verifyReceipt
驗證數據格式:{ receipt-data : …}
蘋果的返回值如果是{ status : 0 } 那么交易是正確,如果返回任何其他值 { status : any_other_value } 交易就是不成立。
你的服務器收到蘋果的驗證成功信息以后,返回給應用程序類似于解鎖功能等消息。 -
解鎖內置物品火提供遠程存取地址
需要注意的地方- 用戶可能隨時退出程序。
- Store Kit 的交易隊列是持久化的。
- 交易是持久化的。
- 驗證存取。
- 移除交易。
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
-
儲存購買
需要將非消耗的購買記錄在服務器上,以供用戶更換設備或刪除程序以后重新安裝時再次解鎖功能。 -
提供物品恢復
前面的代碼中,已經購買過該商品的處理就是直接解鎖。
defaultPaymentQueue = [SKPaymentQueue defaultQueue];
[defaultPaymentQueue restoreCompletedTransactions];
測試沙盒環境
只供給測試用戶,并且設備上才有效,不能使用模擬器測試。
可以為每個國家的商店添加測試帳號。
不能用來測試其他的iTunes Store特性。
需要為每個測試添加唯一的email地址,可以考慮使用+
payam+usa@example.com—測試美國的商品
payam+uk@example.com—測試英國的商品
payam+jp@example.com—測試日本的商品
測試步驟,需要在設備的設置菜單中iTunes Store登出原有帳戶。
然后不要在設置菜單中登錄測試帳號,而是直接打開需要測試的程序進行測試。
在這之前需要在iTunes Connect的Manage Users菜單中添加In App Purchase測試用戶。
財務報表
-
收入和應用程序同樣的規則
- 你獲得總收入的70%。
- 支付日程,使用稅,報表等全部都一樣。
-
報表
- 一樣的報表格式。
- 販賣的標示符欄顯示物品的產品ID。
- 所有者標示符欄顯示程序的ID。
本文部分內容參考自 In App Purchase Programming Guide 和WWDC 2009 Sessions,如需轉載請注明出處。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
