【问题标题】:Apple In-App Purchase and Receipt RefreshApple 应用内购买和收据刷新
【发布时间】:2020-03-01 23:07:10
【问题描述】:

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

但是,虽然我在网上阅读了 Apple 文档和其他答案,但我仍然对以下两个要点感到困惑:

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

我在沙箱中进行了几次测试,我发现在恢复时,收据会刷新,当我通过 iTunes 服务器验证验证收据时,它会返回一个包含最新交易的 JSON。这非常有用,因为即使我关闭/打开应用程序,应用程序收据也会更新,我可以随时验证它而无需刷新它。 但是,在生产中,这不起作用。恢复购买后应用收据未刷新,我的用户被要求不断恢复购买。谁能回答这个问题?

2。刷新回执请求是否会触发要求在生产环境中输入 Apple ID 密码的警报?

从前面的观点来看,我认为可以,我会在用户恢复购买后强制刷新收据。但是,在开发/沙盒中,每次尝试刷新收据时都会要求我插入沙盒用户的通行证(尽管在请求刷新之前我可以在没有密码请求的情况下恢复购买)。我读了很多关于此的内容,有人说这在生产中可能不会发生。有没有人对此进行澄清?

注意: 我知道在恢复/购买时我会用收据取回交易,但是,我需要使用 App Receipt 来验证交易(这也是 Apple 所说的)。

提前谢谢你。

【问题讨论】:

    标签: ios in-app-purchase tvos receipt-validation


    【解决方案1】:

    1。刷新收据

    理论上,调用恢复购买应该会得到最新的收据。如果您遇到问题,请查看SKReceiptRefreshRequest。通常,当恢复购买的调用遇到错误时,我会在生产环境中使用它。

    明智地使用它,触发该 API 会导致显示 App Store 的登录提示。

    2。何时要求用户登录?

    遗憾的是,我看到了这种变化,所以我无法给出明确的答案。通常,恢复购买的调用不应触发登录。明确使用SKReceiptRefreshRequest 会。

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

    苹果怎么说

    来自docs

    刷新收据不会创建新交易;它从 App Store 请求收据的最新副本。只刷新一次收据;连续多次刷新结果相同。 恢复已完成的事务会为之前完成的每个事务创建一个新事务,实质上是为您的事务队列观察者重放历史记录。您的应用程序维护自己的状态,以跟踪它恢复已完成事务的原因以及如何处理它们。多次恢复会为每个已完成的事务创建多个恢复的事务。

    我的建议

    1. 存储您在设备上使用的最后一张收据的哈希值。您可以使用此哈希来检查最新收据,以便了解是否有任何更改。每当您的应用恢复时,您始终可以检查当前收据哈希是否与上次缓存的值不同。
    2. 尝试尽快提交收据。通常在应用启动时。
    3. 如果用户尝试手动恢复购买,我会先致电restoreCompletedTransactions。这可以触发 App Store 登录,但通常不太可能。大多数情况下,这已经足够了,因为设备上的收据通常是最新的。
    4. 如果用户尝试再次恢复购买,或者如果呼叫失败,则转至 SKReceiptRefreshRequest 以保证收到新收据。
    5. 当使用SKReceiptRefreshRequest 时,我建议将它封装在 UIAlertController 后面。我通常会显示一些表明它失败的东西,并有一个使用请求的“重试”按钮。这将触发新的商店登录。

    使用restoreCompletedTransactions 回放设备知道的所有已完成事务。

    【讨论】:

    • 感谢您的回答。不幸的是,这并不能解决我的问题(尽管您也确认刷新收据会提示用户登录请求)。对我来说,关键是要了解恢复购买后收据是否以及何时更新。在开发中,它立即刷新,在我尝试时它没有更新。在这一点上,我正在寻找一个强有力的答案。因为它没有失败,所以我没有理由刷新询问用户登录名和密码的收据。
    • 遗憾的是,没有关于此的公开文档。调用 restorePurchases 应该会触发收据被刷新。如果没有发生这种情况,您唯一的选择是使用新的 API。不确定我该如何回答只有 Apple 真正知道的问题?
    • 我能做的可能是建议您从收据刷新开始,然后尝试使用 restorePurchases?
    • @MatteoGobbi 我更新了我的建议,使我推荐的方法更加清晰
    【解决方案2】:
    1. 当用户恢复购买时,收据是否会刷新?

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

    1. 刷新回执请求是否会触发要求在生产环境中输入 Apple ID 密码的警报?

    没有明确的 Apple 文档,但如果应用程序中没有收据文件(在生产中很少见),它肯定会。但是,如果您正在执行服务器端验证(请参阅#1),那么您可以发送您拥有的任何收据,无需刷新它。因此,如果没有任何内容,您只会刷新收据,这将触发登录。请记住,在沙盒中安装后设备上不存在收据文件 - 仅在购买后。这与安装后生成收据文件的生产有很大不同。

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

    在一个完美的世界中,您将收据服务器端存储并在那里保持最新,但您提到了辅助项目,所以这听起来有点矫枉过正。但是,一个开箱即用的解决方案可以正确实现所有这些并且可以随您扩展 - 例如RevenueCat - 是另一种选择(免责声明:我在那里工作)。

    【讨论】:

    • "你不需要发送最新的收据,因为 /verifyReceipt 也会刷新它。"我在服务器端进行验证,你的意思是我可以发送我在 appStoreReceiptURL 中的任何收据?有没有相关的官方文件?
    【解决方案3】:

    经过多次测试并将我的应用发送到生产环境后,我现在可以正确回答我的问题了:

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

    是的,这对于 Sandbox 来说是直接的,但是问题是收据不包括非消耗品购买。 这意味着收据将包括购买的订阅,但您不会找到购买的非消耗性产品。 但是,当用户恢复或购买时,您会获得交易作为回报,您可以提取非消耗性产品,并将此信息存储在 UserDefaults 或 Keychain 之类的地方,以便在用户打开您的应用程序时使用它们。 其余的,最好的方法是在打开应用程序时始终验证和检查收据。

    2。刷新回执请求是否会触发要求在生产环境中输入 Apple ID 密码的警报?

    是的。肯定是第一次。

    感谢 Danielenc 的回答仍然有用。

    【讨论】:

    • 感谢您的回答。生产环境是否总是包括非消耗品采购?另外,我的沙盒测试人员(AppStore Connect 内部测试人员)现在如何测试非消耗性购买的优质内容?在我的情况下,权限是根据服务器端验证的收据设置的。在应用程序端,当我查看交易时,我会看到非消耗品购买,但有什么办法可以清理收据吗?
    • 不,prod 环境不包括从 iTunes 验证返回的收据中的非消耗性购买。但是,如果您在本地解析收据,它会这样做。
    • 我们将收据保存在后端,我会在我发送给苹果的收据中找到我有非消耗品的样本,以及在生产环境中验证的收据。所以这不可能完全正确。
    • 如果你自己解析收据,非消耗品购买就在那里。如果您将收据发送给 Apple 并取回他们经过验证的字典,则它不包含它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-12
    • 1970-01-01
    • 2019-11-01
    • 2010-11-20
    • 1970-01-01
    相关资源
    最近更新 更多