更新(2022年6月)
苹果公司已经给这个主题起了一个名字,并专门进行了整个 WWDC 会议的演讲。
(如果链接最终失效了,那就是指的 2022 年 WWDC 的第 110404 场次。)
该会议为期20分钟,涵盖了大量内容,强烈推荐观看。有很多细节需要处理,但我会提供两个亮点。
- 在首次启动全新安装的应用程序时,可以 自动 账户预先存在的购买,而无需提示用户进行 Apple ID 登录或确认。(
restoreCompletedTransactions
不用于此。)
- 苹果仍然需要一个“恢复购买”按钮,用户可以回退并使用它。
您的应用程序唯一需要调用 restoreCompletedTransactions
的时间是当用户点击“恢复购买”按钮时。(自从本文发布以来,这基本上一直是我们的建议。)
之前的答案(2019年6月)
苹果公司有关此主题的文档已于2018年更新,内容非常全面。它的许多建议与我们在这里得出的结论一致。自2009年首次发布该问题以来最大的发展是iOS 7中的应用商店收据。
如果链接在未来的某个时间失效了,我将在此引用部分文档。
恢复已购买的产品
用户恢复交易以保持对其已经购买内容的访问权限。例如,当他们升级到新手机时,他们不会失去在旧手机上购买的所有物品。在您的应用程序中包含某些机制,以便让用户恢复其购买,例如“恢复购买”按钮。恢复购买会提示用户提供 App Store 凭据,这会打断您的应用程序的流程:因此,请不要自动恢复购买,特别是不要在每次启动应用程序时都这样做。
在大多数情况下,您的应用程序只需要刷新其收据并提供其中的产品即可。更新后的收据包含了用户在此应用程序、此设备或任何其他设备上购买的记录。但是,某些应用程序需要采取其他方法,原因如下:
- 如果您使用 Apple 托管的内容,则恢复完成的交易会为您的应用程序提供用于下载内容的交易对象。
- 如果您需要支持早于 iOS 7 的 iOS 版本,其中应用程序收据不可用,请改为恢复已完成的交易。
- 如果您的应用程序使用非续订订阅,则您的应用程序负责恢复过程。
刷新收据会向 App Store 请求最新的收据副本。刷新收据不会创建任何新的交易。虽然您应避免连续刷新多次,但此操作将产生与仅刷新一次相同的结果。
恢复完成的交易会为用户完成的每笔交易创建一个新的交易,从而重新播放事务队列观察器的历史记录。在正在恢复交易时,您的应用程序会保持自己的状态,以跟踪它正在恢复已完成的交易的原因以及如何处理它们。多次恢复将为每个已完成的交易创建多个已恢复的交易。
一个选项是在用户默认设置中记录是否已经调用并成功完成了restoreCompletedTransactions
。如果没有,则应用程序在启动时调用它一次。由于这个标志可以存储在与非消耗性支付相同的位置,如果用户默认设置稍后被清除,那么当应用程序启动时会再次调用恢复方法。
这样,如果现有客户以某种方式进行了应用程序的全新安装,他们仍然会自动恢复其购买。如果他们是从未启动过应用程序的新客户,则恢复操作将不返回任何内容。
无论哪种情况,restoreCompletedTransactions
只会在第一次启动时调用,而不是在每次启动时调用。
手动(推荐)
另一个选项是在某个地方提供一个“恢复购买”按钮给客户使用,将其连接到restoreCompletedTransactions
,并让他们决定是否以及何时需要恢复购买。
(下面的评论解释了为什么手动恢复比尝试自动恢复更好。)