【问题标题】:Using NSUserDefaults to store many values will cause problems?使用 NSUserDefaults 存储很多值会导致问题吗?
【发布时间】:2013-01-23 14:09:14
【问题描述】:

我创建了一个应用程序,它将使用用户名、密码登录并允许用户从服务下载文件。在我的应用程序中,一旦用户登录应用程序,我就必须保留少量数据。

用户名、密码、用户下载列表、订阅计划等持久数据。数据可以通过 NSUserDefaults、Plist 等保存在应用程序中。但我觉得使用 NSUserDefaults 存储和检索值很容易。由于我需要在许多视图控制器中使用这些值,我更喜欢NSUserDefaults

这是最佳做法吗?使用过多的NSUserDefaults 会导致陷阱吗? 告诉我有没有其他方法可以持久化数据并在 cocoa-touch 中轻松检索?

【问题讨论】:

  • 您可以使用文件以json的形式存储这些数据。
  • 我不想将信息存储在文件中,因为它更容易受到攻击
  • 请不要在NSUserDefaults 中存储密码,因为它会以未加密的方式存储,而您不想这样做。
  • @Paul.s.谢谢你。我正计划安全地存储。

标签: iphone ios cocoa-touch nsuserdefaults persistent-storage


【解决方案1】:

您可以使用NSUserDefaults 来存储用户数据。

但对于像UsernamePassword 这样高度敏感的数据,我更喜欢keychain 来存储它们。

请检查这些链接以保存钥匙串:

  1. Simple iphone keychain access
  2. saving email password to keychain in ios
  3. howto use keychain in iphone sdk

【讨论】:

  • 谢谢。让我检查一下 Keychain API
  • 但是我们可以只使用 Keychain 来存储用户名和密码,或者我们可以像键值对一样使用吗?
  • @Cyril:我添加了链接,你可以像键值对一样保存在里面
  • 谢谢。这是你提供给我的很多信息。我会用它。请告诉我,过多使用 NSUserDefaults 是否会导致应用程序崩溃?
  • @Cyril:不,但仅用于用户特定数据。如果可以将其存储到数据库中,切勿将其用于存储与功能相关的数据
【解决方案2】:

在我看来,如果你想存储少量数据,例如用户名、密码或一些 BOOL,你可以使用 NSUserDefaults。

由于 NSUserDefaults 是一个常见的 plist,如果你想存储一些数据,比如你的下载链接,最好使用你自定义的 plist。

如果你想存储一些大数据,比如 UIImage ,你可以使用 NSCache ,但是它可能会驱逐数据。

如果要存储大量数据,最好使用数据库。

【讨论】:

    【解决方案3】:

    我会考虑使用诸如 https://github.com/kishikawakatsumi/UICKeyChainStore 之类的库,它只是 ios 钥匙串存储的一个非常好的包装器,并将敏感数据存储在用户钥匙串中,而不是用户默认的 plist 中,因为它更安全。

    至于数据,如果它不安全,你没有理由不能把它们写到文件中然后重新加载?

    【讨论】:

    • 对不起,会痛的细节应该更安全
    • 您是否只是下载文件一次然后想要安全地存储......还是会在每次应用程序启动并运行时下载它们?
    • 确保下载的数据安全对我来说不是问题,因为我正在下载的文件是加密的。我只想安全地存储应用程序中使用的数据,例如用户名、密码等。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-21
    相关资源
    最近更新 更多