我有两个自动续订的订阅,分别是每月和每年(iOS)。当我使用新的新沙盒用户时可以购买。尽管我必须输入三次密码。流程如下:
继续前进,一旦成功,就可以订阅我的UI,并通过appDelegate中的侦听器更新我的UI,该监听器发布我订阅的通知。但是,当我尝试将订阅从每月切换到每年,反之亦然时,总是出现“无法连接到iTunes Store”错误。没有用户界面更新。流程如下:
但是,如果我消除了错误并再次点击订阅,我会收到一条警报,提示我已经订阅了该计划,即使抛出了错误并且我的听众也没有接受更改。>
我正在使用Firebase。我遵循了RevenueCat文档中的快速入门和Firebase特定说明。我所有的调试日志似乎都很好,没有非200状态,没有无效的产品ID。以下是一些代码段:
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(购买界面)
@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")
}
})
}
答案 0 :(得分:4)
这就是针对所有SKError引发的通用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,我就可以根据需要更新我的答案,并提供有关可能发生的情况的更多信息。
答案 1 :(得分:4)
因此,这个答案实际上相对容易回答,但是答案却并不令人满意。
升级和跨版本在沙盒中不起作用。
在这种情况下,几乎总是返回此错误。好消息是它可以在生产环境中运行,RevenueCat可以正确跟踪所有情况。