2

我正在实施SwiftyStoreKit以帮助在 iOS 上进行应用内购买。我有一个设置为验证收据的服务器,所以我想要完成的是:

  1. 用户点击购买IAP产品
  2. 如果成功,则获取收据并将其发送到服务器进行验证
  3. 如果成功,IAP 产品交易设置为完成
  4. 更新用户界面。

用户点击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 的回调被触发而不是购买回调。我预计这不是故意的,因为它使继续处理文件中触发购买的代码非常麻烦。

4

0 回答 0