6

这个想法是无论风雨无阻,潮湿还是晴天,用户都必须付出所有代价。

来自苹果:

Store Kit 提供内置功能来恢复非消耗品、自动更新订阅和免费订阅的交易

对于这些交易,Apple Store Kit 有很好的内置工具。我想专注于其他类型(特别是消耗品)。唯一的交易信息是我们在成功购买后通过 Store Kit 收到的标识符和收据数据。我们的应用程序使用服务器端模型向其交付产品。但是仍然存在很多丢失购买数据的情况,例如如果服务器在用户通过 App Store 进行购买时放下,因此无法将收据发送到服务器以完成验证过程。

当前的解决方法是:

  1. 服务器返回产品标识符列表
  2. 用户选择一个;应用程序将其标识符保存在设备上(通过 SQLite 或 Core Data)。标准 Apple Store 交易流程紧随其后。
  3. 在成功的情况下,应用程序将收据数据连同其标识符一起保存在设备上并将其发送到服务器。如果出现故障或取消,则立即从设备中删除标识符。
  4. 如果服务器的响应正常,则应用程序会从设备中删除带有收据数据的标识符。否则它将定期向服务器发送请求,直到成功响应为止。

但是这种方法仍然存在漏洞。例如,用户可以在不等待交易交付到服务器的设备上删除应用程序,因此根本不会有任何关于他购买的证据。

你的建议?

4

1 回答 1

3

基本规则是,在您成功交付内容之前,您不要在支付队列上调用 finishTransaction:。这意味着您向验证和内容服务器发出请求,它们会返回有效响应。只有在这些正确的响应之后,您才会调用 finishTransaction:。请注意,不良购买收据是有效的,只是不好。你会让人们试图盗窃商品——不要为此失眠,但要进行适当的收据检查。

据我了解(根据我的非消耗品),只要您不调用finishTransaction,商店将继续在您的应用安装时重试。因此,我认为您不需要您的应用程序将收据保存在设备上。但是,对于消耗品,如果您希望以后能够恢复数据,则服务器必须存储数据。一个重要的问题是将其存储在什么键下。

顺便说一句,你的第一行是绝对正确的,值得失眠。

于 2012-12-18T22:17:33.077 回答