Settings Bundle是iOS开发中独有的一个特性,它可以存放app的一些设置,使用起来非常方便。最近公司有一个项目用到了这个技术,于是我认真的研究了一下,发现了一些需要注意的地方,想跟大家分享一下。
任何一个项目都可以设置它的Settings Bundle,Settings Bundle字面意思就是设置的大集合,里面可以存放系统的默认设置和用户选择的值。我们可以通过点击左下角的“+”然后选择添加新文件(new file…)来生成:

完成后会发现项目中多了一个Settings.bundle文件,展开后一般会有一个本地化的语言包(en.lproj)和Root.plist文件。本地化语言包是做国际化时用到的,而Root.plist就是用来控制这个app在系统设置中显示设置内容的文件。通过查看这个Root.plist文件你就会发现这个文件像一个大字典,并且它跟info.plist很接近,都是通过XML语法来实现的,你可以在“Preference Items”这个数组中添加一些设置项目,项目种类包括:Group、Multi Value、Slider、Text Field、Title和Toggle Switch。每一个项目都是一个字典,里面都包含有一些键值对。
如果是顺序添加的话直接选中“Preference Items”后点击它旁边的“+”;如果不小心选错需要变更一下项目间的顺序怎么办呢?这里面有一个小技巧。因为Root.plist本质上是一个XML文件,所以我们可以通过查看它的源代码来调整顺序。在Root.plist文件单击右键,选择Open As→Source Code,将会显示XML格式的源码。把要更改顺序项目的 <dict> 和 </dict> 标签之间的内容(包括 <dict> 和 </dict> 标签)移到你想要的位置即可。

既然settings.bundle是app的设置总管,是不是程序一启动就会自动加载它里面的设置呢?我一开始也是这么认为的,可是在亲自尝试后发现不是那么回事。通过查阅相关文档我发现需要在程序启动成功后将settings.bundle中的设置注册到NSUserDefaults中去,这样才能取到设置的内容。
这里我推荐一个网站:iOS Developer Library。这个网站是苹果官方的开发者库,里面有大量的官方文档、技术问答以及示例代码。尤其要提一下示例代码,苹果的示例代码是会更新的,有时候从Xcode中的Organizer查到的不一定都是最新的示例代码。
在苹果的Developer Library中我查到了最新的AppPrefs示例代码,里面展示了如何在程序启动时拿到settings.bundle中的设置内容,以及如何立即更新更改的设置的方法(利用NSUserDefaultsDidChangeNotification)。我们可以直接把AppPrefs中的代码复制到自己的项目中使用。
最后说一下,一般示例代码中的内容就是为了展示思路和方法,最好不要照本宣科的完全复制。比如这个AppPrefs,它把读取settings.bundle内容的代码放在了AppDelegate中,我个人感觉这样做会让AppDelegte类显得十分臃肿,应该把读取的代码单独放在另外一个类中,我会选择做一个NSUserDefaults的类别(category)来存放。