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

Is it necessary to validate / refresh an app store receipt on launch in iOS?

Apple docs 收据验证表示在启动后立即执行收据验证。这相当于在 [[NSBundle mainBundle] appStoreRecieptURL] 返回的路径中检查数据,如果不存在则通过 SKReceiptRefreshRequest 刷新,并验证它。前面链接的文档同时引用了 iOS 和 macOS。

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

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

我给出的理由是:

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

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

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

虽然您可以查询收据以获取 IAP 信息,但实际上更容易(并且应用审查要求)在某个地方给 "restore previous purchases" 一个按钮并调用

[[SKPaymentQueue defaultQueue] restoreCompletedTransactions];

这也是一个更好的用户体验,用户可能会在按下 "restore purchases" 按钮时被提示输入他们的 Apple ID 和密码,而不是在应用程序启动时出现无法解释的情况。

您问题的简单答案是否,没有必要

这里有详细的解释给你。

  1. 根据 Apple 文档 here,Apple 提供了两种验证收据的方法,它们仅作为指南提供,以防止 运行 未经授权复制您的应用程序。如需更多指导,苹果已指向苹果审查指南。
  2. 在审查指南 here 中,Apple 没有提到任何与收据验证相关的内容都是强制性的。

如果收据验证是强制性的,Apple 会提供一个简单的 API 来验证它。

花絮:当涉及到应用商店收据验证时,您会看到很多拒绝。但所有这些问题都是因为收据验证没有正确完成。

但我的个人建议会与上述答案有所不同。您首先要考虑的是 "Never underestimate hackers"。除了应用程序启动之外,多次验证收据。阅读 this 文章了解更多信息。

不需要 这样做,这只是可选的,如果您有兴趣的话,可以在 iOS7+ 上完成。

简而言之,实施验证纯粹是一项 财务 决定,即使您验证了配方,也建议您不要在失败的情况下禁用内容,因为验证可能会失败标准环境以及任何时候(例如在没有连接的情况下),这种过度反应可能会破坏您的消费者体验。


总而言之,在实践中,当您被允许在失败的情况下禁用内容时,无论出于何种原因,在 OSX 上进行验证更有意义;但是,如果您觉得自己拥有的消费者比您的收入所显示的要多,或者被盗内容的数量远远超出您的利润范围,那么在 iOS 上也值得这样做。


注意: 一般来说,您可以在 Apple's Documentation.[=11 中阅读更多关于收据验证的技术细节=]

这不是必需的,但由于以下原因是有益的:

  1. 您将始终获得确定的购买产品集,无需用户手动恢复产品。

  2. 您有(有限的)欺诈保护,尤其是当您结合本地和远程验证时。

  3. 使用配方计算自动续订的到期日期更简单。