我应该何时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认为合适的原因而被杀害。 而当你的应用程序再次启动,以及你的应用程序将不会记得有一个购买开始,和存储工具包将不会有什么大的帮助,因为你已经完成了交易。

这就是我所做的:

  1. 应用程序发送附有收据的内容请求。

  2. 服务器使用iTunesvalidation收据,如果有效,则将购买的内容作为响应主体返回到原始请求。

这样,即使应用程序二进制文件被黑/修改,内容也只能下载一个有效的收据。

我先核实一下。 它需要2-3秒。 为此,您可以使用ReceiptKit https://github.com/maciekish/ReceiptKit