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