iOS应用内购买收据验证 - 沙盒与生产环境URL有何不同?

6
我按照Ray Wenderlich的教程来实现应用内购买收据验证。代码直接从我的应用连接到苹果的验证服务器,而不是通过我的服务器。
在我向AppStore提交第一个二进制文件后,我测试了我的应用程序,发现应用内购买无法正常工作,因为我已将其从沙盒URL切换到生产URL。
如果AppStore审核员测试时也失败了,那么它是否会被拒绝?我阅读了这篇文章,但如果我没有使用自己的服务器,我仍然非常困惑它是否适用于我。
3个回答

12
解决方案非常简单,它在2012 WWDC的308会议中进行了解释(该视频仅限注册开发者观看)。此会议与订阅有关,但您可以将其扩展为应用内购买。
当您开发时,您会硬编码您的应用程序以使用沙盒验证收据。然后您将应用程序提交审核,您显然已将应用程序硬编码以使用生产服务器验证收据。
但是,没有任何东西可以阻止您采取以下两个步骤进行验证:
- 总是首先使用生产服务器验证收据,这将适用于您应用程序生命周期的99%。如果验证收据成功,则完成。 - 如果之前的验证失败,请使用沙盒服务器验证收据。这应该涵盖您的开发需求,当然,虚假收据也将无法通过验证。
顺便说一句,这在文档中仅针对订阅已经正式声明,如果您尝试使用生产服务器验证沙盒收据,您将获得一个特定的状态代码;还有另一个状态代码,涵盖了使用沙盒服务器验证生产收据的情况。在所有情况下,沙盒和生产的两个世界始终是分离的。
不要忘记iOS7添加了一种新的更安全的方式,可以直接从设备管理收据验证:事实上,请考虑直接从客户端(您无法完全控制的设备,例如越狱设备)进行收据验证比通过您控制的服务器进行收据验证不太安全。

感谢您的回答。是的,我假设您已经在应用程序中硬编码验证收据与生产服务器,但我读到一些人的评论说,他们的应用程序在AppStore评审员使用沙盒进行应用内购买测试后被拒绝了。无论如何,在我的第一个版本中,我决定删除验证,因为我想尽快将其发布,然后我会在下一个版本中研究您提到的iOS 7方法。 - fxfuture
在https://developer.apple.com/videos/play/wwdc2017/305/?time=2761中有解释。 - lisek

5
始终先使用生产URL验证您的收据;如果您收到21007状态代码,则继续使用沙盒URL进行验证。遵循此方法可确保在应用程序在沙盒中被测试或审核或在App Store中处于活动状态时,您无需在URL之间切换。
请注意:状态代码21007表示此收据是沙盒收据,但发送给了生产服务进行验证。
没有公共API可以调用以区分生产和沙盒环境,以便您可以提前决定使用哪个服务器。如果您已实施建议的收据验证过程,则可以在与StoreKit服务器联系的服务器上实施修复。如果验证尝试的状态代码为21007,则请在沙盒服务器上再次尝试。

1
它可能会失败。我有一个带有应用内购买的应用程序(但不是基于我的服务器,而是直接使用苹果代码),在开发中工作正常,但一旦由苹果发布就崩溃了。这是因为我没有在iTunes Connect中完成所有必要的步骤。令人惊讶的是,审核员没有发现这个问题,可能是因为他们也在沙盒环境中工作。我不确定这是否对你有所帮助,但希望有所帮助。

你在iTunes Connect中错过了哪些步骤?我遇到了完全相同的问题(应用在沙盒中运行正常,但从商店下载后无法运行)。 - dougis

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接