Ios 显示IAP页面前的收据验证
我对我们的应用内购买流程有一个问题,因为它被苹果拒绝了 因为我们不知道用户是否拥有有效的订阅,我们必须首先获取收据,这会导致Itunes Store密码提示(这是我们在非生产环境中正确理解的正常行为)。然后进行验证,并根据结果显示自动续订订阅页面或传递请求的操作 我们的流程是:Ios 显示IAP页面前的收据验证,ios,in-app-purchase,receipt-validation,Ios,In App Purchase,Receipt Validation,我对我们的应用内购买流程有一个问题,因为它被苹果拒绝了 因为我们不知道用户是否拥有有效的订阅,我们必须首先获取收据,这会导致Itunes Store密码提示(这是我们在非生产环境中正确理解的正常行为)。然后进行验证,并根据结果显示自动续订订阅页面或传递请求的操作 我们的流程是: 取款收据 确认收据 如果 有效-通过请求的操作 无效-显示用户可以在其中进行应用内购买的自动续订订阅页面 现在苹果在拒绝中评论说,他们没有看到自动续费订阅页面,而是从iTunes商店得到了密码提示 正如我们正确理解的那样
SwiftyStoreKit.fetchReceipt(forceRefresh: false) { result in
switch result {
case .success(let receiptData):
let encryptedReceipt = receiptData.base64EncodedString(options: [])
Log.info("Fetch receipt success")
//further code to send the receipt to our server
case .error(let error):
observer.send(error: error.localizedDescription)
}
}
我们的流程是否不正确,或者我们如何在不获取收据的情况下验证用户是否拥有有效的订阅?我们有点困惑。有人能给我们一些建议吗?您当前的流量并不能提供很好的用户体验;他们启动你的应用程序并看到iTunes帐户密码提示,但没有任何上下文说明其出现的原因 我建议您采用与以下类似的流程:
if let receiptDataURL = appStoreReceiptURL,
let _ = try? Data(contentsOf: receiptDataURL) {
SwiftyStoreKit.fetchReceipt(forceRefresh: false) { result in
switch result {
case .success(let receiptData):
let encryptedReceipt = receiptData.base64EncodedString(options: [])
Log.info("Fetch receipt success")
//further code to send the receipt to our server
case .error(let error):
observer.send(error: error.localizedDescription)
}
}
} else {
// Display purchase/restore interface
}
据我所知,ITunes帐户密码提示是出于安全原因在非生产环境中获取收据时的固有行为。因为我们在应用商店里已经有一个应用程序,它可以像我的代码一样获取收据,不需要密码,这是我们的理解。或者我们的说法不正确?如果用户最近没有通过商店的身份验证,iTunes帐户密码提示也可能出现在生产环境中。通常,如果在appStoreReceiptURL中找不到收据,则应显示购买/还原界面,而不是刷新该界面。我不喜欢SwifyStoreKit的方法,即在找不到收据时刷新收据。事实上,我从来没有找到我喜欢的StoreKit包装纸;他们似乎都隐藏着重要的行为,非常感谢。这是一些非常有用的信息。也许我们也应该考虑离开雨燕,这取决于你。就个人而言,我更喜欢直接编写StoreKit代码;没那么复杂。它只是基于委托而不是基于闭包。@Paulw11:订阅过期时如何处理?