【发布时间】:2015-05-07 18:30:51
【问题描述】:
我有一些功能只有在通过应用内购买后才能解锁。
如果我将标志值存储在 NSUserDefaults 中以检查应用是否已购买,是否可以?
通过应用内购买完成购买后,将标志存储在 NSUserDefaults 中是否安全?
【问题讨论】:
标签: iphone cocoa-touch ios4 in-app-purchase
我有一些功能只有在通过应用内购买后才能解锁。
如果我将标志值存储在 NSUserDefaults 中以检查应用是否已购买,是否可以?
通过应用内购买完成购买后,将标志存储在 NSUserDefaults 中是否安全?
【问题讨论】:
标签: iphone cocoa-touch ios4 in-app-purchase
不,这不安全。
内容 NSUserDefaults 以纯文本形式存储。可以使用iExplorer 等工具访问和修改它们。这也适用于未越狱的设备。
这意味着如果您将购买信息保存在 NSUserDefaults 中,用户无需进行实际购买即可解锁您的内容。
要以不容易“破解”的方式保存标志,您可以执行以下操作之一:
保存存储信息的额外加盐哈希。使用散列验证用户没有修改信息。你可以找到这个概念的实现here。
将标志保存在钥匙串中。阅读 Apple 的Keychain Services Programming Guide 了解更多信息。你可以在 GitHub 上找到这个概念的几个实现,例如Lockbox.
更新:从 iOS 8.3 开始,对应用沙箱的访问受到一定限制。虽然这增加了一些安全性,但我仍然不建议使用 NSUserDefaults,因为越狱设备、启用了 iTunes 文件共享的应用程序以及运行旧版本 iOS 的设备仍然可以访问沙盒.
【讨论】:
customerHasPurchaseApp 是一把钥匙,就可以免费使用。
[sandbox]/Library/Preferences/[bundle identifier].plist。例如,凸版印刷是com.atebits.ios.Letterpress.plist。使用 PhoneView 非常容易做到这一点(我没有尝试过 iExplorer)。
是的,这是最好的方法。所以你可以通过存储在 NSUserDefault 中的标志来跟踪。
但是, 当您从设备中删除应用程序时,它的值变为 FALSE。 所以它会再次要求购买。但是,它不会再次向用户收取相同的购买费用。
干杯。
【讨论】:
是的,这是最好的方法。至少我以非消耗性应用内购买类型存储在 NSUSerDefault 中。所以直到现在它对我来说都是魅力。
【讨论】:
[sandbox path]/Library/Preferences/[bundle identifier].plist(通常包标识符是 com.company.appname)。请参阅Theo’s answer。