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

23

我的理解是,我应该采取哪些步骤呢?

1) 获取 SKPaymentTransactionStatePurchased

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

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

还是我应该将第二个步骤改为第三个步骤呢?

1) 获取 SKPaymentTransactionStatePurchased

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

3) 无论如何都要从 SKPaymentQueue 删除 [[SKPaymentQueue defaultQueue] finishTransaction: transaction];

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

所以,您选择了哪种方式来开发您的应用程序,为什么呢?

我的选择

我选择了第二种情况,因为选择第一种情况会使我的应用程序易受 iAP Cracker 的攻击。


我也对这个问题的答案很感兴趣。目前我正在采用你的第一种方法,因为它提供了更好的用户体验,并且仍然很难被滥用(我一直在尝试在后台验证收据)。 - Joris Weimar
我也决定选择那个用于我的应用程序。 - Nikita Pestrov
你是否在应用程序代码中确定是否下载内容(有效收据)或不下载(无效收据)?如果是这样,只需要将“if(valid)”更改为“if(1)”。请参见我的答案。 - Nicolas Miari
我从服务器接收到响应,然后确认是的。 - Nikita Pestrov
3个回答

11

场景2。 如果互联网出现问题,您将无法完成交易(-finishTransaction)。 但是没关系,因为您可以重试(NSTimer),并且在启动时应用程序会得到未完成的交易。 这正是StoreKit设计的精髓之处(尽管从文档中阅读不出来)。

StoreKit带有交易功能,有很好的原因。用户购买产品后可以随时退出应用程序,您仍然需要从中恢复过来。 这就是为什么苹果建议在应用程序生命周期的尽可能早的时候设置您的交易观察者。

千万不要在提供内容之前结束交易,否则您将不得不在StoreKit之上实现自己的交易系统,而您不想这样做,相信我(我曾经见过这样的情况,那简直是一场灾难)。

编辑:老实说,用户在购买后关闭互联网并在您验证之前的可能性非常低。那家伙在一秒钟前还在上网,谁会突然切断互联网呢? 但是可能会在这一刻被打断并将您的应用程序发送到后台。 您的应用程序可能会因各种原因被终止。 当您的应用程序再次启动时,您的应用程序将不会记得先前的购买情况,而StoreKit也无法提供帮助,因为您已经完成了交易。


是的,在看到我的应用程序容易被iAP破解器破解后,我转向了这种情况。当然,在didFinishLaunching中添加了观察者。谢谢你的回答! - Nikita Pestrov

6
这是我的工作内容:
  1. 应用程序发送包含收据的请求以获取可下载内容。

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

这样,即使应用程序二进制文件被黑客/修改,只有在有效收据的情况下才能下载内容(因为客户端应用程序上没有进行任何修改,所以不可能在我的服务器和Apple之间干扰)。

1

1
ReceiptKit如何在不验证控制的服务器环境中验证你的收据?这似乎很容易被黑客攻击,是吗? - Angel G. Olloqui

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接