我已经在Apple的Receipt Validation Programming Guide的帮助下使用OpenSSL和asn1c编译器在设备上本地实现了收据验证 . 我的应用程序仅支持iOS 7及更高版本 .
根据Apple推荐,我致电 [[NSBundle mainBundle] appStoreReceiptURL]
获取应用商店收据 . 当应用程序在显示任何UI之前启动'first'时,我也会执行此操作 . 首次启动呼叫是必需的,因为如果第一次尝试不在那里,Apple建议刷新收据 . 作为此调用的结果( SKReceiptRefreshRequest
),应用程序会要求用户输入其iTunes登录信息 .
现在问题是Apple一直拒绝该应用程序说我正在调用他们的 生产环境 服务器而不是沙盒服务器 . 但根据我对“收据验证编程指南”的理解,只有在您使用第二种验证方法并通过您自己的安全服务器向Apple发送数据时才有效 . 然而,我在本地做所有事情,并且对于如何区分 生产环境 环境和沙盒环境非常困惑,以便我的应用程序可以通过审核 .
任何指针或建议都会非常有用 .
5 回答
好的,这就是对我有用的东西,苹果公司在经过多轮审查上诉和重新提交的申请后,昨晚批准了该应用程序,这个申请已经持续了近一个月 .
在应用启动时不要尝试刷新收据,也不要阻止用户界面 . 我所做的是在发现收据之前没有显示任何UI,所以当在启动时提示输入iTunes密码时,取消将显示应用程序的限制版本,输入正确的密码将尝试下载新收据并采取行动根据是否找到一个 .
所以在发布时如果您发现收据很好,如果没有,请不要尝试刷新它 .
但是,当用户按下Restore Purchases选项时,请刷新它 .
希望这可以帮助 .
我删除了之前的回复,我误解了这个问题 .
老实说,我相信你做的一切都是正确的,而苹果对自己的指导方针感到困惑 . 毕竟,在“收据验证编程指南”中,他们明确建议:"If validation fails in iOS, use the SKReceiptRefreshRequest class to refresh the receipt"并且无法影响此调用的服务器(SKReceiptRefreshRequest reference)
根据http://asciiwwdc.com/2013/sessions/308,调用什么服务器取决于应用程序的签名方式,显然需要在提交时签名 生产环境 .
生产环境 环境和沙箱环境之间的区别取决于您调用的链接 .
ITMS_PROD_VERIFY_RECEIPT_URL是 生产环境 服务器 . ITMS_SANDBOX_VERIFY_RECEIPT_URL是沙盒服务器 .
确保从Apple配置门户创建正确的配置证书 . 了解Ad-Hoc与分布之间的区别 .
当您使用从iTunes Connect创建的Test iTunes用户帐户购买时,您必须在 sandbox server 下进行测试 . 在 Code Signing Identity 的 Release 下,您应该选择 Ad-Hoc provisioning 而不是 distribution provisioning .
但是当您要发布到应用商店时,您必须选择 distribution provisioning 以及 production server (ITMS_PROD_VERIFY_RECEIPT_URL) . 您无法在此服务器上使用测试用户帐户 . 您将不得不使用真实的iTune用户帐户购买它(在Apple批准之后)进行真正的购买 .
要了解如何在本地实施IAP并在本地验证收据,请学习: - 1. http://www.raywenderlich.com/21081/introduction-to-in-app-purchases-in-ios-6-tutorial
您可以在此处下载完成的示例项目: - 3. http://cdn1.raywenderlich.com/downloads/InAppRagePart2Finished.zip
NOTE: 可能还有另一种验证我不知道收据的方法 .
我发现了一些可能有用的东西: - 1. https://developer.apple.com/library/ios/documentation/StoreKit/Reference/SKReceiptRefreshRequest_ClassRef/SKReceiptRefreshRequest_ClassRef.pdf
它说"In the production environment, set this parameter to nil."属性在测试环境中,新收据应具有的属性 . 有关键,请参阅“收据属性”(第4页) . 在 生产环境 环境中,将此参数设置为nil .
如果收据无效或不存在,则显示输入用户psw的对话框 .
所以 RATHER 然后在开头询问psw如果收据不存在(因为用户困惑bcs他只是启动应用程序并且它没有理由请求) PROVIDE 恢复btn,你必须提供 ANYWAY 和w8,直到你收到你可以的收据合理地变化 .
所以将刷新代码放入if语句中:
我想分享一下我的经历 . 删除应用程序后,我一直在使用Sandbox和应用程序收据丢失 . (然后重新命令-R-ing)我不知道这是否会在 生产环境 中发生,但它听起来好像它 . 在第一次应用程序启动时要求刷新,并提示用户输入密码令人吃惊 . 当然,这是一个问题 .
看起来好像
[[SKPaymentQueue defaultQueue] restoreCompletedTransactions]
也会在没有弹出对话框的情况下静默刷新应用收据 . 意思是,在事务恢复后,要求appReceiptURL数据返回非零值 . 这只是我的短期测试 . 请自己做测试 .