在 macOS 沙盒环境中购买自动续订订阅后收据未更新
Receipt does not get updated after purchasing an automatically renewable subscription in a macOS sandbox environment
我正在尝试实现 StoreKit 的功能,以便在我的 macOS 应用程序中自动更新订阅。
阅读几十页并查看示例后,我了解了所有内容是如何组合在一起的,但未能使其正常工作。
我想做什么:
- 应用程序启动后,立即通过评估本地收据检查是否有可用订阅。我正在专门检查收据的任何 In-App Purchase field entries 中的取消日期是否可用以及订阅到期日期是否在未来。
- 如果没有可用的(有效)订阅,我将使用 StoreKit 的 APIs 购买订阅。
这两种情况都运行良好,因为此流程在首次购买订阅时运行良好。但是,收据不会在订阅到期日期结束后自动更新。我希望这张收据能够定期更新,如 中所示。结果,上述第一步失败,因为某个时间点的过期日期在历史记录中,因此被认为已过期。
有两件事我觉得很奇怪:
- 我的 SKPaymentTransactionObserver 实例仅在购买订阅后(在用户明确购买后)被调用。它永远不会在订阅到期时被调用并且应该自动续订(如上面的博客post所示);
- 使用 SKReceiptRefreshRequest API 明确要求更新我的收据(包含 IAP 的到期日期)失败,调用它是 request:didFailWithError: 委托方法。错误对象是 nil 所以我不明白为什么它更新失败。
我可以分享代码,但我感觉这与代码无关,而是某种 project/environment 设置 and/or 我不完全理解的行为。
你有什么尝试的建议吗?
经过几天的试验,我更改了使用 https://developer.apple.com/library/content/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html#//apple_ref/doc/uid/TP40010573-CH104-SW1 上记录的服务器端验证的机制。显然,这需要某处的 Web 服务 运行 并使您的环境更加复杂,但至少事情以更稳定(和安全)的方式工作。
我正在尝试实现 StoreKit 的功能,以便在我的 macOS 应用程序中自动更新订阅。
阅读几十页并查看示例后,我了解了所有内容是如何组合在一起的,但未能使其正常工作。
我想做什么:
- 应用程序启动后,立即通过评估本地收据检查是否有可用订阅。我正在专门检查收据的任何 In-App Purchase field entries 中的取消日期是否可用以及订阅到期日期是否在未来。
- 如果没有可用的(有效)订阅,我将使用 StoreKit 的 APIs 购买订阅。
这两种情况都运行良好,因为此流程在首次购买订阅时运行良好。但是,收据不会在订阅到期日期结束后自动更新。我希望这张收据能够定期更新,如
有两件事我觉得很奇怪:
- 我的 SKPaymentTransactionObserver 实例仅在购买订阅后(在用户明确购买后)被调用。它永远不会在订阅到期时被调用并且应该自动续订(如上面的博客post所示);
- 使用 SKReceiptRefreshRequest API 明确要求更新我的收据(包含 IAP 的到期日期)失败,调用它是 request:didFailWithError: 委托方法。错误对象是 nil 所以我不明白为什么它更新失败。
我可以分享代码,但我感觉这与代码无关,而是某种 project/environment 设置 and/or 我不完全理解的行为。
你有什么尝试的建议吗?
经过几天的试验,我更改了使用 https://developer.apple.com/library/content/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateRemotely.html#//apple_ref/doc/uid/TP40010573-CH104-SW1 上记录的服务器端验证的机制。显然,这需要某处的 Web 服务 运行 并使您的环境更加复杂,但至少事情以更稳定(和安全)的方式工作。