在iOS中,启动应用时是否需要验证/刷新应用商店收据?

17

Apple文档中关于收据验证的说明指出,在启动后立即执行收据验证。这意味着检查[[NSBundle mainBundle] appStoreRecieptURL]返回的路径中是否有数据,如果没有,则通过SKReceiptRefreshRequest进行刷新,并进行验证。上述链接的文档涉及iOS和macOS两个平台。

在iOS上是否确实需要这样做呢?如果是的话,为什么?是为了防止用户在越狱设备上使用我的应用程序,或者在没有从应用商店购买的情况下使用它(在这种情况下,我可能不关心我的应用程序是否免费)?还是它对其他操作(如恢复或验证应用内购买)有影响?例如,是否必须已经存在收据数据才能验证应用内购买的交易?

注意:我不使用应用内订阅。我有应用内购买,但在验证并在服务器端记录购买后,不再使用它们的收据。


你不需要这样做,这只是可选的,可以在iOS7+上完成;实施验证纯粹是一项财务决策,即使您进行了验证,在失败的情况下也建议不要禁用内容,因为验证也可能在标准环境中随时失败(例如,在没有连接的情况下),这可能会破坏您的消费者体验;总之,在实践中进行验证更适合在OSX上进行。 - holex
@holex,你能把这个变成一个答案吗? - Tom Hamming
没问题,我已按照您的要求完成了。 - holex
https://stackoverflow.com/questions/12738061/receipt-validation-issue-in-app-purchases-mac-store-receipt-validation-should-b - pkamb
5个回答

14

你不必这样做,这只是可选的,并且仅在iOS7及以上版本中才能完成,如果你有兴趣的话。

简而言之,实现验证纯粹是一个财务决策,即使你对菜谱进行了验证,也建议在验证失败时不要禁用内容,因为验证可能随时在标准环境中失败(例如没有连接),这样的过度反应可能会破坏你的消费者体验。


总的来说,在实践中,只有在允许在验证失败时禁用内容时,验证才更有意义;但如果你感觉你的消费者人数超出了你的收入预期或者被盗内容的数量远远超出了你的利润空间,那么在iOS上进行验证也可能是值得的。


注意:一般而言,你可以在苹果的文档中了解有关票据验证的技术细节。


你能否给我关于这个问题的建议?https://stackoverflow.com/questions/47712225/auto-renewable-subscription-wrong-time-response-sandbox-mode - Siddharth

4
你的问题的简单答案是不需要
以下是详细说明:
1、根据苹果文档这里,苹果提供了两种验证收据的方法,它们仅作为指导,以防止未经授权的应用程序副本运行。如需更多指导,请参阅苹果审核指南。
2、在这里的审核指南中,苹果没有提到与收据验证相关的强制性事项。
如果收据验证是必须的,苹果会提供一个简单的API来验证。
小贴士:当涉及到应用商店的收据验证时,你会看到很多驳回的情况。但所有这些问题都是由于收据验证未正确执行造成的。
但是,我的个人建议与以上答案不同。你需要考虑的第一件事是“永远不要低估黑客”。验证收据时要多次确认,不仅在应用程序启动时。阅读这篇文章以获取更多信息。

1
苹果本可以提供一个简单的API,但是这个“简单的API”的收据验证调用可以被修补,从而绕过。没有绝对可靠的收据验证代码,但是通过混淆逻辑可以获得良好的保护,并且这应该因应用程序而异,不为公众所知。因此,无法有苹果API。 - Vikram Rao

3

通常,您只需验证收据以防止未购买您的应用程序的用户进行盗版或者如果您正在使用自动续订订阅。

虽然您可以查询IAP信息的收据,但实际上更容易(并且应用程序审核要求)在某个地方提供“恢复先前购买”的按钮并调用该功能。

[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];

用户按下“恢复购买”按钮时可能会提示输入其Apple ID和密码,这对用户体验来说更为友好。相比之下,在应用程序启动时无任何解释的情况下进行恢复购买操作则不够清晰易懂。


2
我可以为您提供以下翻译:

我会给出以下几点原因:

  1. 如果用户使用订阅组外部的产品,他们可以更改其产品。
  2. 自动续订订阅可以在应用程序外续订。
  3. 应用程序在重新启动之前不会接收到在应用程序外发起的交易。
  4. 用户可以在当前设备上退出应用程序并使用相同的Apple ID 在另一设备上进行购买。

在我们的appDelegate:application didFinishLaunchingWithOptions中,我们初始化一个调用[[SKPaymentQueue defaultQueue] addTransactionObserver:self];的类来监视从应用程序内发起的购买。


2
这些“原因”似乎证明了为什么应该__恢复__iAP,但并没有说明为什么需要实际的收据_验证_。 - holex
“outside of your app” 是什么意思? - John Bachir
“Outside of your app” 的意思是指应用程序未在前台运行。 - iCyberPaul
这怎么可能发生?@iCyberPaul? - cvdogan
在另一台设备上的iTunes。 - iCyberPaul

0

虽然不是必须的,但有以下好处:

  1. 您将始终获得明确的已购买产品集,并且无需要求用户手动恢复产品。

  2. 您拥有(有限的)欺诈保护,特别是如果您结合本地和远程验证。

  3. 使用此方法计算自动续订订阅的到期日期更加简单。


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