Ios 苹果应用内购买和收据刷新

Ios 苹果应用内购买和收据刷新,ios,in-app-purchase,tvos,receipt-validation,Ios,In App Purchase,Tvos,Receipt Validation,我有一个附带项目,我最近在我的收据管理器上工作,使其更强大,更依赖于应用程序的收据,而不是在交易后持续存储价值 然而,有两个要点,尽管我在网上阅读了苹果文档和其他答案,但我仍然感到困惑: 1。当用户恢复购买时,收据是否会刷新? 我在sandbox中做了几次测试,我发现在恢复时,收据会被刷新,当我通过iTunes服务器验证验证收据时,它会返回一个JSON,其中包含最新的事务。这非常有用,因为即使我关闭/打开应用程序,应用程序回执也会更新,并且我可以随时验证它,而无需刷新它。 然而,在生产中,这并没

我有一个附带项目,我最近在我的收据管理器上工作,使其更强大,更依赖于应用程序的收据,而不是在交易后持续存储价值

然而,有两个要点,尽管我在网上阅读了苹果文档和其他答案,但我仍然感到困惑:

1。当用户恢复购买时,收据是否会刷新?

我在sandbox中做了几次测试,我发现在恢复时,收据会被刷新,当我通过iTunes服务器验证验证收据时,它会返回一个JSON,其中包含最新的事务。这非常有用,因为即使我关闭/打开应用程序,应用程序回执也会更新,并且我可以随时验证它,而无需刷新它。 然而,在生产中,这并没有起作用。恢复购买后,应用程序收据未刷新,我的用户被要求连续恢复购买。有人能回答这一点吗

2。刷新收据请求是否会触发警报,要求在生产过程中输入Apple ID的密码?

从上一点来看,我认为可以,我将在用户恢复其购买后强制刷新收据。然而,在development/sandbox中,每当我尝试刷新收据时,我都会被要求插入我的sandbox用户通行证(尽管在要求刷新之前,我可以在没有密码请求的情况下恢复购买)。我读了很多关于这方面的文章,有人说这可能不会在生产中发生。你们有人对此有澄清吗

注: 我知道,当恢复/购买时,我会收到带有收据的交易,但是,我需要使用应用程序收据来验证交易(这也是苹果说要做的)

提前谢谢。

1。刷新收据 从理论上讲,调用恢复购买应该得到最新的收据。在遇到问题的情况下,请查看
SKReceiptRefreshRequest
。通常,当恢复购买的调用遇到错误时,我会在生产中使用它

明智地使用它,触发该API可以导致显示应用商店的登录提示

2.何时要求用户登录? 可悲的是,我看到了这种变化,所以我不能给出一个明确的答案。通常情况下,恢复购买的呼叫不应触发登录。明确使用
SKReceiptRefreshRequest
will

如果用户未登录商店,则调用任何商店API(如尝试购买或恢复购买)都可能触发登录流

苹果怎么说 从

刷新收据不会创建新交易;它从应用商店请求收据的最新副本。只刷新收据一次;在一行中多次刷新具有相同的结果。 恢复已完成的事务为以前完成的每个事务创建一个新事务,实质上是为事务队列观察者重放历史记录。您的应用程序保持自己的状态,以跟踪恢复已完成事务的原因以及如何处理这些事务。多次还原会为每个已完成的事务创建多个已还原的事务

我的推荐
  • 存储上次在设备上使用的收据的哈希值。您可以使用此哈希来检查最新的收据,以便知道是否有任何更改。无论何时应用程序恢复,您都可以检查当前收据哈希是否与上次缓存的值不同
  • 试着尽快提交收据。通常在应用程序启动时
  • 如果用户试图手动恢复购买,我将首先调用
    restoreCompletedTransactions
    。这可能会触发应用商店登录,但通常不太可能。大多数情况下,这已经足够了,因为设备上的收据通常是最新的
  • 如果用户尝试另一次恢复购买,或者呼叫失败,则移动到
    SKReceiptRefreshRequest
    以保证新的接收
  • 当使用
    SKReceiptRefreshRequest
    时,我建议将其包装在UIAlertController后面。我通常会显示一些指示它失败的内容,并有一个使用请求的“重试”按钮。这将触发新店铺登录
  • 使用
    restoreCompletedTransactions
    回放设备知道的所有已完成事务

  • 当用户恢复购买时,收据是否会刷新

  • 是的,应该是这样。但听起来你也在做一些服务器端验证?如果是这种情况,您可以将用户的任何收据发送到
    /verifyReceipt
    端点以获取最新状态。您不需要发送最新的收据,因为
    /verifyReceipt
    也会刷新它

  • 刷新收据请求是否会触发警报,要求在生产过程中输入Apple ID的密码
  • 苹果公司对此没有明确的文档,但如果应用程序中没有收据文件(在生产中很少见),肯定会有。但是,如果您正在进行服务器端验证(请参见#1),那么您可以发送任何收据,而无需刷新它。因此,只有在不存在任何内容时才刷新收据,这将触发登录。请记住,在sandbox中安装后,设备上不存在收据文件-仅在购买之后。这与安装后生成收据文件的生产有很大不同

    从听起来您正试图做的事情来看,我的建议是检查启动时是否存在任何收据文件,将其发送到
    /verifyReceipt
    ,以获取用户的最新状态并缓存结果。你可以在每次应用发布时这样做

    在一个完美的世界中,您将收据存储在服务器端并保持其最新状态,但您提到了服务器端项目,因此听起来有点过头了。然而,一个出了博