应用内购买失败,每当我收到“无法连接到iTunes Store”且交易状态返回失败时,

问题描述

我们一直在使用RevenueCat进行IAP自动续订。我们已经正确遵循了RevenueCat集成指南,并且能够通过沙盒测试仪成功测试某些设备的IAP订阅并导致某些设备失败。 IAP成功/失败的情况是50/50。

这不像沙盒测试用户的IAP失败,在生产版本中IAP也多次失败。

如果您检查我们为当前应用所做的代码实现,这将很有帮助。

AppDelegate.swift

Purchases.debugLogsEnabled = true
Purchases.configure(withAPIKey: PURCHASE_APIKEY,appUserID: UIDevice.current.identifierForvendor?.uuidString)

PremiumController->会显示产品列表,用户可以从中选择特定的套餐并订阅该套餐。

var selectPackage: Purchases.Package?   // Selected package reference - the package which is selected by user



// Listing of all offerings which will be displayed to user and user will select an offering from this list
        Purchases.shared.offerings { [weak self] offerings,error in
            if let pack = offerings?.current?.availablePackages {
                self?.packages = pack
                
                for i in pack {
                    if i.packageType == .annual {
                        self?.selectPackage = i
                        break
                    }
                }
                
                self?.tableView.reloadData()        // Products listing
            }
        }



// Function to purchase the package
        if let package = selectPackage {
            purchasePackage(package)
        }


    func purchasePackage(_ package: Purchases.Package) {
        if Purchases.canMakePayments() {
            Purchases.shared.purchasePackage(package) { [weak self] transaction,purchaserInfo,error,userCancelled in
                if let error = error {
                    alertError(error.localizedDescription)      // Error alert will be displayed
                    return
                }
                
                if let info = purchaserInfo?.entitlements.all["powermove.pro"],info.isActive,let date = purchaserInfo?.latestExpirationDate {
                    Settings.expiresDateStr = date.toUTCSubscriptionString
                    
                    dispatchQueue.main.async {
                        let alert = UIAlertController(title: "Success",message: nil,preferredStyle: .alert)
                        alert.addAction(UIAlertAction(title: "OK",style: .default,handler: { action in
                            dispatchQueue.main.async {
                                self?.back()        // this is kind of callback function which will be called to update UI
                            }
                        }))
                        self?.present(alert,animated: true)
                    }
                }
            }
        }
    }

我们已经调试了代码,并发现了何时

storeKitWrapper:(RCStoreKitWrapper *)storeKitWrapper     updatedTransaction:(SKPaymentTransaction *)transaction

调用transaction.transactionState返回为SKPaymentTransactionStateFailed

我们遇到错误-> “无法连接到iTunes Store” 。下面是一些日志语句。

2020-10-19 18:06:40.657001+0530 Strong Consumer[37652:7035479] [Purchases] - DEBUG: GET /v1/subscribers/069A0745-1204-4079-8D7D-D14E95211998
2020-10-19 18:06:40.657370+0530 Strong Consumer[37652:7035479] [Purchases] - DEBUG: Offerings cache is stale,updating caches
2020-10-19 18:06:40.657607+0530 Strong Consumer[37652:7035479] [Purchases] - DEBUG: GET /v1/subscribers/069A0745-1204-4079-8D7D-D14E95211998/offerings
2020-10-19 18:06:40.663777+0530 Strong Consumer[37652:7035479] [Purchases] - DEBUG: PaymentQueue removedTransaction: monthly_5.99 AB64AECB-94AD-45CA-B836-65D0D6EC6D0C ((null) Error Domain=SKErrorDomain Code=0 "Cannot connect to iTunes Store" UserInfo={NSLocalizedDescription=Cannot connect to iTunes Store}) {
2020-10-19 18:06:40.664062+0530 Strong Consumer[37652:7035479] [Purchases] - INFO: Subscriber attributes synced successfully

解决方法

从日志中,您将从Apple获得SKErrorUnknown(代码0)。不幸的是,您无法在生产中解决这些问题。这可能是用户的Apple帐户有问题,或者是Apple的内部问题。

Apple文档:https://developer.apple.com/documentation/storekit/skerrorcode/skerrorunknown

,

我也面临着同样的问题。似乎带有Development和Ad Hoc证书的内部版本存在此问题。我将内部版本上传到TestFlight。并且工作正常。