【问题标题】:Is it safe to store the flag in NSUserDefaults once purchase is done via In App Purchase?通过应用内购买完成购买后,将标志存储在 NSUserDefaults 中是否安全?
【发布时间】:2015-05-07 18:30:51
【问题描述】:

我有一些功能只有在通过应用内购买后才能解锁。

如果我将标志值存储在 NSUserDefaults 中以检查应用是否已购买,是否可以?

通过应用内购买完成购买后,将标志存储在 NSUserDefaults 中是否安全?

【问题讨论】:

    标签: iphone cocoa-touch ios4 in-app-purchase


    【解决方案1】:

    不,这不安全

    内容 NSUserDefaults 以纯文本形式存储。可以使用iExplorer 等工具访问和修改它们。这也适用于未越狱的设备。

    这意味着如果您将购买信息保存在 NSUserDefaults 中,用户无需进行实际购买即可解锁您的内容。

    要以不容易“破解”的方式保存标志,您可以执行以下操作之一:

    1. 保存存储信息的额外加盐哈希。使用散列验证用户没有修改信息。你可以找到这个概念的实现here

    2. 将标志保存在钥匙串中。阅读 Apple 的Keychain Services Programming Guide 了解更多信息。你可以在 GitHub 上找到这个概念的几个实现,例如Lockbox.

    更新:从 iOS 8.3 开始,对应用沙箱的访问受到一定限制。虽然这增加了一些安全性,但我仍然不建议使用 NSUserDefaults,因为越狱设备、启用了 iTunes 文件共享的应用程序以及运行旧版本 iOS 的设备仍然可以访问沙盒.

    【讨论】:

    • PhoneView 也是如此。我能够编辑 Letterpress 的 NSUserDefaults 属性列表并关闭副本中的声音。如果customerHasPurchaseApp 是一把钥匙,就可以免费使用。
    • 任何想要修改 NSUserDefaults 属性列表文件的人只需要编辑[sandbox]/Library/Preferences/[bundle identifier].plist。例如,凸版印刷是com.atebits.ios.Letterpress.plist。使用 PhoneView 非常容易做到这一点(我没有尝试过 iExplorer)。
    • 如果每次加载应用时验证收据后重置标志,您是否会有相同的保留?
    • @Theo:+1 好答案..!!这是对这篇文章的真正增值。很抱歉我很晚才回复。感谢您的增值:)
    【解决方案2】:

    是的,这是最好的方法。所以你可以通过存储在 NSUserDefault 中的标志来跟踪。

    但是, 当您从设备中删除应用程序时,它的值变为 FALSE。 所以它会再次要求购买。但是,它不会再次向用户收取相同的购买费用。

    干杯。

    【讨论】:

    • 感谢您的详细解释。
    • -1。见Theo’s answer。允许用户恢复他们的购买是通过 Store Kit 实现的(对于非消耗品购买)。你必须给用户一个恢复购买的选项——这与 NSUserDefaults 是分开的。
    【解决方案3】:

    是的,这是最好的方法。至少我以非消耗性应用内购买类型存储在 NSUSerDefault 中。所以直到现在它对我来说都是魅力。

    【讨论】:

    • 如何防止有人将他们的 NSUserDefaults 设置分享给应用程序的所有用户?或者除非您越狱,否则此文件是否不受限制?
    • @PsychoDad 此文件在任何设备的限制范围内。 PhoneViewiExplorer 让您可以复制、修改和替换这些文件。写入 NSUserDefaults 的文件位于 [sandbox path]/Library/Preferences/[bundle identifier].plist(通常包标识符是 com.company.appname)。请参阅Theo’s answer
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-17
    • 1970-01-01
    • 2011-08-02
    • 1970-01-01
    相关资源
    最近更新 更多