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

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