沙盒中的自动续订订阅永不过期

Auto-Renewable Subscription never expires in Sandbox

我已经使用 StoreKit 在我的应用中成功实现了自动续订订阅(应用内购买)。我仍处于开发模式,所以我正在使用沙箱用户进行测试。使用沙盒环境订阅每月订阅后,我可以访问 "premium content"。我使用 UserDefaults 来指示用户已购买产品。我还没有实施收据验证。

我的问题是订阅永远不会过期,因为我可以随时访问高级内容,在订阅过期后,即最多。 30 分钟,假设续订在测试模式下以更快的速度发生(6 * 5 分钟)

我的问题:如果我们将购买的产品存储在 userDefaults 中,自动续订订阅是否会过期?我是否必须使用收据验证才能使自动续订订阅过期?

private func productPurchaseCompleted(identifier: ProductID?) {
        guard let identifier = identifier else { return }

        purchasedProductIDs.insert(identifier)
        UserDefaults.standard.set(true, forKey: identifier)
        productPurchaseCompletionHandler?(true, identifier)
        clearHandler()
    }

确定用户的订阅是否仍然有效的唯一方法是通过收据验证。

  1. 执行此操作的最佳方法是将收据文件存储在您的服务器上,并使用 Apple 的 /verifyReceipt 端点定期刷新它以查看是否有任何更改。 (有关详细信息,请参阅 iOS Subscriptions Are Hard)。

  2. 如果您只是在寻找快速而肮脏的东西,您可以在本地进行验证,并将订阅的到期日期存储在用户默认值中。启动时检查设备时间是否在到期日期之前。如果设备时间在到期日期之后,您只需要重新验证以检查订阅是否续订。

第二种方法是不安全的,non-scalable 使用订阅的方法,但它会 "work" 用于一个小的副项目。推荐的方法是通过#1 中提到的 server-side 收据验证和状态跟踪。