我在我的应用中实现了自动续订。默认情况下,应用会尝试使用生产URL处理收据,如果代码返回27001,则应用将使用沙盒URL。因此,如果我从XCode运行应用程序,并且在iPhone设置(iTunes / AppStore)中指定了沙箱帐户,则应用程序将尝试第二次尝试加载沙箱的产品详细信息,并成功完成。由于产品数组不为空,因此我可以在确认提示后购买订阅。看起来代码工作正常,但并非在所有情况下都能正常工作。
App Review Team执行以下操作:他们从设备设置中的real和sandbox帐户注销。在这种情况下,如果他们运行应用程序,则应用程序会显示登录提示,因为在ViewController应用程序中会检查订阅状态。他们按取消。接下来,他们转到BuySubscriptionViewController并再次按“取消”。因此,此时产品数组为空,无法购买产品。
我添加了以下条件:
@IBAction func buySub(_ sender: Any) {
if (product_mysub != nil) {
StoreManager.shared.buy(product: product_mysub)
} else {
requestData()
}
}
因此,如果找不到产品,我要询问用户是否尝试购买该产品。
func requestData() {
let receiptManager: ReceiptManager = ReceiptManager()
receiptManager.startValidatingReceipts()
}
来自ReceiptManager.swift:
func startValidatingReceipts() {
do {
_ = try self.getReceiptURL()?.checkResourceIsReachable()
do {
let receiptData = try Data(contentsOf: self.getReceiptURL()!)
self.validateData(data: receiptData)
print("Receipt exists")
} catch {
print("Not able to get data from URL")
}
} catch {
guard UserDefaults.standard.bool(forKey: "didRefreshReceipt") == false else {
print("Stopping after second attempt")
return
}
UserDefaults.standard.set(true, forKey: "didRefreshReceipt")
let receiptRequest = SKReceiptRefreshRequest()
receiptRequest.delegate = self
receiptRequest.start()
print("Receipt URL Doesn't exist", error.localizedDescription)
}
}
如果用户再次点击按钮,则应用程序不会要求他再次登录并获取有关产品的数据。如果用户第三次点击按钮,则应用会显示确认提示以购买产品。输入电子邮件和密码后如何在不要求用户按两次按钮的情况下继续购买流程?
extension ReceiptManager: SKRequestDelegate {
func requestDidFinish(_ request: SKRequest) {
// this func is not executed after entering account details in the prompt and pressing OK
}
func request(_ request: SKRequest, didFailWithError error: Error) {
print("Error refreshing receipt", error.localizedDescription)
}
}