自从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 订阅,和消耗品一样,除了可以在设备之间共享。
创建购买流程大致可以分为十个步骤:
myPossibleProds = [NSSet setWithObjects: @”myProd1”, @”myProd2”, @”myProd3, nil];myProdRequest = [[SKProductsRequest alloc] initWithProductIdentifiers: myPossibleProds];myProdRequest.delegate = myProductsRequestDelegate;[myProdRequest start];
-(void)productsRequest:(SKProductsRequest *)request didReceiveResponse:(SKProductsResponse *)responseresponse包含可能的信息response.products //产品信息response.invalidProductIdentifiers //错误的产品标示符
myAvailableProductsArray = response.products;for (SKProduct* aProduct in myAvailableProductsArray) {diplayTitle = aProduct.localizedTitle;displayDesc = aProduct.localizedDescription;displayPrice = aProduct.price;}
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
// 商品进入购买流程case SKPaymentTransactionStatePurchasing:...break;// 成功购买商品case SKPaymentTransactionStatePurchased:...break;// 已经购买过该商品case SKPaymentTransactionStateRestored:...break;// 用户取消交易case: SKPaymentTransactionStateFailed...break;
收到交易回执以后可以传送到你的服务器处理该交易。你的服务器可以向苹果发送交易验证信息。苹果的交易验证地址:https://buy.itunes.apple.com/verifyReceipt验证数据格式:{ receipt-data : …}苹果的返回值如果是{ status : 0 } 那么交易是正确,如果返回任何其他值 { status : any_other_value } 交易就是不成立。你的服务器收到苹果的验证成功信息以后,返回给应用程序类似于解锁功能等消息。
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
defaultPaymentQueue = [SKPaymentQueue defaultQueue];[defaultPaymentQueue restoreCompletedTransactions];
测试沙盒环境只供给测试用户,并且设备上才有效,不能使用模拟器测试。可以为每个国家的商店添加测试帐号。不能用来测试其他的iTunes Store特性。需要为每个测试添加唯一的email地址,可以考虑使用+[email protected]—测试美国的商品[email protected]—测试英国的商品[email protected]—测试日本的商品测试步骤,需要在设备的设置菜单中iTunes Store登出原有帐户。然后不要在设置菜单中登录测试帐号,而是直接打开需要测试的程序进行测试。在这之前需要在iTunes Connect的Manage Users菜单中添加In App Purchase测试用户。
财务报表
本文部分内容参考自In App Purchase Programming Guide和WWDC 2009 Sessions,如需转载请注明出处。