我对我们的应用内购买流程有疑问,因为它被苹果拒绝了。
因为我们不知道用户是否具有有效的订阅,我们必须首先获取收据,这将导致Itunes Store密码提示(这是正常的行为,因为我们在非生产环境中正确理解)。然后进行验证,并根据结果显示自动更新订阅页面,或者我们通过请求的操作。
我们的流程是:
获取收据
验证收据
如果
有效-通过请求的操作
无效-显示自动续订的订阅页面,用户可以在其中进行应用内购买
现在,Apple在拒绝中评论说,他们没有看到自动更新订阅页面,而是从iTunes Store获得了密码提示。
正如我们正确理解的那样,密码提示是在非生产环境中的正常行为,但苹果似乎并不期望这种行为。我们在获取收据的方式上没有任何改变。
为了方便处理,我们使用SwiftyStoreKit。这是我们的代码:
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)
}
}
我们的流程是否不正确?或者如何在不获取收据的情况下验证用户是否具有有效的订阅?我们在这里有点困惑。有人可以在这里给我们任何建议吗?
答案 0 :(得分:1)
您的电流并不能提供很好的用户体验;他们会启动您的应用程序,并显示iTunes帐户密码提示,但不显示其出现原因。
我建议您采用类似于以下内容的过程:
或者,在尝试刷新本地收据之前,请检查其是否存在。如果收据不存在,则很可能会提示用户输入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
}