是这样的吗?当您在App Store上向应用程序提交更新或重置时,NSUserDefaults会重置吗?
我的应用程序在更新时崩溃但在完全下载时没有崩溃 - 所以我正在尝试确定更新的会话中可能与新下载的会话有什么不同。
干杯, 尼克。
答案 0 :(得分:111)
除非用户删除应用,否则通常不会重置它们。对于基本数据,NSUserDefaults是保存数据的最佳方式,如首选项,日期,字符串等。如果您希望保存图像和文件,文件系统是更好的选择。
答案 1 :(得分:7)
我相信答案是肯定的,它会坚持下去。这也完全记录在Apple iPhone OS编程指南的应用程序目录章节中。
答案 2 :(得分:4)
答案 3 :(得分:2)
如果您拥有Core Data模型且您在模型中更改了某些内容并进行了更新,而无需管理迁移,则可能是您的应用在更新时崩溃的原因......
答案 4 :(得分:1)
我有类似的经历。我们的应用程序在Settings.Bundle / Root.Plist中存储版本号。这将通过iPhone设置应用程序显示。我们发现在安装时,版本号从应用程序包中加载 - 因此版本号是正确的。但是在更新时,版本号不会更改。这给人的印象是用户正在运行以前版本的应用。我们没有任何与版本号相关联的逻辑,它仅用于显示(在诊断故障时可由联络中心工作人员使用)。
我们的经验是,当用户更新我们的应用程序时,NSUserDefaults不会被清除,但“设置”屏幕也不会更新。
答案 5 :(得分:0)
请注意这种情况,当您的应用在后台运行并且您无法访问NSUserDefaults中存储的值时:
Eric:
对此有很多线程和错误,但是在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。对于您而言,您不想从所有用户默认设置中删除保护,只是想要在首次解锁之前需要在后台访问的那些默认设置即可。
最后,如果这些数据中的任何一个确实是敏感的,则应将其放在钥匙串中。值得注意的是,钥匙串确实可以逐项设置数据保护。