【问题标题】:When to use restoreCompletedTransactions for in-app purchases?何时使用 restoreCompletedTransactions 进行应用内购买?
【发布时间】:2010-12-17 23:11:30
【问题描述】:

对于具有非消耗性应用内购买的基本应用,有没有人想出使用 SKPaymentQueue 的restoreCompletedTransactions 的最佳实践?

观察

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

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

担忧

我不清楚的是如何以可靠的方式自动检测这种情况(即如何决定何时轮询丢失的购买)。我不想把这件事搞砸并冒着拒绝客户访问他们已经付费的功能的风险。

同时,为了安全起见,我不想每次启动应用程序时都调用restoreCompletedTransactions,并且基本上可以取回我大约 99.9% 的时间已经知道的交易。 (除了应用内购买,我的应用实际上不需要任何网络连接。)

注意事项

Apple 文档阐明,客户已购买的任何非消耗品不会再次向他们收费。如果他们尝试重新购买,付款交易仍会发送到应用程序。

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

【问题讨论】:

  • 我目前正在努力解决同样的问题。我看到的问题在于 UI,调用 restoreCompletedTransactions 会立即提示用户输入他们的 iTunes 密码,而没有上下文,这在启动应用程序时是一件令人难以置信的混乱事情,尤其是对于尚未购买升级的人。我想在商店视图控制器显示时检查它,但它会立即提示输入密码,这真的会让首次购买者望而却步。
  • 是的,正是我的观点。在用户第一次运行应用程序或进入商店页面时自动提示用户输入他们的帐户密码是我真正想要避免的事情。我最终选择了一个“恢复购买”按钮,它似乎工作正常。到目前为止,我还没有收到任何客户投诉或困惑。

标签: iphone ios in-app-purchase storekit


【解决方案1】:

更新(2019 年 6 月)

苹果的documentation on this topic是2018年更新的,比较全面。它的许多建议与我们最终在这里得出的结论一致。自 2009 年首次发布此问题以来,最大的发展是 iOS 7 中的 App Store 收据。

如果链接在将来某个时候失效,我将在此处引用一些文档。

恢复购买的产品

用户恢复交易以保持对他们已经购买的内容的访问。例如,当他们升级到新手机时,他们不会丢失在旧手机上购买的所有物品。在您的应用程序中包含一些机制,让用户恢复他们的购买,例如恢复购买按钮。恢复购买会提示输入用户的 App Store 凭据,这会中断您的应用流程:因此,不要自动恢复购买,尤其是每次启动您的应用时。

在大多数情况下,您的应用需要做的就是刷新收据并交付收据中的产品。刷新的收据包含用户在此应用、此设备或任何其他设备上的购买记录。但是,出于以下原因之一,某些应用需要采用替代方法:

  • 如果您使用 Apple 托管的内容,恢复已完成的交易会为您的应用提供用于下载内容的交易对象。
  • 如果您需要支持 iOS 7 之前的 iOS 版本,而应用收据不可用,请改为恢复已完成的交易。
  • 如果您的应用使用非续订订阅,则您的应用负责恢复过程。

刷新收据会要求 App Store 提供收据的最新副本。刷新收据不会创建任何新交易。虽然您应该避免连续多次刷新,但此操作与仅刷新一次的结果相同。

恢复已完成的交易会为用户进行的每个已完成交易创建一个新交易,实质上是为您的交易队列观察者重放历史记录。在恢复事务时,您的应用程序会维护自己的状态,以跟踪它恢复已完成事务的原因以及它需要如何处理它们。多次恢复会为每个已完成的事务创建多个恢复的事务。


上一个答案 (2009-2012)

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

自动(不推荐)

一个选项是在用户默认值中记录restoreCompletedTransactions 是否已在应用程序中调用(并成功完成)。如果没有,应用程序会在启动时调用它一次。由于此标志可以与非消耗性付款存储在同一位置,因此如果稍后清除用户默认设置,则应用启动时将再次调用 restore 方法。

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

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

手动(推荐)

另一种选择是在某处为客户提供“恢复购买”按钮,将其连接到 restoreCompletedTransactions 并让他们决定是否需要以及何时需要。

(下面的 cmets 解释了为什么手动恢复可能比尝试自动恢复更好。)

【讨论】:

  • 启动时检查标志并自动恢复非常机智。我最终像 Ramp Champ 一样实现了一个按钮。但是,当购买时,这两个应用程序都在下载大文件。
  • 是的。我也倾向于使用恢复按钮。对于自动恢复,我忘了考虑一些显而易见的事情——用户可以提示输入他们的帐户密码。这是我第一次运行应用程序时最不想让用户面对的事情。
  • 按钮是最好的选择恕我直言。这也是我看到的每个应用都在做的事情。
  • Mugunth Kumar:我认为这种情况最近发生了变化。在早期版本的 iOS 中,用于下载应用程序的登录名和密码将持续 15 分钟。这意味着,在下载后 15 分钟内首次运行该应用程序将允许 restoreCompletedTransactions 呼叫在没有任何提示的情况下通过。在明显滥用此功能后,Apple 将行为更改为始终要求对应用内购买进行单独的身份验证(这就是您所看到的)。使用这种新方法,我看不到在没有提示的情况下自动调用restoreCompletedTransactions
  • 我有一个应用因为没有恢复购买按钮而被拒绝。我认为该按钮必须从一开始就在那里。
【解决方案2】:

每当您有非消耗性的应用内购买时,例如新的赛道,您需要在应用中的某处实现“恢复”按钮,以便用户在更换设备或删除应用程序。这是强制性的,我之前让 Apple 拒绝了一个应用程序,因为它没有实现恢复按钮。

【讨论】:

    【解决方案3】:

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

    更糟糕的是,我还没有弄清楚当 IAP 退款时如何通知您。我怀疑恢复过程只会返回未退款交易的列表。因此,a) 您需要在进行恢复时删除用户 IAP 的记录,以防在恢复期间根本没有报告退款的产品,并且 b) 您需要定期自动进行恢复以获取退款。

    这一切都凸显了 Apple 的 IAP 的问题——它的构思和文档不充分——现在它对于内容提供商来说是必需的,比如电子书阅读器,他们已经在他们的应用程序(如 Kindle)中运行了功能完善的基于网络的商店。

    【讨论】:

    • 这是一个很好的观点,并且必须是为什么显然需要“恢复购买”按钮的原因,如果您使用非消耗品,则会被应用商店拒绝。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-15
    • 2017-01-27
    • 2011-09-04
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多