(iOS+;StoreKit)我可以在何时检测到我';我在沙箱里?

(iOS+;StoreKit)我可以在何时检测到我';我在沙箱里?,ios,in-app-purchase,storekit,Ios,In App Purchase,Storekit,我的应用程序内购买工作正常,我正在进行服务器验证。服务器需要知道我是否在沙盒中,所以现在我只向它发送一个“&sandbox=1”参数。当然,当应用程序的完整版本发布时,我不会发送此参数 我不希望在我的应用程序中硬编码这些内容,因为这将使将来的测试变得困难,而且在向苹果提交构建版本之前,还有一件(重要的)事情需要记住更改 是否有一种方法可以询问StoreKit我是否在沙箱中,以便确定是否需要将此参数发送到服务器?或者,是否有其他处理服务器验证的最佳实践 再想一想,我是否应该让服务器总是先检查实时系

我的应用程序内购买工作正常,我正在进行服务器验证。服务器需要知道我是否在沙盒中,所以现在我只向它发送一个“&sandbox=1”参数。当然,当应用程序的完整版本发布时,我不会发送此参数

我不希望在我的应用程序中硬编码这些内容,因为这将使将来的测试变得困难,而且在向苹果提交构建版本之前,还有一件(重要的)事情需要记住更改

是否有一种方法可以询问StoreKit我是否在沙箱中,以便确定是否需要将此参数发送到服务器?或者,是否有其他处理服务器验证的最佳实践

再想一想,我是否应该让服务器总是先检查实时系统,然后再检查沙箱?如果apple ID在live和sandbox系统之间隔离,那么它不会造成任何伤害,是吗


谢谢。

经过一番挖掘,我从苹果公司找到了这个:

如何验证我的收据(iOS)

始终首先使用生产URL验证您的收据;如果您收到21007状态代码,请继续使用沙箱URL进行验证。遵循此方法可确保您的应用程序在沙箱中进行测试或审核或在应用商店中运行时,不必在URL之间切换


所以看起来我应该完全删除
&sandbox
参数,然后这样做。我真的必须挖掘这个答案,所以我把它贴在这里,希望其他人能看到它

我遇到了同样的问题,我的应用被拒绝,因为我提交的应用的“生产”版本被硬编码为连接到我服务器上的PHP脚本,该脚本使用真实的AppStore服务器验证收据(而我的开发构建指向另一个使用沙盒服务器验证收据的PHP脚本)。然而,在与苹果工程师进行了几次交流之后,我发现他们使用沙盒用户帐户来测试提交的应用程序,这解释了他们为什么会出错

我不会有条件地构建指向一个脚本或另一个脚本的应用程序,而是使用一个脚本,首先尝试生产服务器,然后在收到21007状态代码时返回沙盒服务器,如上所述

非常感谢

始终首先使用生产URL验证您的收据;如果收到21007状态代码,请继续使用沙盒URL进行验证

不幸的是,技术说明没有提到这仅对自动续订订阅有效

如下表7-1所述:

重要信息:此处的非零状态代码仅在恢复有关自动续费订阅的信息时适用。在测试其他类型产品的响应时,不要使用这些状态代码

对于非续订订阅,生产服务器不返回状态代码,而是返回正确的收据


如果您被迫使用非续费并实施自己的订阅过期逻辑,一个可能的解决方案是将您的应用程序版本发送到服务器,并跟踪当前正在开发的版本,这样您就可以重定向到sandbox.itunes服务器,以在适当的情况下验证收据,并模拟订阅的x分钟过期时间(就像sandbox.itunes用于自动续订一样),以便在您的服务器上进行开发。

中对此进行了讨论。时间:24:13这是一个绝对的关键点,gr,谢谢你的旗帜。请注意,21008和21006也可能相关。当然,最好的解决办法就是寻找任何错误(即缺乏“成功条件”)。“在验证服务器上的收据时,服务器需要能够处理从苹果测试环境获取收据的生产签名应用程序。推荐的方法是,生产服务器始终首先根据生产应用商店验证收据。如果验证失败,错误代码为“生产中使用的沙盒收据”,请改为针对测试环境进行验证。“()另外,它看起来像:不要特别依赖于该代码:一个为未来访问者节省一点时间的注释:的确,一些文档显示了一个状态代码表,据推测这些代码只用于订阅验证,但苹果公司特别推荐使用此代码,如本答案中的链接所示。所以21007应该是安全可靠的。注释已移至此处: