4

我有两个自动续订订阅,每月和每年 (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。以下是一些代码片段:

应用委托:

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")
        }
    })
}
4

2 回答 2

9

所以这个其实是比较容易回答的,但回答却是相当不满意。

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

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

于 2019-03-02T21:57:46.937 回答
5

这就是为所有 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 ,我可以根据需要更新我的答案,并提供有关可能发生的情况的更多信息。

于 2019-03-02T18:05:22.750 回答