51

对于具有非消耗性应用内购买的基本应用,有没有人想出使用 SKPaymentQueue 的最佳实践restoreCompletedTransactions

观察

我知道建议始终注册事务观察器以接收返回应用程序的待处理事务,但这是一个不同的问题。看起来restoreCompletedTransactions应用程序必须主动决定何时调用以轮询客户已经进行的所有购买。

据我所知,该方法旨在检索可能丢失的购买。例如,客户可能会以这种方式安装应用程序或将应用程序移动到新设备上,从而导致应用程序的本地先前付款记录丢失或重置。

关注点

我不清楚的是如何以可靠的方式自动检测这种情况(即如何决定何时轮询丢失的购买)。我不想把这件事搞砸并冒着拒绝客户访问他们已经付费的功能的风险。

同时,为了安全起见,我不想restoreCompletedTransactions每次应用程序启动时都打电话,并且基本上可以取回我大约 99.9% 的时间已经知道的交易。(除了应用内购买,我的应用实际上不需要任何网络连接。)

笔记

Apple 文档明确指出,客户已进行的任何非消耗性购买都不会再次向他们收费。如果他们尝试重新购买,支付交易仍然应该发送到应用程序。

最坏的情况是,客户可以通过这种方式恢复购买,但我仍然希望避免让他们走上类似于重新购买他们已经支付过的东西的路径。

4

3 回答 3

34

更新(2019 年 6 月)

Apple关于这个主题的文档在 2018 年更新,相当全面。它的许多建议与我们最终在这里得出的结论一致。自 2009 年首次发布此问题以来,最大的发展是 iOS 7 中的 App Store 收据。

如果链接在将来某个时候失效,我将在此处引用一些文档。

恢复购买的产品

用户恢复交易以保持对他们已经购买的内容的访问。例如,当他们升级到新手机时,他们不会丢失在旧手机上购买的所有物品。在您的应用程序中包含一些机制,让用户恢复他们的购买,例如恢复购买按钮。恢复购买会提示输入用户的 App Store 凭据,这会中断您的应用程序的流程:因此,不要自动恢复购买,尤其是每次启动您的应用程序时。

在大多数情况下,您的应用需要做的就是刷新收据并在收据中交付产品。刷新的收据包含用户在此应用、此设备或任何其他设备上的购买记录。但是,由于以下原因之一,某些应用程序需要采用替代方法:

  • 如果您使用 Apple 托管的内容,恢复已完成的事务会为您的应用程序提供用于下载内容的事务对象。
  • 如果您需要支持 iOS 7 之前的 iOS 版本,而应用收据不可用,请改为恢复已完成的交易。
  • 如果您的应用使用非续订订阅,则您的应用负责恢复过程。

刷新收据会要求 App Store 提供收据的最新副本。刷新收据不会创建任何新交易。尽管您应该避免连续多次刷新,但此操作与仅刷新一次的结果相同。

恢复已完成的交易会为用户所做的每个已完成交易创建一个新交易,本质上是为您的交易队列观察者重放历史记录。在恢复事务时,您的应用程序会维护自己的状态以跟踪它恢复已完成事务的原因以及它需要如何处理它们。多次恢复会为每个已完成的事务创建多个恢复的事务。


上一个答案 (2009-2012)

在写下问题并思考之后,我想出了几个解决方案。

自动(不推荐)

一种选择是在用户默认值中记录是否restoreCompletedTransactions已在应用程序中调用(并成功完成)。如果没有,应用程序会在启动时调用它一次。由于此标志可以与非消耗性付款存储在同一位置,因此如果稍后清除用户默认值,则应用程序启动时将再次调用 restore 方法。

这样,如果现有客户以某种方式重新安装应用程序,他们仍然可以自动恢复购买。如果他们是以前从未启动过该应用程序的新客户,则恢复操作不会返回任何内容。

在任何一种情况下,restoreCompletedTransactions都只调用一次,而不是在每次启动时调用。

手动(推荐)

另一种选择是在某处为客户提供“恢复购买”按钮,将其连接起来restoreCompletedTransactions,让他们决定是否需要以及何时需要。

(下面的评论说明了为什么手动还原可能比尝试自动还原更好。)

于 2009-11-18T17:54:06.443 回答
16

不要忘记一个 Apple ID 可以跨越多台设备。因此,在一个设备(例如,用户的 iPhone)上维护一个标志,告诉您您是否进行了恢复,这将不允许您检测客户是否在另一台需要的设备(例如他的 iPad)上进行了购买恢复到 iPhone 上。因此,即使您有自动方法,也需要手动启动还原方法。

更糟糕的是,我还没有弄清楚当 IAP 退款时如何通知您。我怀疑恢复过程只会返回未退款交易的列表。因此,a) 您需要在进行恢复时删除用户 IAP 的记录,以防在恢复期间根本没有报告退款的产品,并且 b) 您需要定期自动进行恢复以获取退款。

这一切都凸显了 Apple 的 IAP 的问题——它的构思很差,文档也很不充分——现在它对于内容提供商来说是必需的,比如电子书阅读器,他们已经在他们的应用程序(如 Kindle)中运行了完美运行的基于网络的商店。

于 2011-06-22T11:53:33.990 回答
4

每当您有一个非消耗性的应用内购买时,例如一个新的赛道,您需要在应用程序的某处实现一个“恢复”按钮,以便用户在更换设备或删除应用程序时可以恢复他们的购买。这是强制性的,我之前已经让 Apple 拒绝了一个应用程序,因为它没有实现恢复按钮。

于 2012-12-26T21:55:42.217 回答