在应用程序启动时添加事务队列观察器
当您的应用程序通话时,StoreKit将观察者附加到付款队列
SKPaymentQueue.default()。添加(your_observer)
StoreKit会在恢复或运行应用程序时,在付款队列的内容更改时自动通知您的观察者。在启动时添加应用程序的观察者可确保在应用程序的所有启动过程中都会持续,从而允许您的应用程序接收所有支付队列通知。
考虑一个应用程序的案例,其DetailViewController类在向队列中添加付款请求之前创建一个观察者,如清单1所示。只要DetailViewController创建它的实例存在,这个观察者就会存在。在出现诸如网络故障等中断的情况下,该应用程序不会完成购买过程,相关联的交易将停留在付款队列中。当应用程序恢复时,它没有观察者,因为上述观察者在您的应用程序发送到后台时被释放。因此,您的应用程序将不会收到有关队列中的事务的通知。
清单1不遵循实现交易观察者的最佳做法:当客户尝试购买产品时,App会在付款队列中添加一个观察者。
导入UIKit
导入StoreKit
类DetailViewController:UIViewController,SKPaymentTransactionObserver {
....
//当客户尝试购买产品时调用。
@IBAction func purchase(_ sender:UIButton){
//将观察者注册到付款队列。
SKPaymentQueue.default()。添加(your_observer)
//创建付款请求
让付款= SKMutablePayment(产品:产品)
//将付款请求提交到付款队列。
SKPaymentQueue.default()。添加(付款)
}
....
}
有关正确注册事务队列观察器的示例,请参见清单2。
清单2遵循注册交易观察者的最佳做法。
导入UIKit
导入StoreKit
类AppDelegate:UIResponder,UIApplicationDelegate {
....
//将观察者附加到付款队列。
func应用程序(_应用程序:UIApplication,didFinishLaunchingWithOptions launchOptions:[UIApplicationLaunchOptionsKey:Any]?) - > Bool {
//将观察者附加到付款队列。
SKPaymentQueue.default()。添加(your_observer)
返回真
}
//当应用程序即将终止时调用。
func applicationWillTerminate(_ application:UIApplication){
//删除观察者。
SKPaymentQueue.default()。删除(your_observer)
}
....
}
当您的应用程序通话时,StoreKit会从支付队列中删除观察者
SKPaymentQueue.default()。删除(your_observer)
因此,StoreKit可能会尝试通知上述观察者,如果它没有从付款队列中删除,从而导致您的应用程序崩溃,因为观察者不再存在。
重要提示:应用程序应避免在调用UIApplicationMain(_:_:_:_ :)之前初始化SKPaymentQueue。否则可能会导致意外的行为。因此,请确保在应用程序的委托应用程序(_:didFinishLaunchingWithOptions :)方法中初始化SKPaymentQueue,如清单2所示。
在呈现应用程序的商店UI之前,查询App Store中的产品信息
您的应用程序必须首先向App Store发送产品请求,然后再决定在其用户界面中显示要购买的产品。发送产品请求可让您确定您的产品是否可在App Store中销售,从而阻止您显示在您的应用中无法购买的产品。请参阅检索产品信息以了解如何创建产品请求。应用商店用SKResponse对象响应您的产品请求。使用其products属性来更新您的用户界面,从而确保您的客户只能在App Store中提供可销售的产品。
清单3不遵循呈现应用内购买产品的最佳做法:应用程序在呈现出售产品信息后查询App Store。
导入UIKit
导入StoreKit
类DetailViewController类:UIViewController,SKProductsRequestDelegate,SKPaymentTransactionObserver {
var productRequest:SKProductsRequest!
....
//应用程序首先显示要销售的产品,然后在App Store上查询
//客户尝试购买。
@IBAction func purchase(_ sender:UIButton){
//为您的产品标识符创建一个集合。
let identifier = Set(your_product_identifier)
//使用上述设置初始化产品请求。
productRequest = SKProductsRequest(productIdentifiers:identifier)
productRequest.delegate = self
//将请求发送到App Store。
productRequest.start()
}
//获取App Store的响应。
func productsRequest(_ request:SKProductsRequest,didReceive response:SKProductsResponse){
//我们卖第一个可用的产品。
让product = response.products.first!
让付款= SKMutablePayment(产品:产品)
SKPaymentQueue.default()。添加(付款)
}
}
请参阅清单4,了解呈现应用内购买产品的最佳做法的示例。
清单4遵循呈现应用内购买产品的最佳做法。
导入UIKit
导入StoreKit
类DetailViewController类:UIViewController,SKProductsRequestDelegate,SKPaymentTransactionObserver {
var productRequest:SKProductsRequest!
//从App Store获取有关您的产品的信息。
func fetchProducts(matchingIdentifiers identifier:[String]){
//为您的产品标识符创建一个集合。
让productIdentifiers = Set(identifier)
//使用上述设置初始化产品请求。
productRequest = SKProductsRequest(productIdentifiers:productIdentifiers)
productRequest.delegate = self
//将请求发送到App Store。
productRequest.start()
}
//获取App Store的响应
func productsRequest(_ request:SKProductsRequest,didReceive response:SKProductsResponse){
//如果没有可供出售的产品,则不会进行购买。
//因此,StoreKit不会提示您的客户对其购买进行验证。
如果response.products.count> 0 {
//使用availableProducts来填充你的UI。
让可用产品= response.products
}
}
}
提供用于恢复产品的UI
如果您的应用程序销售非消耗品,自动续订订阅或非续订订阅产品,那么您必须提供一个允许它们恢复的UI。有关详细信息,请参阅产品类型与恢复购买产品之间的差异。
处理交易
当您的应用程式来电时,StoreKit会向付款队列添加付款请求
SKPaymentQueue.default()。添加(your_payment)
队列创建一个事务对象来处理此请求。paymentQueue(_:updatedTransactions:)当这个事务的状态改变时,StoreKit通过调用它的方法来通知你的观察者。每个交易都有五种可能的状态,如应用内购买编程指南>交付产品>表4-1交易状态和相应的操作。确保您的观察者paymentQueue(_:updatedTransactions:)可以随时响应任何这些状态。paymentQueue(_:updatedDownloads:)如果您的应用程序提供由Apple托管的产品,请在观察者上实施该方法。
提供付费内容
发送内容或解锁您的应用程序的功能,当您的应用程序收到状态为purchased或的交易restored。这些州表示已收到正在销售的产品的付款。因此,您的客户希望获得付费内容。如果您购买的产品包含App Store中的托管内容,请务必致电SKPaymentQueuestart(_:)以下载内容。有关详细信息,请参阅解锁应用程序功能和交付关联内容。
完成交易
交易保留在付款队列中,直到它们被删除。每当paymentQueue(_:updatedTransactions:)您的应用程序启动或从后台恢复直到删除后,StoreKit将会调用您的观察者。为此,您的客户可能会一再被要求验证其购买或被阻止购买您的产品。
调用finishTransaction(_:)您的事务将其从队列中删除。已完成的交易无法收回。因此,在完成交易之前,请务必提供您的内容,下载所有Apple托管的产品内容,或完成购买流程。有关详细信息,请参阅完成事务。
测试您的应用内购买的实施
在提交应用程序进行审查之前,请务必彻底测试应用内购买的实施。请参阅各种场景的建议测试步骤,以测试您的实施和TN2413:应用内购买常见问题解答问题。
始终使用生产URL首先验证您的收据
如果您正在进行收据验证,请务必首先使用生产URL(https://buy.itunes.apple.com/verifyReceipt)验证您的收据。即使在沙箱环境中使用您的应用程序的情况也适用。App Review将在沙盒中查看您的应用的生产版本。当您的应用程序处理收据时,它必须能够检测21007收货状态代码,并将收据发送到沙箱收据验证服务器(https://sandbox.itunes.apple.com/verifyReceipt)。一旦您的应用程序在生产环境中被批准并运行,首先将收据发送到生产服务器是正确的操作。查看我应该用什么url验证我的收据?了解更多信息。
网友评论