【问题标题】:Do NSUserDefaults persist through an Update to an app in the Appstore?NSUserDefaults 是否会通过更新 Appstore 中的应用程序而持续存在?
【发布时间】:2010-12-10 23:01:54
【问题描述】:

是这样吗?当您在 App Store 上提交应用更新时,NSUserDefaults 会被重置,还是会被重置?

我的应用在更新时会崩溃,但在完全下载时不会崩溃 - 所以我试图确定更新后的会话与新下载的会话可能有什么不同。

干杯, 尼克。

【问题讨论】:

标签: iphone crash nsuserdefaults


【解决方案1】:

除非用户删除应用程序,否则它们通常不会重置。对于基本数据,NSUserDefaults 是保存偏好、日期、字符串等数据的最佳方式。如果您要保存图像和文件,文件系统是更好的选择。

【讨论】:

  • Apple 文档中是否有提到这一点?
  • 对不起 - 我忘了感谢您的快速答复! - 如果有人能找到任何形式的 Apple 文档的链接,那就太好了....这似乎是 Apple 更新应用程序最安全的方式!
  • 这可能是最安全的方式,但如果用户在应用更新时必须重新设置所有偏好,这对用户来说会非常烦人。我通常每天有三到四个应用程序更新;我相信其他 iPhone 用户拥有更多。擦除每次更新的偏好基本上会使我的 iPhone 无法使用。
  • 文档文件夹中的数据可以像 NSUserDefaults 一样容易地消失。然而,它们都是罕见的情况,与正常的升级过程完全无关
  • 感谢 Kristopher - 是的,我同意。我的问题是我使用 NSUserDefaults 来存储程序事件,并依赖于在安装应用程序时重置它们。我在 iPhone 设备上的所有测试(和 Apple 测试)都将应用程序作为新安装进行了测试。在没有任何文档或方法作为更新进行测试的情况下,我无法重复我们所有客户现在遇到的更新崩溃。总而言之 - 可能是一个艰难的教训!
【解决方案2】:

我相信答案是肯定的,它将持续存在。这在 Apple iPhone OS 编程指南的应用程序目录章节中也有完整的记录。

【讨论】:

    【解决方案3】:
    1. 直接回答发布的问题:是。
    2. 您的问题: 由于逻辑问题,您的应用程序崩溃了。假设您将一个对象存储在默认值中,并且应用程序在启动时(或其他地方)检查它的值。在您更新时,您可以更改检查或使用它的方式,例如您期望一个值,但该对象为零,反之亦然。这可能会导致 SIGABRT 或 EXC_BAD_ACCESS。

    【讨论】:

      【解决方案4】:

      如果您有 CoreData 模型并且您更改了模型中的某些内容并进行了更新,但没有管理迁移,这可能是您的应用在更新时崩溃的原因...

      【讨论】:

      • 我希望这可能是一个案例 :) 不是 NSUserdefault
      【解决方案5】:

      我也有类似的经历。我们的应用程序在 Settings.Bundle/Root.Plist 中存储了一个版本号。这通过 iPhone 设置应用程序显示。我们发现,在安装时,版本号是从应用程序包中加载的——因此版本号是正确的。在更新时,版本号不会改变。这给人的印象是用户正在运行应用程序的早期版本。我们没有与版本号相关的任何逻辑,它只是为了显示(它可以供联络中心工作人员在诊断故障时使用)。

      我们的经验是,当用户更新我们的应用时,NSUserDefaults 不会被清除,但设置显示也不会更新。

      【讨论】:

        【解决方案6】:

        请注意这种情况,当您的应用在后台运行并且您无法访问 NSUserDefaults 中存储的值时:

        埃里克:

        关于这个有很多线程和错误,但它在 ios 9 中再次发生在我身上。我有一个应用程序在后台启动以响应 NSURLSession 任务和内容可用推送。可重复地,如果我重新启动手机并等待后台启动我的应用程序,那么当我打开应用程序时,我发现 [[NSUserDefaults standardUserDefaults] dictionaryRepresentation] 包含所有系统值,例如AppleITunesStoreItemKinds 等,但不包含我设置的任何值。如果我强制退出并重新启动应用程序,我的所有值都会回来。有没有办法避免它在手机解锁之前缓存“空”的standardUserDefaults,或者至少确定它们何时被搞砸并修复它们而不必强制退出应用程序?

        爱斯基摩人 (eskimo1@apple.com):

        这里的问题是 NSUserDefaults 最终由应用容器中的文件支持,并且应用容器受数据保护。如果你没有做任何特别的事情,那么在 iOS 7 及更高版本上,你的容器使用 NSFileProtectionCompleteUntilFirstUserAuthentication,这是一个由 NSUserDefaults 后备存储继承的值,因此你无法在首次解锁之前访问它。

        IMO 解决此问题的最佳方法是避免 NSUserDefaults 用于您在可以在后台执行的代码路径中依赖的内容。而是将这些设置存储在您自己的首选项文件中,您可以明确管理其数据保护(在这种情况下,这意味着“设置为 NSFileProtectionNone”)。

        NSUserDefaults 在数据保护上下文中存在两个问题:

        它是一个完全抽象的 API:其后备存储的存在和位置不被视为该 API 的一部分,因此您无法明确管理其数据保护。

        注意在 OS X 的最新版本中,NSUserDefaults 由守护进程管理,试图直接操纵其后备存储的人们遇到了问题。很容易想象在某个时候同样的事情会出现在 iOS 上。

        即使可以更改数据保护,NSUserDefaults 也没有根据您使用数据的上下文对数据进行分类的机制;这是一个“全有或全无”的 API。在您的情况下,您不想删除所有用户默认设置的保护,只需要在首次解锁之前在后台访问的保护。

        最后,如果这些数据中的任何一个是真正敏感的,则应将其放入钥匙串中。值得注意的是,钥匙串确实具有逐项设置数据保护的能力。

        来源: https://webcache.googleusercontent.com/search?q=cache:sR9eZNHpZtwJ:https://forums.developer.apple.com/thread/15685

        【讨论】:

          猜你喜欢
          • 2012-02-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-13
          • 1970-01-01
          • 2014-02-17
          • 2012-04-02
          相关资源
          最近更新 更多