Answers:
除非用户删除应用程序,否则通常不会重置它们。对于基本数据,NSUserDefaults是保存诸如首选项,日期,字符串等数据的最佳方法。如果要保存图像和文件,文件系统是一个更好的选择。
如果您拥有CoreData模型,并且在不管理迁移的情况下更改了模型并进行了更新,那可能就是您的应用在更新时崩溃的原因...
请注意这种情况,当您的应用程序在后台运行并且您无法在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由守护程序管理,尝试直接操作其后备存储的人员遇到了问题。很容易想象在同一时刻出现同样的事情。
即使可以更改数据保护,NSUserDefaults也不具有根据使用环境对数据进行分类的机制。这是一个“全有或全无”的API。在您的情况下,您不想从所有用户默认设置中删除保护,只是想要在首次解锁之前在后台访问的那些默认设置。
最后,如果其中任何数据确实是敏感的,则应将其放在钥匙串中。值得注意的是,钥匙串确实具有逐项设置数据保护的功能。
来源:https://webcache.googleusercontent.com/search?q = cache:sR9eZNHpZtwJ:https: //forums.developer.apple.com/thread/15685