logo头像

学如逆水行舟

iOS自定义应用设置页面

iOS自定义应用设置页面

引言

我们知道,当安装了一个iOS应用程序后,在系统的设置中,就会为此应用生成一个单独的设置模块,可以在其中控制应用的网络权限、推送权限等系统设置项。除了系统功能的相关设置外,其实应用程序也有许多自身设置的需求,例如应用缓存数据的设置、应用主题的设置以及用户账户的设置等。通常,应用自身的设置会由开发者自行开发,在应用内提供页面来承载,这使得应用的设置被割裂成了两部分。其实,iOS系统的设置页面也提供了不同应用进行定制的能力,例如系统的Safari浏览器应用,其设置页面如下:

本篇文章将讨论应用自定义系统设置页面的技术细节,某些场景下,将应用设置项合并入系统设置可以提供给用户更一致的使用体验。

从一个小示例开始

应用本身设置项的配置需要定义在一个plist文件中。在项目中可以直接新建一个Settings Bundle文件,如下:

生成的Bundle中包含一个国际化文件和一个Root.plist文件,国际化的文件我们暂不关心,其用来根据用户本地的语言环境来映射不同语言的字符串。Root.plist文件是配置设置项的核心文件。其内容如下:

模版中默认定义了4个item,分别用来显示一个分组头、输入框、开关和滑块组件。效果如下:

每个配置项的意义和用法,我们后续在详细介绍。可以看到,通过Plist文件的配置,我们可以在设置页面中添加许多可用户交互的组件。要读取用户设置情况也非常简单,只需要读取此Bundle文件中的Root.plist文件即可,例如:

1
2
let path = Bundle.main.path(forResource: "Settings", ofType: "bundle")
let settings = NSDictionary(contentsOfFile: path!.appending("/Root.plist"))

需要注意,Plist文件中的键与在Xcode中看到的键值并不一致,Xcode对键值进行了可读化,你可以以文件的方式查看,即可看到真正的键名,例如上面的设置文件内容为:

Plist文件配置项详解

Root.plist文件最外层可配置键

  • PreferenceSpecifiers

此键是必须的,设置为一个数组,数组中每个具体的元素即是配置设置项的每一项。数组的顺序会决定设置项的排序。

  • StringsTable

设置用来进行语言本地化的文件名。

  • ApplicationGroupContainerIdentifier

用来设置Group标识,用来在小组件等扩展中访问此设置。

配置的核心是PreferenceSpecifiers,其配置的数组中的元素根据不同的type会渲染不同的组件,能支持的类型包括如下几种:

1. PSTextFieldSpecifier:文本输入框。

2.PSTitleValueSpecifier: 只读的标题,只能用来显示信息。

3.PSToggleSwitchSpecifier:开关。

3.PSSliderSpecifier:滑块。

4.PSMultiValueSpecifier:多选列表,点击后会跳转到一个新的页面,其中提供一组选项供选择。

5.PSGroupSpecifier:分组,用来对选项进行分组,此处可以理解为分组的分割线,能够设置标题。

6.PSRadioGroupSpecifier: 此类型也用来设置选则列表,与PSMultiValueSpecifier不同的是其不会跳转到新的页面,而是直接在当前页面展示列表。

7.PSChildPaneSpecifier: 此类型用来设置一个子页面,其可以配置另一个Plist文件来展示子页面的选项。

下面将逐一对这些类型进行介绍。

PSGroupSpecifier

用来渲染一个分组,可配置字段:

  • Title

设置分组标题。

  • FooterText

设置尾部文案。

  • SupportedUserInterfaceIdioms

设置只在某些设备上显示,例如”iPhone“

配置效果:

PSChildPaneSpecifier

  • Title

设置标题。

  • File

子设置页面Plist文件名。

  • SupportedUserInterfaceIdioms

设置只在某些设备上显示,例如”iPhone“

PSRadioGroupSpecifier

直接展开的选择列表。

  • Title

设置标题。

  • FooterText

设置尾部文案。

  • Key

唯一标识。

  • DefaultValue

默认的选中项。

  • Values

一组选项的值。

  • Titles

一组选项显示的标题。

  • DisplaySortedByTitle

布尔值,选项是否根据标题进行排序。

  • SupportedUserInterfaceIdioms

设置只在某些设备上显示,例如”iPhone“

配置效果:

PSMultiValueSpecifier

  • Title

设置标题。

  • Key

唯一标识。

  • DefaultValue

默认的选中项。

  • Values

一组选项的值。

  • Titles

一组选项显示的标题。

  • ShortTitles

配置一组短标题,设置后会显示短标题,点击后进入新的页面展示长内容。

  • DisplaySortedByTitle

布尔值,选项是否根据标题进行排序。

  • SupportedUserInterfaceIdioms

设置只在某些设备上显示,例如”iPhone“

PSTextFieldSpecifier

文本输入框。

  • Title

设置标题。

  • Key

唯一标识。

  • DefaultValue

默认的值。

  • IsSecure

是否加密。

  • KeyboardType

弹出的键盘类型。

  • AutocapitalizationType

自动大小写模式。

  • AutocorrectionType

自动拼写纠正。

  • SupportedUserInterfaceIdioms

设置只在某些设备上显示,例如”iPhone“

PSTitleValueSpecifier

  • Title

设置标题。

  • Key

唯一标识。

  • DefaultValue

显示的值。

  • Values

存储在数据库中的一组值。

  • Titles

存储在数据库中的一组key。

  • SupportedUserInterfaceIdioms

设置只在某些设备上显示,例如”iPhone“

PSSliderSpecifier

  • Key

唯一标识。

  • DefaultValue

默认值。

  • MinimumValue

滑块的最小值。

  • MaximumValue

滑块的最大值。

  • MinmumValueImage

最小值一侧显示的图片。

  • MaximumValueImage

最大值一侧显示的图片。

  • SupportedUserInterfaceIdioms

设置只在某些设备上显示,例如”iPhone“

PSToggleSwitchSpecifier

  • Title

设置标题。

  • Key

唯一标识。

  • DefaultValue

默认开关状态。

  • TrueValue

开关开启时绑定的值,不会显示。

  • FalseValue

开关关闭时绑定的值,不会显示。

  • SupportedUserInterfaceIdioms

设置只在某些设备上显示,例如”iPhone“