我的意思是,我的步骤应该是什么?
1)获取
SKPaymentTransactionStatePurchased
2)从SKPaymentQueue中删除它并按
[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
提供内容3)验证收据,如果无效,则阻止我刚刚提供的内容
或者我应该将第二步改为第三步?
1)获取
SKPaymentTransactionStatePurchased
2)验证收据,如果收据无效,则不提供内容
3)无论如何
SKPaymentQueue
将其从[[SKPaymentQueue defaultQueue] finishTransaction: transaction];
移除
在第一种情况下,用户可以在购买后立即关闭互联网,因此我将无法验证收据。但在第二步,在第1步和第2步之间可能会出现互联网的一些问题,所以我不会完成交易,也不会提供内容,这将是糟糕的用户体验。
那你选择了什么样的应用程序?为什么?
我的选择
我选择了第二种情况,因为选择第一种情况会让我的应用程序很容易被iAP Cracker破解。
答案 0 :(得分:10)
情景2。 如果互联网爆炸,你将无法进入-finishTransaction。 但这很酷,因为你可以重试(NSTimer),你的应用程序将在启动时获得未完成的交易。 这就是完全 StoreKit的设计方式(即使从阅读文档中看不出来)。
StoreKit附带交易,这是有充分理由的。用户可以在购买后立即退出应用程序,您仍然需要从中恢复。 这就是Apple建议在应用程序生命周期中尽快设置事务观察器的原因。
在提供内容之前不要完成交易,你必须在StoreKit之上实现自己的交易系统,而你不想这样做,相信我(我已经看过它了,这是一场灾难。)
编辑:老实说,用户最终在购买后和验证之前关闭了互联网,这是非常低的。这家伙一秒钟就上网了,没有人在购买过程中出去剪网。 但是当时用户可能会被打断并将您的应用程序发送到后台。 然后,您的应用程序可能因iOS认为合适的原因而被杀死。 当你的应用程序再次启动时,你的应用程序将不会记得开始购买,并且商店套件将不会有很大的帮助,因为你已经完成了交易。
答案 1 :(得分:4)
这就是我的所作所为:
应用程序发送附带收据的内容请求。
服务器使用iTunes验证收据,如果有效,则将购买的内容作为原始请求的响应主体返回。
这样,即使应用程序二进制文件被黑客攻击/修改,也只能根据有效收据下载内容。
答案 2 :(得分:1)
我先验证一下。这需要2-3秒。您可以将ReceiptKit https://github.com/maciekish/ReceiptKit用于此目的。