我正在为我的一个跨平台应用程序(iOS + macOS)实施应用内购买。我执行非消耗性IAP的方法是,在玩家完成购买后,将一个标志保存在钥匙链中。(例如,值true
键com.app.prodctId
),只是检查在运行时,如果该标志存在,值是什么。然而,这似乎非常不安全,因为一些用户可能只是在keychain中添加具有特定值的密钥,从而无需购买即可访问锁定功能。对此的解决方案是在保存之前加密(或使用盐对数据进行散列)标志,但我需要为每个iCloud帐户拥有一个单独的密钥(因此用户可以在他的iCloud帐户上的所有设备上享受产品),我真的不确定这可以是什么。
是否有任何可以获取每个iCloud帐户,所以我可以使用作为加密密钥/盐的哈希?或者是否存在更好的方法去管理应用购买中的非消耗性内容?
对于每个下载应用的用户,Apple都会创建一个包含一些元信息(用户下载的应用版本,何时下载等)的收据。
当你的应用提供应用内购买时,这些也会保存在收据中。由于此收据会自动与用户的所有设备同步,因此检查用户购买了什么并相应地解锁其所有设备上的内容是正确的选择。
在这里查看苹果关于收据验证技术的文章。如果选择本地(设备上)收据验证,我建议您使用TPInAppReceipt库对收据进行编码。这就省去了很多麻烦。