【问题标题】:RevenueCat - Why am I getting: Error Domain=SKErrorDomain Code=2 "Cannot connect to iTunes Store"RevenueCat - 为什么我得到:错误域 = SKErrorDomain 代码 = 2“无法连接到 iTunes Store”
【发布时间】:2019-07-24 05:18:31
【问题描述】:

我有两个自动续订订阅,每月和每年 (iOS)。当我使用新的沙盒用户时,我可以进行购买。虽然我必须输入密码三次。流程如下:

  1. 点击订阅
  2. 输入密码
  3. 提示再次输入密码
  4. 出现“无法连接到 iTunes Store”错误
  5. 再试一次并输入密码
  6. 购买成功。

继续前进,一旦成功,我现在就订阅了,并且我的 UI 会通过 appDelegate 中的侦听器更新,该侦听器会发布我订阅的通知。但是当我尝试从每月切换到每年订阅时,反之亦然,它总是给我“无法连接到 iTunes Store”错误。没有用户界面更新。流程如下:

  1. 点击其他订阅
  2. 提示输入 iTunes 密码
  3. 收到“确认购买”对话框,说明我正在修改订阅
  4. 点击继续
  5. 收到“一切就绪”成功提醒。
  6. 解除警报
  7. 收到“无法连接到 iTunes Store”错误
  8. 没有调用我的监听器,没有更新 UI,等等。

但是,如果我消除错误并再次点击订阅,我会收到一条警报,指出我已经订阅了该计划,即使引发了错误并且我的听众没有收到更改。

我正在使用火力基地。我遵循了 RevenueCat 文档中的快速入门和 Firebase 特定说明。我所有的调试日志似乎都很好,没有非 200 状态,没有无效的产品 ID。下面是一些sn-ps的代码:

AppDelegate:

Purchases.debugLogsEnabled = true
Purchases.configure(withAPIKey: Constants.revenueCatKey)
Purchases.shared.delegate = self

FirebaseApp.configure()

authHandle = Auth.auth().addStateDidChangeListener() { (auth, user) in

        if let uid = user?.uid {

            Purchases.shared.identify(uid, { (info, error) in
                if let e = error {
                    print("sign in error: \(e.localizedDescription)")
                } else {
                    print("User \(uid) signed in")
                }
            })
          }
            ...
        }
    }

extension AppDelegate: PurchasesDelegate {

    func purchases(_ purchases: Purchases, didReceiveUpdated purchaserInfo: PurchaserInfo) {

        if self.currentUser != nil {

            if purchaserInfo.activeSubscriptions.contains(Constants.audiomeshSubscriptions.monthly) {
                guard let myRef = DataService.instance.REF_PRIVATE else { return }
                myRef.updateData(["plan" : "paidMonthly"]) { err in
                    if let err = err {
                        print("error updating user-private with new subscription: \(err)")
                    } else {

                        NotificationCenter.default.post(name: Notification.Name(rawValue: "purchaserInfoUpdated"), object: nil)
                    }
                }


            }
            else if purchaserInfo.activeSubscriptions.contains(Constants.audiomeshSubscriptions.yearly) {
                //do the same for yearly subscription

            }
            else {
                 //handle non-paying users here
            }
        } 
    }
}

UpgradeController(购买 UI):

@objc func purchaseButtonSelected(sender: AudiomeshButton) {
    let buttonTag = sender.tag
    guard let option = options?[buttonTag] else { return }

    let product:SKProduct = option.product

    Purchases.shared.makePurchase(product, { (transaction, purchaserInfo, error) in

        if let error = error {
            print("error making purchase: \(error)")

        } else {
                print("Purchase Successful")
        }
    })
}

【问题讨论】:

    标签: ios swift in-app-purchase revenuecat


    【解决方案1】:

    所以这个问题其实比较容易回答,但答案却很不令人满意。

    升级和跨级在 Sandbox 中不起作用。

    在这种情况下,几乎总是会返回此错误。好消息是它适用于生产环境,RevenueCat 可以正确跟踪所有案例。

    【讨论】:

    • 好的,没关系。我想我唯一剩下的问题是输入我的密码两次,收到未知错误,然后再次尝试并在第三次输入密码后成功。
    • 感谢您的回答...您能否确认这意味着在生产中运行时,交叉等级通常不会在 makePurchase 完成块中返回错误?
    • 嘿!这是正确的@BradThomas,在生产中一切都按预期工作。
    【解决方案2】:

    这是针对所有 SKErrors 抛出的通用 NSError 消息。错误代码 2 是“付款已取消”。但是,这也是在您已经订阅了某个项目时引发的错误。

    您确定要在尝试重新订阅之前让年度订阅到期吗?对于年度订阅,他们将在到期前每小时续订 6 次。

    要查看特定的 SKError,您将执行以下操作:

    if let error = error as? SKError  {
                    print("SKError - ")
                    switch error.code {  // https://developer.apple.com/reference/storekit/skerror.code
                    case .unknown:
                        print("unknown error")
                    case .paymentCancelled:
                        print("cancelled error")
                    case .clientInvalid:
                        print("client invalid")
                    case .paymentInvalid:
                        print("payment invalid")
                    case .paymentNotAllowed:
                        print("payment not allowed")
                    case .cloudServiceNetworkConnectionFailed:
                        print("cloud service network connection failed")
                    case .cloudServicePermissionDenied:
                        print("cloud service permission denied")
                    case .storeProductNotAvailable:
                        print("store product not available")
                    case .cloudServiceRevoked:
                        print("cloud service revoked")
                    }
                }
    

    一旦您知道返回的 SKError,我可以根据需要更新我的答案,并提供有关可能发生的情况的更多信息。

    【讨论】:

    • 因此,对于将一个计划更改为另一个计划,我收到了.unknown,但我确实在您的讨论区中读到您无法在沙盒环境中测试升级/降级。所以我相信它是有效的。至于新沙盒用户首次购买的测试:输入我的密码两次后(这正常吗?)我也在那里得到.unknown。但是,重新选择产品,输入我的密码(第三次)成功。
    猜你喜欢
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 2019-06-21
    • 1970-01-01
    • 2017-07-28
    • 2016-02-05
    • 1970-01-01
    • 2015-05-31
    相关资源
    最近更新 更多