iOS 7本地(在设备上)收据验证和应用内购买检查

Anu*_*eth 21 objective-c ios receipt receipt-validation

我已经在Apple的Receipt Validation Programming Guide的帮助下使用OpenSSL和asn1c编译器在设备上本地实现了收据验证.我的应用程序仅支持iOS 7及更高版本.

根据Apple的推荐,我打电话[[NSBundle mainBundle] appStoreReceiptURL]来获取应用商店收据.当应用程序在显示任何UI之前"首次"启动时,我也会执行此操作.首次启动呼叫是必需的,因为如果第一次尝试不在那里,Apple建议刷新收据.作为此调用(SKReceiptRefreshRequest)的结果,应用程序要求用户输入其iTunes登录信息.

现在问题是Apple一直拒绝该应用程序说我正在调用他们的生产服务器而不是沙盒服务器.但根据我对"收据验证编程指南"的理解,只有在您使用第二种验证方法并通过您自己的安全服务器向Apple发送数据时才有效.然而,我在本地做所有事情,并且对于如何区分生产环境和沙盒环境非常困惑,以便我的应用程序可以通过审核.

任何指针或建议都会非常有用.

Anu*_*eth 13

好的,这就是对我有用的东西,苹果公司在经过多轮审查上诉和重新提交的申请后,昨晚批准了该应用程序,这个申请已经持续了近一个月.

在应用启动时不要尝试刷新收据,也不要阻止用户界面.我所做的是在发现收据之前没有显示任何UI,所以当在启动时提示输入iTunes密码时,取消将显示应用程序的限制版本,输入正确的密码将尝试下载新收据并采取行动根据是否找到一个.

所以在发布时如果您发现收据很好,如果没有,请不要尝试刷新它.

但是,当用户按下Restore Purchases选项时,请刷新它.

希望这可以帮助.

  • 如果你提到原因,那些坚持投票答案的人会很有帮助. (2认同)

use*_*524 5

我删除了之前的回复,我误解了这个问题.

老实说,我相信你做的一切都是正确的,而苹果对自己的指导方针感到困惑.毕竟,在"收据验证编程指南"中,他们清楚地建议:"如果在iOS中验证失败,请使用SKReceiptRefreshRequest类刷新收据",并且无法影响此调用的服务器(SKReceiptRefreshRequest参考)

根据http://asciiwwdc.com/2013/sessions/308,调用什么服务器取决于应用程序的签名方式,显然需要在提交时签名生产.