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