何时使用restoreCompletedTransactions进行应用内购买?

对于具有非消费性应用程序内购买的基本应用程序,是否有人想出了使用SKPaymentQueue的restoreCompletedTransactions最佳实践?

意见

我知道build议您始终注册一个交易观察员,以接收未完成交易,然后回到应用程序,但这是一个不同的问题。 看起来像restoreCompletedTransactions是应用程序必须积极决定何时调用轮询所有客户已经做的采购。

据我所知,该方法旨在检索可能已经丢失的购买。 例如,一个客户可能会安装或移动应用程序到一个新的设备应用程序的本地logging以前的付款丢失或重置。

关注

我不清楚的是如何以可靠的方式自动检测到这种情况(即如何决定何时缺货购买)。 我不想把这个搞砸,否则就有可能拒绝客户访问他们已经支付的function。

同时,我不希望每次调用restoreCompletedTransactions时,应用程序启动都是安全的,基本上可以返回99.9%的时间我已经知道的事务。 (除了应用程序内购买,我的应用程序并不需要任何networking连接。)

笔记

苹果公司的文件澄清说,客户不会再收取任何他们已经作出的非消耗性采购。 如果他们试图重新购买,付款交易仍然应该发送到应用程序。

最糟糕的情况是,客户可以通过这种方式来恢复购买,但是我仍然希望避免将它们放在类似于重新购买已经支付的东西的path上。

在写下这个问题并思考之后,我想出了一些解决scheme。

自动(不推荐)

一种select是在用户默认情况下loggingrestoreCompletedTransactions是否已经在应用程序中调用(并成功完成)。 如果没有,应用程序会在启动时调用一次。 由于这个标志可以存储在与非消耗性支付相同的地方,如果用户默认后来被擦除,那么恢复方法会在应用程序启动时再次被调用。

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

无论哪种情况, restoreCompletedTransactions只会被调用一次,而不是每次启动。

手册(推荐)

另一个select是向客户提供一个“还原购买”button,将其挂接到restoreCompletedTransactions并让他们决定是否以及何时可能需要。

(下面的评论进入为什么手动恢复可能比尝试自动执行更好。)

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

更糟糕的是,我还没有弄清楚在IAPs退款时如何得到通知。 我怀疑恢复过程只会返回一个未退还的交易清单。 所以a)当您恢复时,您需要删除用户IAP的logging,以防止在恢复过程中报告退款产品,以及b)您需要定期自动执行恢复操作,以便获取退款。

这一切都凸显了苹果公司IAP的问题 – 它构思不佳,没有充分的文件logging – 现在需要内容提供商,如电子书阅读器已经有完美的function,基于networking的商店已经在他们的应用程序(如Kindle)中工作。

只要你有一个非消费的应用内购买,例如一个新的赛道,你需要在应用程序的某处实施“恢复”button,以便用户可以恢复购买,如果他们改变设备或删除应用程序。 这是强制性的,我曾经因为没有实现“还原”button而拒绝了应用程序。