我正在实施SwiftyStoreKit以帮助在 iOS 上进行应用内购买。我有一个设置为验证收据的服务器,所以我想要完成的是:
- 用户点击购买IAP产品
- 如果成功,则获取收据并将其发送到服务器进行验证
- 如果成功,IAP 产品交易设置为完成
- 更新用户界面。
用户点击purchase后,类似下面的函数运行:
func purchase(productId: String) {
SwiftyStoreKit.purchaseProduct(productId, quantity: 1, atomically: false) { result in
switch result {
case .success(let product):
self.validateReceiptOnServer() { (success) in
if product.needsFinishTransaction {
SwiftyStoreKit.finishTransaction(product.transaction)
}
if success {
self.updateUI()
}
else {
self.showError()
}
}
case .error(let error):
self.showError()
}
}
}
SwiftyStoreKit 还提供了一个应该在应用程序首次启动时调用的方法。Apple 文档中也说明了这一点。对我来说,这个函数看起来像这样:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
SwiftyStoreKit.completeTransactions(atomically: false) { purchases in
for purchase in purchases {
switch purchase.transaction.transactionState {
case .purchased:
self.validateReceiptOnServer() { (result) in
if purchase.needsFinishTransaction {
SwiftyStoreKit.finishTransaction(purchase.transaction)
}
switch result {
case .success: print("success validating receipt")
case .failure: print("failure validating receipt")
}
}
case .restored:
if purchase.needsFinishTransaction {
SwiftyStoreKit.finishTransaction(purchase.transaction)
}
case .failed, .purchasing, .deferred: break
@unknown default: break
}
}
}
return true
}
对于正常、不间断的购买,此设置似乎可以正常工作。我的问题是,在测试中断购买时,在调用 SwiftyStoreKit.purchaseProduct 之后,didFinishLaunchingWithOptions 中的 SwiftyStoreKit.completeTransactions 的回调被触发而不是购买回调。我预计这不是故意的,因为它使继续处理文件中触发购买的代码非常麻烦。