我正在为我的应用(即将发布)实施应用内购买,并为 iOS6 和 iOS7 提供支持。我的问题与 iOS6 和 iOS7 之间的非续订订阅机制之间的差异有关,更具体地说,是关于如何实现恢复。为了同时适应 iOS6 和 iOS7,我实现了一个服务器端解决方案来启用恢复。我可以选择允许用户创建一个用户名/密码,该用户名/密码可用于不同的设备(如果数据丢失,则为同一设备)进行恢复。我的大部分工作基本上都在工作,但是随着我的测试的进行,我发现了一些奇怪的东西。
我的 iOS7 恢复过程的初始部分使用 SKReceiptRefreshRequest 来刷新应用程序中的收据。当我从 iOS7 设备上删除应用程序时,重新安装(此时没有收据;使用 iExplorer 测试)并进行恢复,SKReceiptRefreshRequest 恢复 10 次购买(我在测试期间为这个特定用户创建的) . 其中一张是非消耗品,九张收据是不可更新的。这让我很困惑。从 Apple 文档中,我只希望在刷新的收据中看到非消耗品购买。来自https://developer.apple.com/library/ios/releasenotes/General/ValidateAppStoreReceipt/Chapters/ValidateLocally.html:
“消耗品和非续订订阅:在购买时将消耗品或非续订订阅的应用内购买收据添加到收据中。它会保存在收据中,直到您的应用完成该交易。在那之后,它会在下次更新收据时从收据中删除 - 例如,当用户进行另一次购买或您的应用显式刷新收据时。”</p>
关于非续订订阅,来自https://developer.apple.com/in-app-purchase/In-App-Purchase-Guidelines.pdf:
使用 iCloud 或您自己的服务器来跟踪购买并允许用户将购买的订阅恢复到单个用户拥有的所有 iOS 设备
有人有任何见解吗?
问题:为什么 SKReceiptRefreshRequest 会在收据中留下非续订产品的购买?这是 Apple 文档中的错误还是发生了其他事情?
2014 年 2 月 23 日;更新:我最近向 Apple 提交了一份错误报告。还没有回音。虽然,实际上,我不希望这个“错误”消失!
2015 年 10 月 20 日;更新:看来苹果实际上已经解决了这个“错误”。现在,当我使用SKReceiptRefreshRequest
(这似乎是 Apple 推荐的还原方法,请参阅https://developer.apple.com/library/ios/documentation/NetworkingInternet/Conceptual/StoreKitGuide/Chapters/Restoring.html)进行恢复时,我现在没有收到收据中显示的非续订订阅购买。我只得到非消耗品(我的应用只有非续订订阅和非消耗品购买)。在我写完这篇文章后,我将立即向 Apple 提交一份错误报告,因为他们的文档对预期的行为模棱两可。
到目前为止,我对此的测试包括我在 iOS 8.4 和 iOS9 上运行的应用程序(实际上是 9.1 测试版,因为我没有合适的设备运行生产版本),所以这似乎是 Apple 的服务器端更改,而不是严格说 iOS/设备方面的变化。另请注意,到目前为止,我的所有测试都是在我的应用程序的开发版本上进行的,在应用程序内购买沙箱中也是如此。我很快就会进行生产测试。
2015 年 12 月 3 日;更新; 在 Apple 技术支持的提示下,我进行了更多测试。这一次,在运行 iOS9.2 beta 4 (13C75) 的 iPad 上。看来我们现在已经恢复“正常”了,不再订阅了。也就是说,当我进行恢复时,我再次在收据中看到非续订订阅。