Apple IAP 订阅续订检测(iOS7+ 收据)

Apple IAP Subscription Renewal Detection (iOS7+ receipts)

首先,这个问题与 iOS7+ 收据有关,因此 SO 上所有涉及 latest_receiptlatest_receipt_info 的 questions/answers 都不适用(因为它们有已被弃用并正在消失)。似乎关于在 SO 上续订订阅的大部分知识库来自 2011 年和 2012 年,因此具有误导性并为当前规范提供了不正确的信息。

我知道我用户的当前订阅何时到期。我想知道他们是否更新了它。根据 Apple 续订时的说法:

After a subscription is successfully renewed, Store Kit adds a transaction for the renewal to the transaction queue. Your app checks the transaction queue on launch and handles the renewal the same way as any other transaction. Note that if your app is already running when the subscription renews, the transaction observer is not called; your app finds out about the renewal the next time it’s launched.

这一切都说得通。所以现在苹果没有解决的一个明显问题是,如果用户没有关闭应用程序并重新启动它(这会导致 StoreKit 向应用程序发送交易以进行处理),我如何确定订阅是否已续订?如果用户长时间打开应用程序,将不会收到交易,但我无法继续提供内容,因为到期日期已过。理论上,用户可以离开应用程序 运行 几个月而无需重新启动。

答案是打电话[NSBundle mainBundle].appStoreReceiptURL自己去取收据然后验证吗?这会提供更新的收据吗?然后,当事务在下次启动时从 StoreKit 队列到达时,只需再次处理同一张收据(因为没有真正的方法可以忽略它)?这看起来很笨拙。如果在某些情况下我们必须自己获取收据,为什么还要费心通过队列将其发送给我们?

对正确的工作流程有什么想法吗?

如果您使用 Apple 的验证 URL 来验证设备的车载收据,JSON 响应将在键 'latest_receipt_info' 处包含一个数组,代表最新的交易列表这个苹果 ID。此列表将包括自上次更新 StoreKit 事务队列以来发生的任何续订。 IE。您可以随时从设备或您的服务器执行此操作,以了解任何 renewal/s,并且您只需要查看交易队列以了解用户最初购买订阅的情况。

这个 SO 答案对于 Apple 文档中的模棱两可的语言非常有帮助,这似乎让我们很多人感到困惑: