有没有人想出了使用SKPaymentQueue的restoreCompletedTransactions
的最佳实践?
观察
我知道建议总是注册一个事务观察者来接收返回到应用程序的未决事务,但这是一个不同的问题。看起来restoreCompletedTransactions
是应用程序必须主动决定何时调用来轮询客户已经完成的所有购买的东西。
据我所知,该方法旨在找回可能已丢失的购买。例如,客户可能会将应用程序安装或移动到新设备上,导致该应用程序以前付款的本地记录丢失或重置。
关注点
我不清楚的是如何以一种可靠的方式自动检测这种情况(即如何决定何时轮询丢失的购买)。我不想搞砸这件事,冒着拒绝客户使用他们已经付费的功能的风险。
同时,为了安全起见,我不想在应用程序每次启动时都调用restoreCompletedTransactions
,并且基本上可以得到我已经知道的99.9%的事务。(除了应用内购买,我的应用实际上不需要任何网络连接。)
备注
苹果公司的文件澄清,客户不会为他们已经进行的任何非消耗性购买再次收费。如果他们试图重新购买,支付交易仍然会被发送到应用程序。
最坏的情况是,客户可以通过这种方式恢复购买,但我仍然希望避免让他们走上类似于重新购买他们已经支付的东西的道路。
发布于 2009-11-19 01:54:06
更新(2019年6月)
苹果的documentation on this topic在2018年进行了更新,内容相当全面。它的许多建议与我们最终在这里得出的结论是一致的。自从这个问题在2009年首次发布以来,最大的进展是iOS 7中的应用商店收据。
如果这个链接在将来的某个时候失效了,我将在这里引用一些文档。
恢复购买的产品
用户恢复事务以保持对他们已经购买的内容的访问。例如,当他们升级到新手机时,他们不会丢失在旧手机上购买的所有物品。在你的应用程序中包括一些机制,让用户恢复他们的购买,例如恢复购买按钮。恢复购买会提示用户的App Store凭据,这会中断应用程序的流程:因此,不要自动恢复购买,尤其是在每次启动应用程序时。
在大多数情况下,您的应用程序需要做的就是刷新收据并在收据中交付产品。刷新的收据包含用户在此应用程序、此设备或任何其他设备上的购买记录。然而,出于以下原因之一,一些应用程序需要采用另一种方法:
刷新收据会要求App Store提供收据的最新副本。刷新收据不会创建任何新事务处理。虽然您应该避免在一行中多次刷新,但此操作与只刷新一次具有相同的结果。
还原已完成的事务会为用户创建的每个已完成的事务创建一个新事务,实质上是为事务队列观察者重播历史记录。在恢复事务时,您的应用程序会维护自己的状态,以跟踪恢复已完成事务的原因以及需要如何处理这些事务。多次还原将为每个已完成的事务创建多个已还原的事务。
上一个答案(2009-2012)
在写下这个问题并思考之后,我想出了几个解决方案。
自动(不推荐)
一种选择是在用户默认设置中记录应用程序中是否已经调用(并成功完成)了restoreCompletedTransactions
。如果没有,应用程序会在启动时调用它一次。由于此标志可以存储在与非消耗性支付相同的位置,如果用户的默认设置后来被清除,那么当应用程序启动时,将再次调用恢复方法。
这样,如果现有的客户以某种方式重新安装了应用程序,他们仍然会自动恢复他们的购买。如果他们是从未启动过应用程序的新客户,则恢复操作不会返回任何内容。
在这两种情况下,restoreCompletedTransactions
都只调用一次,而不是每次启动时都调用。
手动(推荐)
另一种选择是在某处为客户提供一个“恢复购买”按钮,将其连接到restoreCompletedTransactions
,让他们决定是否以及何时可能需要它。
(下面的注释说明了为什么手动还原可能比尝试自动还原更好。)
https://stackoverflow.com/questions/1757467
复制相似问题