当前位置: 首页 > 科技观察

IAPBestPractices

时间:2023-03-13 01:31:25 科技观察

本文档是Apple于8月5日发布的最新技术笔记--In-AppPurchaseBestPractices,主要介绍IAP在iOS和OSX应用中的最佳实践。以下是为开发人员推荐的IAP最佳实践列表。在应用程序启动时添加交易队列观察器应用程序调用StoreKit将观察器链接到支付队列。[SKPaymentQueuedefaultQueue]addTransactionObserver:your_observer];当恢复或运行你的应用程序时,如果支付队列的内容发生变化,StoreKit会自动通知你(注册)观察者在应用程序启动时添加观察者以确保它在所有应用程序启动时都会存在,这将允许你的应用程序接收所有付款队列通知。考虑一个应用程序的情况,其中应用程序的DetailViewController类在将支付请求添加到队列之前创建一个观察者(参见表1)。这个观察者与DetailViewController实例一样长。如果出现中断,例如网络故障,应用程序将无法完成购买过程,而相关交易仍在排队等待付款。当应用程序正常恢复时,不会有观察者,因为在应用程序被发送到后台时,上述观察者已经被移除。因此,您的应用程序不会收到队列中事务的通知。清单1.不遵循实现事务观察器的最佳实践:当用户尝试购买产品时,应用程序向支付队列添加一个观察器:@implementationDetailViewController....//Calledwhenacustomerattemptstoppurchaseaproduct-(IBAction)purchase:(id)sender{//Registeranobservertothepaymentqueue[[SKPaymentQueuedefaultQueue]addTransactionObserver:self];//创建支付请求SKMutablePayment*payment=[SKMutablePaymentpaymentWithProduct:self.product];//将支付请求提交到支付队列[[@SKPaymentQueuedefaultQueueregister]endaddPayment2.}:者的最佳实现@实现-实现BOOL)application:(UIApplication*)applicationdidFinishLaunchingWithOptions:(NSDictionary*)launchOptions{//Attachanobservertothepaymentqueue[[SKPaymentQueuedefaultQueue]addTransactionObserver:self];returnYES;}//当应用即将终止时调用-(void)applicationWillTerminate:(UIApplication*)application{//Removetheobserver[[SKPaymentQueuedefaultQueue]removeTransactionObserver:self];}....@endStoreKit在调用应用时从支付队列中移除观察者:类似地,如果不从支付队列移除观察者,StoreKit将尝试通知所述观察者,导致应用程序崩溃,就好像观察者不再存在一样在显示应用程序商店UI之前向AppStore询问产品信??息决定在UI中显示可用在购买之前一个项目,您的应用程序必须首先向AppStore发送产品请求。发送产品请求可让您确定产品是否在AppStore中有售,从而防止产品显示为可供购买。请参阅检索产品信息以了解如何创建产品请求。AppStore使用SKResponse对象响应产品请求,使用其products属性更新您的UI,以确保您的用户只能看到AppStore中有售的产品。Listing3.不遵循IAP产品展示最佳实践:APP在展示可售产品后,向AppStore询问相关产品信息。//App首先显示待售产品,然后在客户尝试停止购买时查询AppStore-(IBAction)purchase:(id)sender{//CreateasetforyourproductidentifierNSSet*productSet=[NSSetsetWithObject:@"your_product_identifier"];//创建产品请求对象并用上面的set初始化它self;//将请求发送到AppStore[requeststart];}//获取AppStore的响应-(void)productsRequest:(SKProductsRequest*)requestdidReceiveResponse:(SKProductsResponse*)response{//Nopurchasewilltakeplaceiftherearerenoproductsavailableforsale.//Asareresult,StoreKitwon'tpromptyourcustomertopurchase.if.[their[他们productscount]>0){SKProduct*product=(SKProduct*)[response.productsobjectAtIndex:0];//Theproductisavailable,let'ssubmitapaymentrequesttothequeueSKMutablePayment*payment=[SKMutablePaymentpaymentWithProduct:product];[[SKPaymentQueuedefaultQueue]addPayment:payment];}}List4.遵循IAP产品展示的最佳实践-(void)fetchProductInformationForIds:(NSArray*)productIds{//CreateasetforyourproductidentifierNSSet*mySet=[NSSetsetWithObject:your_product_identifier];[SKProductsRequestalloc]initWithProductIdentifiers:mySet];request.delegate=self;//SendtherequesttotheAppStore[requeststart];}//获取AppStore的response-(void)productsRequest:(SKProductsRequest*)requestdidReceiveResponse:(SKProductsResponse*)(responseproductscount]>0){//UseavailableProductstoppopulateyourUINSArray*availableProducts=response.products;}}提供用于恢复产品的UI如果你的应用销售非消耗品、自动续期订阅或非续期订阅产品,那么你必须提供一个权限恢复他们的UI可以在产品类型之间的差异和恢复购买的产品以获取更多信息。处理交易并调用StoreKit将支付请求添加到支付队列:[[SKPaymentQueuedefaultQueue]addPayment:your_payment];队列创建一个事务对象来处理这个请求。当交易状态发生变化时,StoreKit通过调用paymentQueue:updatedTransactions:通知您的观察者。In-AppPurchaseProgrammingGuide>DeliveringProducts>Table4-1Transactionstatesandactionsactions列出了每笔交易的4种可能的交易状态。确保paymentQueue:updatedTransactions:observer可以随时响应这些状态。如果IAP产品由Apple托管,则需要在观察者上实现paymentQueue:updatedDownloads:方法。提供付费内容当收到状态为SKPaymentTransactionStatePurchased或SKPaymentTransactionStateRestored的交易时,应用程序将向用户提供内容或解锁应用程序的功能。这些状态表示已收到可供销售的产品的付款。用户还希望应用程序提供付费内容。如果您购买的内容包括AppStore托管内容,请务必调用SKPaymentQueue的startDownloads:来下载内容。有关详细信息,请参阅解锁应用程序功能和交付关联内容。已完成的交付交易将保留在付款队列中,直到它们被删除。每次应用程序启动或从后台恢复时,StoreKit都会调用观察者的paymentQueue:updatedTransactions:直到它们被删除。一般的想法是您的用户可能会反复请求验证他们的购买,或者被阻止购买您的产品。调用finishTransaction:从队列中删除事务。已完成的交易不可撤销,因此您务必在完成交易前提供内容、下载所有Apple托管的产品内容或完成您的购买流程。有关详细信息,请参阅完成交易。测试IAP实施确保在提交应用程序以供审核之前彻底测试IAP实施。在建议的测试步骤中查看多个测试场景,在常见问题解答中查看各种故障排除。参考:In-AppPurchaseProgrammingGuideAddingIn-AppPurchasetoyouriOSandOSXApplicationsWWDC2012:SellingProductswithStoreKitWWDC2012:ManagingSubscriptionswithIn-AppPurchaseWWDC2013:UsingStoreKitforIn-AppPurchasesWWDC2014:优化In-应用购买