NSUserDefaults是否通过更新到Appstore中的应用程序而持久化?


106

是这样吗 当您向App Store上的应用程序提交更新时,NSUserDefaults是否会重置?还是重置?

我的应用程序在更新时崩溃,但在完全下载时没有崩溃-因此,我试图确定在更新的会话中与最新下载的会话可能有何不同。

干杯,尼克。


在该文件中的文件,和图书馆将被保留:如文档索赔developer.apple.com/library/ios/#DOCUMENTATION/iPhone/...
格日Borbás

Answers:


116

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


5
在Apple文档中是否有提及的地方?
尼克·卡特赖特

1
抱歉-我忘了感谢您的快速回答!-如果任何人都可以找到指向任何形式的Apple文档的链接,这将是非常好的...。在NSUserDefaults的文档中,它对此无能为力,所以我认为我(错误地)认为默认值会被删除。对于苹果来说,这无疑是更新应用程序的最安全方法!
尼克·卡特赖特

这可能是最安全的方法,但是如果用户必须在应用程序更新时重新设置其所有首选项,这将使用户非常烦恼。我通常每天有三到四个应用程序更新;我敢肯定其他iPhone用户还有更多。清除每个更新的首选项基本上会使我的iPhone无法使用。
克里斯托弗·约翰逊

1
文档文件夹中的数据可以像NSUserDefaults一样轻松消失。但是,它们都是极少数的情况,并且与正常的升级过程完全没有关系
–coneybeare

1
谢谢克里斯托弗-是的,我同意。我的问题是我曾使用NSUserDefaults来存储编程事件,并依赖于在安装应用程序时将其重置。我在iPhone设备上进行的所有测试(以及Apple测试)都将该应用程序作为新安装进行了测试。没有任何文档或任何方法来测试更新,我无法重复更新崩溃,我们所有的客户现在都在经历。综上所述-大概是一个教训是艰难的!!
尼克·卡特赖特2009年

7

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


4
  1. 对发布的问题的直接答案:是。
  2. 您的问题:您的应用由于逻辑问题而崩溃。假设您将对象存储为默认对象,并且应用在启动时(或其他位置)检查其值。在更新中,您可以更改检查或使用它的方式,例如,您希望有一个值,但对象为nil,反之亦然。这可能会导致SIGABRT或EXC_BAD_ACCESS。


1

我也有类似的经历。我们的应用程序将版本号存储在Settings.Bundle / Root.Plist中。这将通过“ iPhone设置”应用程序显示。我们发现,在“安装”中,版本号是从应用程序捆绑包中加载的,因此版本号是正确的。但是,在更新时,版本号不会更改。这给人的印象是用户正在运行该应用程序的早期版本。我们没有任何逻辑与版本号相关联,仅用于显示(诊断中心可以由联系中心人员使用)。

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


0

请注意这种情况,当您的应用程序在后台运行并且您无法在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:sR9eZNHpZtwJhttps//forums.developer.apple.com/thread/15685

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.