(iOS + StoreKit)我可以在沙箱中检测吗?

我有应用程序内购买工作得很好,我要去服务器validation路线。 服务器需要知道我是否在沙箱中,所以现在我只是发送一个“&sandbox = 1”参数。 当然,当完整版本的应用程序出来,我不会发送这个参数。

我宁愿在我的应用程序中没有这个硬编码,因为这将使testing在未来变得困难,在将构build提交给Apple之前要记住更改一个(大的)事项。

有没有办法,我可以问StoreKit,如果我在沙箱中,那么我可以确定是否需要将此参数发送到我的服务器? 另外,还有没有其他的最佳做法来处理服务器validation?

更多的思考,我应该只是让服务器总是先检查现场系统,然后沙箱? 如果苹果的ID在live和sandbox系统之间隔离,那么它会不会有什么坏处呢?

谢谢。

经过一番挖掘,我发现苹果的技术说明TN2259 :

如何validation我的收据(iOS)?

请始终使用生产urlvalidation您的收据; 如果您收到21007状态码,请继续使用沙盒url进行validation。 遵循这种方法可确保您的应用程序在沙箱中进行testing或查看或在App Store中生效时不必在URL之间进行切换。

所以看起来我应该完全斧头&sandbox参数,只是这样做。 我真的不得不挖掘这个答案,所以我把它张贴在这里,希望别人跑过去!

我遇到了同样的问题,我的应用程序被拒绝,因为我提交的应用程序的“生产”版本被硬编码连接到我的服务器上的PHP脚本,validation与真实AppStore服务器的收据(而我的开发版本指向另一个validation沙箱服务器收据的PHP脚本)。 然而,经过与苹果工程师的几次交stream之后,我发现他们使用沙箱用户帐户来testing提交的应用程序,这就解释了为什么他们得到了一个错误。

而不是有条件地构build我的应用程序来指向一个脚本或另一个脚本,我将使用一个脚本来首先尝试生产服务器,然后如果它接收到21007状态代码,则会退回到沙盒服务器,如上所述!

非常感谢!

请始终使用生产urlvalidation您的收据; 如果您收到21007状态码,请继续使用沙盒url进行validation。

不幸的是,技术说明没有提到这只适用于自动续订订阅!

由于“ 应用内购买编程指南”在表7-1中提到:

重要此处的非零状态代码仅适用于恢复有关自动续订订阅的信息。 testing其他types产品的响应时不要使用这些状态码。

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

如果您被迫使用不续订并实现您自己的订阅到期逻辑,一个可能的解决scheme是将您的应用程序版本一起发送到您的服务器,并跟踪目前正在开发的版本,因此您可以redirect到sandbox.itunes服务器以在适当的时候validation收据,并模仿订阅的x分钟到期时间(如sandbox.itunes用于自动更新)以便在您的服务器上进行开发。