对于使用非消费类应用内购买的基本应用,有没有人想出使用SKPaymentQueue的最佳做法restoreCompletedTransactions
?
我知道建议始终注册一个事务观察器来接收返回到应用程序的待处理事务,但这是一个不同的问题.看起来restoreCompletedTransactions
应用程序必须主动决定何时对客户已经进行的所有购买进行轮询.
据我所知,该方法旨在检索可能已丢失的购买.例如,客户可能会以这样的方式安装应用程序或将应用程序移动到新设备,其中应用程序的先前付款的本地记录丢失或重置.
我不清楚的是如何以可靠的方式自动检测这种情况(即如何决定何时轮询丢失的购买).我不想搞砸这一点,并且有可能拒绝客户访问他们已经支付的功能.
与此同时,我不希望restoreCompletedTransactions
每次应用程序启动只是为了安全,并且基本上回复了我已经知道的99.9%的交易.(除了应用内购买,我的应用并不需要任何网络连接.)
Apple文档澄清了客户不会再次因他们已经进行的任何非消费性购买而被收费.如果他们尝试重新购买,则仍应将付款交易发送至应用.
最糟糕的情况是,客户可以通过这种方式恢复购买,但我仍然希望避免让他们走上类似于重新购买他们已经支付的东西的道路.
在写完问题并思考之后,我想出了几个解决方案.
一种选择是在用户默认值中记录是否restoreCompletedTransactions
已在应用程序中调用(并成功完成).如果没有,应用程序会在启动时调用它一次.由于此标记可以存储在与非消费支付相同的位置,如果稍后擦除用户默认值,则应用程序启动时将再次调用恢复方法.
这样,如果现有客户以某种方式重新安装应用程序,他们仍然可以自动恢复购买.如果他们是之前从未启动过应用程序的新客户,则还原操作不会返回任何内容.
在任何一种情况下,restoreCompletedTransactions
只调用一次而不是每次启动.
另一种选择是在某处向客户提供"恢复购买"按钮,将其连接起来restoreCompletedTransactions
并让他们决定是否以及何时需要它.
(下面的评论说明为什么手动恢复可能比尝试自动执行更好.)
不要忘记,一个Apple ID可以跨越多个设备.因此,在一台设备(例如用户的iPhone)上保留一个标志,告诉您是否已完成恢复,这将无法检测客户是否已在另一台设备(例如他的iPad)上进行购买要恢复到iPhone上.因此,即使您有自动方法,也需要手动启动恢复方法.
更糟糕的是,我还没有弄清楚当你提出IAP退款时你会得到什么通知.我怀疑恢复过程只会返回未退款交易的清单.因此a)您需要在还原时删除用户IAP的记录,以便在还原期间根本不报告退款产品,并且b)您需要定期自动执行还原以获取退款.
这一切都凸显了Apple的IAP问题 - 它构思不佳且文档记录不充分 - 现在对于电子书阅读器等已经拥有功能完善的网络商店已经在他们的应用程序中工作的内容提供商(如Kindle),这是必需的.