在macOS沙箱环境中购买自动续订订阅后,收据不会更新

时间:2016-11-28 13:03:39

标签: objective-c in-app-purchase storekit macos-sierra receipt

我正在尝试实现StoreKit能够在我的macOS应用程序中自动续订订阅。

在阅读了几十页并查看示例之后,我了解了所有内容是如何组合在一起的,但未能使其正常工作。

我想做什么:

  1. 应用程序启动后,立即通过评估本地收据来检查是否有可用的订阅。我特意检查收据的In-App Purchase field entries中的任何一个取消日期是否不可用,以及订阅的到期日期是否在将来。
  2. 如果没有(有效)订阅,我可以使用StoreKit的API购买订阅。
  3. 这两种方案都运行正常,因为当第一次购买订阅时,此流程完美运行。但是,在订阅到期日期结束后,收据不会自动更新。我希望此收据能够定期更新,如Auto-renewing subscription and app receipt所示。因此,上述第一步失败是因为某个时刻的失效日期在历史记录中,因此被视为过期。

    我发现奇怪的两件事:

    • 我的SKPaymentTransactionObserver实例仅在购买订阅后被调用(在用户明确购买之后)。订阅到期时永远不会被调用,并且应该自动续订(如上面的博文所示);
      • 使用SKReceiptRefreshRequest API明确询问我的收据(包含IAP的到期日期),通过调用它的请求失败:didFailWithError:delegate方法。错误对象是nil所以我看不出为什么它更新失败。

    我可以共享代码,但我感觉这与代码无关,而是某种项目/环境设置和/或我无法完全获得的行为。

    您有什么建议尝试吗?

1 个答案:

答案 0 :(得分:0)

经过几天的实验后,我改变了机制,使用https://developer.apple.com/library/content/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html#//apple_ref/doc/uid/TP40010573-CH104-SW1中记录的服务器端验证。显然,这需要在某个地方运行Web服务,并使您的环境变得更加复杂,但至少事情以更稳定(和安全)的方式工作。