我的应用将允许用户通过应用内购买升级到 Pro 功能。我正在使用我自己的服务器验证收据数据,并且确认从我的服务器返回,我调用了 finishTransaction:
如果验证失败(可能不是由于盗版尝试)并且我不调用 finishTransaction: 会发生什么?它会无限期地留在队列中吗?
我的应用将允许用户通过应用内购买升级到 Pro 功能。我正在使用我自己的服务器验证收据数据,并且确认从我的服务器返回,我调用了 finishTransaction:
如果验证失败(可能不是由于盗版尝试)并且我不调用 finishTransaction: 会发生什么?它会无限期地留在队列中吗?
FinishTransaction
如果没有被调用,我总是发现在某些时候我会出现奇怪的行为。
最好的选择是在 等中设置一个设置StandardUserDefaults
,指示“我买了这个,但它失败了”,然后调用FinishTransaction
。然后,当他们重新启动应用程序(或前台应用程序)时,您可以检查这一点并将其发送到您的服务器。
此外,如果您购买的不是消耗品(即不购买硬币或金钱),您只需致电FinishTransaction
并告诉用户通过RestoreTransaction
设置菜单中的按钮激活即可。无论如何,Apple 都需要此按钮来购买非消耗品。
以下是 Apple 告诉您的操作:当您收到应用内购买成功的通知时,有两种可能性:用户向您的银行账户付款,或者黑客伪造了该通知。
因此,您将收据发送到您的服务器,服务器会检查收据。百分百确保它不会拒绝任何正确的收据。当它告诉您的应用收据有效且已被处理时,您的应用会调用 finishTransaction。如果它告诉您的应用收据无效,没有人确切知道该怎么做,但调用 finishTransaction 不会有任何伤害。如果出现其他任何问题(您的服务器崩溃、互联网中断等),您不要调用finishTransaction,因为如果您这样做,客户会在没有得到任何东西的情况下赔钱,并且会非常生气。在这种情况下,您将在稍后再次被告知该交易。如果用户有两个或更多设备,可能在不同的手机上。所以要准备好交易可能会到达任何时间,即使您的应用没有在该设备上看到任何购买。
这就是为什么在用户默认值中存储任何内容都是错误的。用户按下“购买”按钮的设备不一定是最终进行购买的设备。(有些人拥有许多iOS 设备,即使在简单的情况下,用户也可能在他们的 iPhone 和 iPad 之间切换)。
如果对服务器的请求失败,我的应用程序将以什么方式再次收到通知以重试对我的服务器的请求?
如果您没有完成交易,那么它会保留在 SKPaymentQueue 中。当您的应用程序连接到 SKPaymentQueue 时,它会接收与其相关的所有交易。
所以你的应用需要完成所有未完成的交易。