ios - 登录后继续处理收据
问题描述
我在我的应用程序中实现了自动续订订阅。默认情况下,应用程序尝试使用生产 URL 来处理收据,如果代码返回 27001,应用程序将使用沙盒 URL。因此,如果我从 XCode 运行应用程序并且在 iPhone 设置(iTunes/AppStore)中指定了沙盒帐户,则应用程序会尝试第二次尝试加载沙盒的产品详细信息并成功执行。因为产品数组不为空,所以我可以在确认提示后购买订阅。它看起来像代码按预期工作,但并非在所有条件下。
App Review Team 执行以下操作:他们从设备设置中的真实帐户和沙盒帐户注销。在这种情况下,如果他们运行应用程序,应用程序会显示登录提示,因为在 ViewController 应用程序中会检查订阅状态。他们按取消。接下来他们转到 BuySubscriptionViewController 并再次按 Cancel。所以此时产品数组为空,无法购买产品。
我添加了以下条件:
@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)
}
}
解决方案
推荐阅读
- c# - 使用 EF 将来自 API 的数据加入 SQL 表
- python - 如何在 django CSV 导出中动态更改附件文件名?
- pandas - 获取多个数据框名称作为列表
- spring - 错误消息:org.hibernate.NonUniqueObjectException:具有相同标识符值的不同对象已与会话关联
- swift - 在 Credimax Mastercard Payment API 中创建订单和交易
- node.js - 在 express 服务的多个 react 客户端内路由
- sql - 在首选列值的同时选择唯一 ID
- php - 如何使用 Laravel 对页面进行密码保护?
- php - 此路由不支持 GET 方法 api.php
- azure - Azure 函数应用内部的 X509Certificate2 - 无法识别提供给包的凭据