关于在app store上处理iAP成功的问题

问题描述 投票:0回答:2

如果用户在iAP进程启动之前没有付款信息应用程序会将用户重定向到应用程序商店以获取用户填写的付款信息,并且当用户已经完成并且付款完成时(获取警报购买成功)钱被切断,app store没有将用户重定向回应用程序,如果用户回到应用程序注意到了。

SKPaymentTransactionObserver没有调用,用户没有获得任何消耗品(应用程序中的信用)

func paymentQueue(_ queue: SKPaymentQueue, updatedTransactions transactions: [SKPaymentTransaction]) {
for transaction in transactions {
  switch transaction.transactionState {
  case .deferred:
    print("transactionState = deferred")
  case .purchasing:
    print("transactionState = purchasing")
  case .purchased:
    print("transactionState = purchased")
    SKPaymentQueue.default().finishTransaction(transaction)
    SKPaymentQueue.default().remove(self)
    var receiptBase: String = ""
    if let receiptURL = Bundle.main.appStoreReceiptURL {
      do {
        let receipt = try Data(contentsOf: receiptURL)
        let base64encodedReceipt = receipt.base64EncodedString()
        receiptBase = base64encodedReceipt
      } catch {
        receiptBase = ""
      }
    }
    //call api for add consumable to user
    buyCreditDelegate?.purchasedCredit(transactionId: transaction.transactionIdentifier ?? "", receiptId: receiptBase)
  case .failed:
    SKPaymentQueue.default().finishTransaction(transaction)
    SKPaymentQueue.default().remove(self)
    if let delegate = self.buyCreditDelegate {
      delegate.cancelPurchases()
    }
  case .restored:
    print("transactionState = restored")
}

仅供参考:我的iAP是消耗品。

我怎么能解决它并抱歉我的英语不好

ios swift xcode in-app-purchase
2个回答
0
投票

整个删除此行:

SKPaymentQueue.default().remove(self)

你需要你的观察者成为一个永久的持久对象,比如app delegate。切勿将其取下或商店无法与您交谈。


0
投票

你可以实现:

func paymentQueue(_ queue: SKPaymentQueue, shouldAddStorePayment payment: SKPayment, for product: SKProduct) -> Bool {

}

更多关于Apple的信息

当用户在App Store中启动应用内购买时,将调用此委托方法,并在您的应用中继续进行交易。具体来说,如果您的应用已安装,则会自动调用该方法。

如果用户在App Store中启动应用内购买时尚未安装您的应用,则用户会在应用安装完成后收到通知。当用户点击通知时调用此方法。否则,如果用户手动打开应用程序,则仅在购买开始后不久打开应用程序时才会调用此方法。

© www.soinside.com 2019 - 2024. All rights reserved.