2012-04-03 109 views
15

我的意思是,我的步骤应该如何?我应该何时验证应用内购买交易收据?

1)获取SKPaymentTransactionStatePurchased

2)[[SKPaymentQueue defaultQueue] finishTransaction: transaction];

3)验证从SKPaymentQueue删除它,并提供所述内容的接收和然后,如果它是无效的,块我刚刚提供的内容

或者我应该改变第二步而不是第三步?

1)获取SKPaymentTransactionStatePurchased

2)确认收货,然后,如果它是无效的,dont't提供内容

3)SKPaymentQueue删除也无妨[[SKPaymentQueue defaultQueue] finishTransaction: transaction];

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

那么你选择什么方式为你的应用程序,为什么?

我的选择

我选择了第二个方案,因为选择第一个让我的应用程序很容易被IAP饼干破解。

+0

我对这个答案也很有兴趣。我目前正在做你的第一个方法,因为它是一个更好的用户体验,它仍然很难滥用(我一直试图验证收据在后台) – 2012-04-22 16:40:06

+0

我也决定选择一个为我的应用程序 – 2012-04-22 16:53:39

+0

你确定是否从应用程序代码中下载内容(有效收据)或不收据(无效收据)?如果是这样,只需要将'if(valid)'改为'if(1)'。看到我的答案。 – 2012-07-15 10:48:57

回答

9

情景2. 如果网络爆炸了,你将无法进入-finishTransaction。 但这很酷,因为您可以重试(NSTimer),并且您的应用程序将在启动时获得未完成的事务。 这就是正好 StoreKit是如何设计的(尽管从阅读文档来看它并不明显)。

StoreKit附带交易,这是有原因的。用户可以在购买后立即退出应用程序,但仍然需要从中恢复。 这就是为什么Apple建议尽快在应用程序生命周期中设置事务观察者的原因。

在提供内容之前不要完成交易,您必须在StoreKit之上实施自己的交易系统,并且您不希望这样做,相信我(我已经看到它完成了, 那是一场灾难)。

编辑:诚实地说,在购买之后和验证之前关闭互联网的用户的最终结果是低得离谱。这家伙第二次在互联网上,没有人会在购买过程中出去切断互联网。 但此时用户可能会被中断并将您的应用程序发送到后台。 无论iOS认为合适的原因,您的应用可能会被杀害。 当您的应用程序再次启动时,您的应用程序不会记得先购买产品,并且由于您已完成交易,所以存储工具包不会有很大的帮助。

+0

是的,我看到后,我转向这种情况,我的应用程序可以很容易地被iAP cracker破解。而且,是的,当然我在didFinishLaunching中添加观察者)谢谢你的回答! – 2012-07-15 07:25:22

1

我会先验证。它需要2-3秒。您可以使用ReceiptKit https://github.com/maciekish/ReceiptKit来达到此目的。

+1

ReceiptKit如何帮助验证您的收据,而无需在受控服务器环境中进行验证?似乎很容易破解,不是吗? – 2013-06-25 07:38:06

3

这是我做的:

  1. 应用程序发送与接收附加内容的请求。

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

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