SystemConfiguration 框架简介

在电脑开启时,configd 守护线程便会开启,进行网络配置,而 SystemConfiguration.framework 则是与该线程进行会话,从而管理网络配置的。

该框架主要有两个目的,一是提供动态的网络配置,使得用户可以对网络无缝连接,另一个是支持应用对网络的创建、修改以及网络服务的访问。

对于简单的网络连接状态变化,该框架中直接提供了一些方法,可以监听相关的状态值,从而避免开发人员去涉及较低层的方法,如常用的 AFNetworking 第三方库就使用了该框架中的方法来监听网络连接的状态变化。

对于从事网络配置或拨号软件相关工作的开发人员,除了了解该框架中检查网络状态的相关方法,更应关注网络偏好设置和配置相关的方法。

框架中的一些名词:

  • Location,地点,是对网络连接环境的描述,由用户在网络偏好设置中创建,是面向普通用户的。
  • Set,集合,一个地点所包含的网络配置,如 IP 地址、接口信息、系统配置等,是面向开发人员的。
  • Network service,网络服务,是描述网络接口和连接的实体的集合,这些实体中所包含的信息,能确保一个网络服务生效。
  • Network entity,网络实体,描述一个实体的属性集合,如 PPP、DNS 协议,都是通过一组属性进行描述的。
  • Interface,接口,表示物理连接,如以太网。

Location 和 Set 都是对一个完整的网络配置的描述,只是使用的人不同而已。

系统网络配置分为多个部分,各个部分通过相互配合,才能够提供强大方便的网络服务,各部分如下:

  • 存储所有网络配置偏好和所选系统信息的持久化文件
  • 存储当前使用的网络配置信息的动态存储空间
  • 协调管理上面两个部分的配置管理者(可以同时存在多个管理者,处理相关的配置变化事件)
  • 定义了网络配置过程中使用的数据类型文件
  • 访问或修改网络配置以及消息推送等操作的接口

从网络感知到网络服务提供及拨号应用的相关接口,该框架都有提供。只是需要创建、修改网络服务的接口较为底层,使用了专门的名词来描述相关配置,要进行底层网络服务的编程,需要先了解相关名词。并且,此操作需要修改配置文件,就需要根权限。另外,还会涉及到其他框架的使用,如创建一个网络服务,就需要结合 IOKit 框架中的方法。

/usr/sbin 下,有两个命令 scutilscselect ,分别是网络 system configure 的管理工具和选择命令。

在测试时,也可以使用 ipconfig 命令,来设置相关网络参数,具体使用方式可使用 man ipconfig 命令查看。

实际上,可以打开 /Library/Preferences/SystemConfiguration/preferences.plist 配置文件,查看所有的网络配置信息,更好的理解配置信息的组织方式。但是,该文件对于该系统配置框架是私有的,不要在程序中直接使用它,或者编辑它。

这个文件存储了所有的网络配置,但是应用并不是从该文件获取网络动态的,而是通过读取动态存储的状态值。为了避免开发者的应用直接监听底层网络状态的变化,configuration agents 会根据底层事件来实时更新存储的动态网络配置,而顶层的应用只要通过该框架注册监听感兴趣的值即可。

当然,能使用框架提供的接口的,就应避免去监听具体的值,无法避免,则需要参考 SCSchemaDefinitions.h 文件,明白具体应该监听哪个值,也可参见官方文档 The System Configuration Schema。