我有两个每月和每年(ios)的自动更新订阅。当我使用新的新鲜沙箱用户时,我可以购买。尽管我必须输入三次密码。这是流程:
- 点击订阅
- 输入密码
- 提出再次输入密码
- 获取"无法连接到iTunes Store"错误
- 再试一次并输入密码
- 购买成功。
继续前进,因此,一旦成功,我现在就会订阅,我的UI通过AppDelegate中的听众进行了更新,该听众发布了我订阅的通知。但是,当我尝试将订阅从每月转换为每年,反之亦然时,它总是会给我"无法连接到iTunes Store"错误。没有UI更新。这是流程:
- 点击其他订阅
- 提示输入iTunes密码
- 接收"确认购买"对话框,其中指出我正在修改我的订阅
- 点击继续
- 接收"您全部设置"成功警报。
- 解雇警报
- 接收"无法连接到iTunes商店"错误
- 我的听众没有打电话,UI未更新,等等。
但是,如果我解散错误并再次点击订阅,我会收到一个警报,即即使丢弃了错误,我的听众也没有接受更改。
我正在使用firebase。我遵循了Revenuecat文档中的Quickstart和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(购买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")
}
})
}
因此,这个实际上相对容易回答,但是答案是不令人满意的。
升级和交叉分级在沙箱中不起作用。
在这种情况下,几乎总是返回此错误。好消息是,它在生产上工作,并正确跟踪所有情况。
,这就是所有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,我可以在需要时更新答案,并提供有关发生的事情的更多信息。