我们知道,当安装了一个iOS应用程序后,在系统的设置中,就会为此应用生成一个单独的设置模块,可以在其中控制应用的网络权限、推送权限等系统设置项。除了系统功能的相关设置外,其实应用程序也有许多自身设置的需求,例如应用缓存数据的设置、应用主题的设置以及用户账户的设置等。通常,应用自身的设置会由开发者自行开发,在应用内提供页面来承载,这使得应用的设置被割裂成了两部分。其实,iOS系统的设置页面也提供了不同应用进行定制的能力,例如系统的Safari浏览器应用,其设置页面如下:
本篇文章将讨论应用自定义系统设置页面的技术细节,某些场景下,将应用设置项合并入系统设置可以提供给用户更一致的使用体验。
应用本身设置项的配置需要定义在一个plist文件中。在项目中可以直接新建一个Settings Bundle文件,如下:
生成的Bundle中包含一个国际化文件和一个Root.plist文件,国际化的文件我们暂不关心,其用来根据用户本地的语言环境来映射不同语言的字符串。Root.plist文件是配置设置项的核心文件。其内容如下:
模版中默认定义了4个item,分别用来显示一个分组头、输入框、开关和滑块组件。效果如下:
每个配置项的意义和用法,我们后续在详细介绍。可以看到,通过Plist文件的配置,我们可以在设置页面中添加许多可用户交互的组件。要读取用户设置情况也非常简单,只需要读取此Bundle文件中的Root.plist文件即可,例如:
let path = Bundle.main.path(forResource: "Settings", ofType: "bundle")
let settings = NSDictionary(contentsOfFile: path!.appending("/Root.plist"))
需要注意,Plist文件中的键与在Xcode中看到的键值并不一致,Xcode对键值进行了可读化,你可以以文件的方式查看,即可看到真正的键名,例如上面的设置文件内容为:
- PreferenceSpecifiers
此键是必须的,设置为一个数组,数组中每个具体的元素即是配置设置项的每一项。数组的顺序会决定设置项的排序。
- StringsTable
设置用来进行语言本地化的文件名。
- ApplicationGroupContainerIdentifier
用来设置Group标识,用来在小组件等扩展中访问此设置。
配置的核心是PreferenceSpecifiers,其配置的数组中的元素根据不同的type会渲染不同的组件,能支持的类型包括如下几种:
1. PSTextFieldSpecifier:文本输入框。
2.PSTitleValueSpecifier: 只读的标题,只能用来显示信息。
3.PSToggleSwitchSpecifier:开关。
3.PSSliderSpecifier:滑块。
4.PSMultiValueSpecifier:多选列表,点击后会跳转到一个新的页面,其中提供一组选项供选择。
5.PSGroupSpecifier:分组,用来对选项进行分组,此处可以理解为分组的分割线,能够设置标题。
6.PSRadioGroupSpecifier: 此类型也用来设置选则列表,与PSMultiValueSpecifier不同的是其不会跳转到新的页面,而是直接在当前页面展示列表。
7.PSChildPaneSpecifier: 此类型用来设置一个子页面,其可以配置另一个Plist文件来展示子页面的选项。
下面将逐一对这些类型进行介绍。
用来渲染一个分组,可配置字段:
设置分组标题。
设置尾部文案。
- SupportedUserInterfaceIdioms
设置只在某些设备上显示,例如”iPhone“
配置效果:
设置标题。
子设置页面Plist文件名。
- SupportedUserInterfaceIdioms
设置只在某些设备上显示,例如”iPhone“
直接展开的选择列表。
设置标题。
设置尾部文案。
唯一标识。
默认的选中项。
一组选项的值。
一组选项显示的标题。
- DisplaySortedByTitle
布尔值,选项是否根据标题进行排序。
- SupportedUserInterfaceIdioms
设置只在某些设备上显示,例如”iPhone“
配置效果:
设置标题。
唯一标识。
默认的选中项。
一组选项的值。
一组选项显示的标题。
- ShortTitles
配置一组短标题,设置后会显示短标题,点击后进入新的页面展示长内容。
- DisplaySortedByTitle
布尔值,选项是否根据标题进行排序。
- SupportedUserInterfaceIdioms
设置只在某些设备上显示,例如”iPhone“
文本输入框。
设置标题。
唯一标识。
默认的值。
- IsSecure
是否加密。
- KeyboardType
弹出的键盘类型。
- AutocapitalizationType
自动大小写模式。
- AutocorrectionType
自动拼写纠正。
- SupportedUserInterfaceIdioms
设置只在某些设备上显示,例如”iPhone“
设置标题。
唯一标识。
显示的值。
存储在数据库中的一组值。
存储在数据库中的一组key。
- SupportedUserInterfaceIdioms
设置只在某些设备上显示,例如”iPhone“
唯一标识。
默认值。
滑块的最小值。
滑块的最大值。
最小值一侧显示的图片。
最大值一侧显示的图片。
- SupportedUserInterfaceIdioms
设置只在某些设备上显示,例如”iPhone“
设置标题。
唯一标识。
默认开关状态。
开关开启时绑定的值,不会显示。
开关关闭时绑定的值,不会显示。
- SupportedUserInterfaceIdioms
设置只在某些设备上显示,例如”iPhone“