我应该何时验证应用内购买交易收据?

Nik*_*rov 19 security user-experience storekit in-app-purchase ios

我的意思是,我的步骤应该是什么?

1)得到SKPaymentTransactionStatePurchased

2)从SKPaymentQueue中删除它并提供内容[[SKPaymentQueue defaultQueue] finishTransaction: transaction];

3)验证收据然后,如果它无效,则阻止我刚刚提供的内容

或者我应该将第二步改为第三步?

1)得到SKPaymentTransactionStatePurchased

2)验证收据然后,如果它无效,则不提供内容

3)SKPaymentQueue无论如何都要将它取下[[SKPaymentQueue defaultQueue] finishTransaction: transaction];

在第一种情况下,用户可以在购买后立即关闭互联网,因此我将无法验证收据.但是在第二步中,在步骤1和步骤2之间可能会出现一些互联网问题,所以我不会完成交易,也不会提供内容,这将是糟糕的用户体验.

那你选择了什么样的应用程序?为什么?

我的选择

我选择了第二种情况,因为选择第一种方案会让我的应用程序很容易被iAP Cracker破解.

kra*_*kra 10

场景2.如果互联网爆炸,你将无法进入-finishTransaction.但这很酷,因为你可以重试(NSTimer),你的应用程序将在启动时获得未完成的交易.而这正是 StoreKit是如何设计工作(尽管不是很明显,从阅读的文档).

StoreKit附带交易,这是有充分理由的.用户可以在购买后立即退出应用程序,您仍然需要从中恢复.这就是Apple建议在应用程序生命周期中尽快设置事务观察器的原因.

在提供内容之前不要完成交易,你必须在StoreKit之上实现自己的交易系统,你不想这样做,相信我(我已经看过它,它是一个灾害).

编辑:老实说,用户最终在购买后关闭互联网并在验证之前是非常低的.这家伙一秒钟就上网了,没有人在购买过程中出去剪网.但是当时用户可能会被打断并将您的应用程序发送到后台.然后,您的应用程序可能因iOS认为合适的原因而被杀死.当你的应用程序再次启动时,你的应用程序将不会记得开始购买,并且商店套件将不会有很大的帮助,因为你已经完成了交易.


Nic*_*ari 5

这是我的工作:

  1. App发送对可下载内容的请求,并附上回执作为参数。

  2. 服务器使用iTunes验证收据,如果有效,则将购买的内容作为对原始请求的响应正文返回。

这样,即使应用程序二进制文件被黑客入侵/修改,也只能根据有效的收据下载内容(因为在客户端应用程序上进行的任何修改都可能不会干扰我的服务器和Apple的服务器)。