我应该何时validation应用内购买交易收据?
我的意思是,我的脚步应该是?
1)获得
SKPaymentTransactionStatePurchased
2)从SKPaymentQueue中删除它,并通过
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
提供内容[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
3)validation收据,然后,如果它是无效的,阻止我刚刚提供的内容
或者我应该改变第二步而不是第三步?
1)获得
SKPaymentTransactionStatePurchased
2)validation收据,如果无效,则不提供内容
3)从
SKPaymentQueue
删除它[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
在第一种情况下,用户可以在购买后closuresnetworking,所以我将无法validation收据。 但是第二步,在步骤1和步骤2之间可能会出现一些互联网问题,所以我不会完成交易,也不会提供内容,这是一个糟糕的用户体验。
那么你为你的应用select了什么方式,为什么?
我的select
我select了第二个场景,因为select第一个场景会让我的应用很容易被iAP Cracker破解。
情景2.如果networking爆炸,你将不会达到-finishTransaction。 但是,这很酷,因为你可以重试(NSTimer),你的应用程序将在启动时被赋予未完成的事务。 而这正是 StoreKitdevise的工作原理(尽pipe从阅读文档来看并不明显)。
StoreKit附带交易,这是有原因的。 用户可以在购买后立即退出应用程序,但仍然需要从中恢复。 这就是为什么苹果build议在应用程序生命周期中尽快设置事务观察者。
在提供内容之前,不要完成交易,您必须在StoreKit上实现自己的交易系统,而且您不想这样做,相信我(我已经看到了它,这是一个灾害)。
编辑:诚实地说,在购买之后和validation之前closures互联网的用户最终是低得离谱的。 那个人第二次在互联网上,没有人在购买的时候出去切断互联网。 但此时用户可能会被中断,并将您的应用程序发送到后台。 然后,您的应用程序可能会因为iOS认为合适的原因而被杀害。 而当你的应用程序再次启动,以及你的应用程序将不会记得有一个购买开始,和存储工具包将不会有什么大的帮助,因为你已经完成了交易。
这就是我所做的:
-
应用程序发送附有收据的内容请求。
-
服务器使用iTunesvalidation收据,如果有效,则将购买的内容作为响应主体返回到原始请求。
这样,即使应用程序二进制文件被黑/修改,内容也只能下载一个有效的收据。
我先核实一下。 它需要2-3秒。 为此,您可以使用ReceiptKit https://github.com/maciekish/ReceiptKit 。