NSUserDefaults版本更新的灵活性

时间:2010-07-14 06:40:30

标签: iphone macos versioning nsuserdefaults

我正在使用NSUserDefaults'api -registerDefaults api来注册我的应用程序的出厂默认设置。一切都适用于该应用程序的第一个版本。但是当我提供iPhone应用程序的更新时,我有3个标准来确保:

  1. 旧版应用的用户首选项应保持不变。
  2. 应该应用特定于新版本的出厂默认值。
  3. 为未来版本更新提供设计灵活性,以便用户默认根据新版本修改自身。
  4. api -registerDefaults未在新版本更新中注册出厂默认设置,因为包含用户首选项的plist文件已存在于沙箱的/ Library / Preferences中。如果我们使用新的出厂默认设置重置首选项,则先前版本的用户首选项将丢失。

    我认为应该有一个设计模式来处理这种情况,所以一般来说我们如何迎合这种情况? Apple没有为此提供任何固有的支持吗?或者我错过了一些链接,我试着用谷歌搜索而没有任何成功。

    谢谢, 拉吉

3 个答案:

答案 0 :(得分:1)

如果您正在讨论的这个项目列表是在单个键下注册的数组,则是,传递给-registerDefaults:的较大数组将被忽略,以支持存储在持久性plist中的较小数组。 NSUserDefaults基于每个键跟踪内容,并且不会对您存储的内容进行任何解释,因此它不会尝试自动将先前的数组值与新数组值合并,或任何类似的愚蠢。

如果您希望在用户升级时默认将新项目添加到此阵列,我建议您通过获取现有阵列,添加新项目,然后将较大的阵列保存回来自行将项目明确添加到密钥中再次向用户默认。您可以使用单独的布尔标志来指示升级已完成,以确保不会多次执行添加。

答案 1 :(得分:0)

有什么问题?如果用户从未更改(或更确切地说:设置)首选项,则将使用出厂默认设置。如果您的应用更新更改了出厂默认设置,则会使用这些更新。如果用户设置了自己的偏好,则会继续使用。

新的出厂默认设置不会(也不应该)覆盖用户设置首选项。 NSUserDefaults完全符合您的要求。

答案 2 :(得分:0)

我同意Johan Kool的观点。用户默认值可以正常工作。如果您希望在更新的应用程序版本中更改(无论出于何种原因),只需稍微重命名首选项。例如,如果someValue是版本1中的首选项,则在版本2中将其命名为someValue_v2,并且新的出厂默认值将生效。