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

ott*_*tto 46 iphone storekit in-app-purchase ios

对于使用非消费类应用内购买的基本应用,有没有人想出使用SKPaymentQueue的最佳做法restoreCompletedTransactions

意见

我知道建议始终注册一个事务观察器来接收返回到应用程序的待处理事务,但这是一个不同的问题.看起来restoreCompletedTransactions应用程序必须主动决定何时对客户已经进行的所有购买进行轮询.

据我所知,该方法旨在检索可能已丢失的购买.例如,客户可能会以这样的方式安装应用程序或将应用程序移动到新设备,其中应用程序的先前付款的本地记录丢失或重置.

关注

我不清楚的是如何以可靠的方式自动检测这种情况(即如何决定何时轮询丢失的购买).我不想搞砸这一点,并且有可能拒绝客户访问他们已经支付的功能.

与此同时,我不希望restoreCompletedTransactions每次应用程序启动只是为了安全,并且基本上回复了我已经知道的99.9%的交易.(除了应用内购买,我的应用并不需要任何网络连接.)

笔记

Apple文档澄清了客户不会再次因他们已经进行的任何非消费性购买而被收费.如果他们尝试重新购买,则仍应将付款交易发送至应用.

最糟糕的情况是,客户可以通过这种方式恢复购买,但我仍然希望避免让他们走上类似于重新购买他们已经支付的东西的道路.

ott*_*tto 32

在写完问题并思考之后,我想出了几个解决方案.

自动(不推荐)

一种选择是在用户默认值中记录是否restoreCompletedTransactions已在应用程序中调用(并成功完成).如果没有,应用程序会在启动时调用它一次.由于此标记可以存储在与非消费支付相同​​的位置,如果稍后擦除用户默认值,则应用程序启动时将再次调用恢复方法.

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

在任何一种情况下,restoreCompletedTransactions只调用一次而不是每次启动.

手册(推荐)

另一种选择是在某处向客户提供"恢复购买"按钮,将其连接起来restoreCompletedTransactions并让他们决定是否以及何时需要它.

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

  • 是啊.我也倾向于恢复按钮.对于自动恢复,我忘了考虑一些明显的事情 - 用户可以提示输入他们的帐户密码.这是我第一次运行应用程序时想要投入用户脸部的最后一件事. (11认同)
  • Mugunth Kumar:我认为这最近发生了变化.在早期版本的iOS中,用于下载应用程序的登录名和密码将持续15分钟.这意味着,在下载后的15分钟内第一次运行应用程序将允许`restoreCompletedTransactions`调用无需任何提示即可通过.在明显滥用此功能后,Apple将行为更改为始终需要单独的身份验证才能进行应用内购买(这就是您所看到的).有了这种新方法,我认为没有办法在没有提示的情况下自动调用`restoreCompletedTransactions`. (3认同)
  • 我有一个应用程序因没有恢复购买按钮而被拒绝.我认为这个按钮必须从那里出发. (3认同)

Cra*_*aig 16

不要忘记,一个Apple ID可以跨越多个设备.因此,在一台设备(例如用户的iPhone)上保留一个标志,告诉您是否已完成恢复,这将无法检测客户是否已在另一台设备(例如他的iPad)上进行购买要恢复到iPhone上.因此,即使您有自动方法,也需要手动启动恢复方法.

更糟糕的是,我还没有弄清楚当你提出IAP退款时你会得到什么通知.我怀疑恢复过程只会返回未退款交易的清单.因此a)您需要在还原时删除用户IAP的记录,以便在还原期间根本不报告退款产品,并且b)您需要定期自动执行还原以获取退款.

这一切都凸显了Apple的IAP问题 - 它构思不佳且文档记录不充分 - 现在对于电子书阅读器等已经拥有功能完善的网络商店已经在他们的应用程序中工作的内容提供商(如Kindle),这是必需的.

  • 这是一个很好的观点,如果您使用非消耗品,那么必须明白需要"恢复购买"按钮,以及从应用商店拒绝的痛苦. (3认同)

Mar*_*ges 5

每当您进行非消耗性应用内购买时,例如新的赛道,您需要在应用程序中的某个位置实现“恢复”按钮,以便用户在更换设备或删除应用程序时可以恢复其购买。这是强制性的,我之前曾因未实现“恢复”按钮而让 Apple 拒绝过某个应用程序。