文章

利用声明式管理数据模型来扩展设备

使用声明式管理使设备更加自主化和主动化。

概览

iOS 15 中引入了声明式设备管理,它使用声明式数据模型范式。这一范式使服务器能够避免常见的性能和可扩展性问题,这些问题通常与通过 MDM 序列化命令和轮询设备有关。

虽然声明式管理是一种新的范式,但它并不是新的协议:协议已添加到现有 MDM 协议中,以简化采用过程。

声明式管理数据模型有三个关键组成部分:声明,支持设备功能;状态,用于跟踪设备状态的变化;可扩展性,使设备和服务器能够公布它们的功能随时间推移而发生的变化。

使用声明来定义策略、指定资产和存储组织信息

声明是服务器使用声明式管理协议定义并同步到设备的有效负载。它们代表组织希望在设备上强制执行的策略以及管理元数据等其他项目。

声明是架构驱动的数据模型,序列化为 JSON 对象。每个声明都有一组通用键,每个键都是必需的。

类型

内容

Type

字符串

声明类型。以句点分隔的令牌序列。

Identifier

字符串

发送到设备的所有声明构成的集合中的唯一标识符。它通常为 UUID 字符串。

ServerToken

字符串

声明的唯一修订版本的标识符。

Payload

词典

声明的数据专属部分,包含相应声明类型的键和值。

Type 定义声明类型。标准类型带有 com.apple. 前缀。类型的下一个组成部分为 activationassetconfigurationmanagement。每种声明类型都有自己的附加组成部分,它们将类似的项目组合在一起。例如,代表不同类型账户的配置带有 com.apple.configuration.account. 前缀。

Identifier 在发送到设备的所有声明构成的集合中唯一标识单个声明。它通常为 UUID 值。在服务器和设备之间同步声明时,这个值是主键,用于将服务器发送的声明集与设备之前收到的声明集进行匹配。

ServerToken 键代表特定声明的修订版本。例如,Identifier 设置为 AServerToken 设置为 2 的声明是 Identifier 设置为 AServerToken 设置为 1 的声明的更新。这个键的值可以是 UUID 或简单计数器。当声明的 Payload 的任何部分发生变化时,请更新此值以进行正确同步。

IdentifierServerToken 组合在一起,使设备能够在同步操作期间确定哪些声明是新增的、哪些已更改或者哪些已移除。

Payload 键是一个对象,代表与声明类型相关的数据。正式架构定义了每种声明类型的必要和可选数据。值可以是字符串、数字、布尔值、数组或词典,并且可能被限制在特定范围内,例如数字 1 到 10,或者被限制为一组特定的值,例如字符串枚举。

每个声明都有关联的 activevalid 状态,设备会通过状态通道与服务器共享这些状态。有四种类型的声明:配置、资产、激活和管理。

使用配置声明来定义策略

配置代表应用于设备的策略。例如账户、设置和限制、网络设置、字体等。配置类似于 MDM 的描述文件有效负载。

每个配置都有 active 状态,如果设备将实现由配置定义的策略,则为 true,否则为 false

配置还有 valid 状态,它可以为以下 3 个值之一:

  • valid:系统已检查配置并且配置有效。

  • invalid:系统已检查配置并且配置无效。

  • unknown:系统尚未检查配置。

如果满足以下条件,则配置有效:

  • 系统已成功从服务器同步配置。

  • 配置是符合配置类型定义的架构的有效 JSON 对象。

  • 所有引用的资产都有效。

  • 当配置处于活跃状态时,设备可以应用策略。

使用资产声明来指定其他数据

资产代表配置所需的辅助数据。资产有两个主要用例:

  • 大型数据:大型数据项,如图像、字体或整个字体套件。在这种情况下,资产的 Payload 包含一个 URL 值指向实际数据的键。这样就可以将大型数据项的分发从管理服务器转移到更适合处理此类流量的服务器 (例如内容分发网络)。资产的数据仅在需要时下载。

  • 个人数据:特定于用户的数据,如姓名、电子邮件地址、账户密码或证书。它将每个用户的定制数据从配置中移出,并将这些数据移入更小的专用对象。

资产与配置之间是一对多的关系:一个资产可以被多个配置引用。引用以配置有效负载中的特定键形式来实现,它的值是资产的 Identifier 键值。

资产的数据可以单独更新,而无需更新引用它的配置。系统可以对在多个配置之间共享的每个用户的数据或者大型数据项进行小幅增量更新。

资产具有 active 状态,如果至少一个活跃配置引用了资产,则为 true,否则为 false

资产还有 valid 状态,它可以为以下 3 个值之一:

  • valid:系统已检查资产并且资产有效。

  • invalid:系统已检查资产并且资产无效。

  • unknown:系统尚未检查资产。

如果满足以下条件,则资产有效:

  • 系统已成功从服务器同步资产。

  • 资产是符合资产类型定义的架构的有效 JSON 对象。

  • 当资产处于活跃状态时,所有引用的资产数据都会成功下载。

使用激活声明对配置应用逻辑

激活指定用于确定系统如何以及何时将配置定义的策略应用于设备的逻辑。激活包含系统以原子方式应用于设备的一组配置,这样一来系统要么同时应用所有引用的配置,要么不应用任何配置。因此,所有配置和这些配置引用的资产必须有效,系统才能应用激活。

激活具有 active 状态,如果激活尝试应用配置定义的策略,则为 true,否则为 false

激活还有 valid 状态,它可以为以下 3 个值之一:

  • valid:系统已检查激活并且激活有效。

  • invalid:系统已检查激活并且激活无效。

  • unknown:系统尚未检查激活。

如果满足以下条件,则激活有效:

  • 系统已成功从服务器同步激活。

  • 激活是符合激活类型定义的架构的有效 JSON 对象。

激活与配置之间是多对多的关系:一个激活可以引用多个配置,多个激活可以引用同一配置。

如果引用某一配置的至少一个激活处于活跃状态,系统就会应用这一配置定义的策略。

激活可以包含一个定义表达式的谓词,系统会对表达式进行求值,求值结果用于确定激活处于活跃还是非活跃状态,但是须遵守其他有关激活的规则 (如上所述)。

谓词是一个符合 Apple《谓词编程指南》 的字符串。不符合谓词语法的字符串值被视为错误,并且激活不会变为活跃状态。

谓词表达式可以包含对声明式设备管理数据的引用,如状态项和管理属性,这些引用应符合 Apple 的键值协议 (请参阅“About Key-Value Coding”,了解更多信息)。引用的项目必须显示在谓词的扩展项中,以便与其他谓词项正确区分,并允许使用谓词令牌中通常不允许使用的字符。

@status

这个键用于引用整个状态项。

@key

这个键用于引用状态项对象属性。

@property

这个键用于引用管理属性。

以下是用于检查设备是否为 iPad 的谓词示例:

(@status(device.model.family) == 'iPad')

使用管理声明来定义组织数据

管理声明传递管理元数据,如有关管理设备的组织的信息,以及有关服务器支持功能的详细信息。

管理声明具有 active 状态,它始终为 false,因此不参与激活过程。

管理声明还有 valid 状态,它可以为以下 3 个值之一:

  • valid:系统已检查管理声明并且管理声明有效。

  • invalid:系统已检查管理声明并且管理声明无效。

  • unknown:系统尚未检查管理声明。

如果满足以下条件,则管理声明有效:

  • 系统已成功从服务器同步管理声明。

  • 管理声明是符合管理声明类型定义的架构的有效 JSON 对象。

使用状态来报告设备状态

设备使用状态报告将设备状态的变化以 JSON 状态项的形式反馈给服务器。设备状态分为以下几类:

  • 管理状态 - 设备上所有声明的 valid 和 active 状态,以及描述声明为什么处于无效或非活跃状态的任何错误详情。

  • 设备属性 - 设备的属性 (例如设备机型、操作系统版本等)。

  • 其他属性 (账户、密码和 MDM 安装的 App)。

状态项包含状态名称 (类似于“键路径”) 和关联的值。状态名称是一个字符串,包含以句点分隔的令牌序列 (例如 device.identifier.serial-number)。名称的每个分段定义了整个分层状态词典中的一个键。

思考下面的三个状态项:device.identifier.serial-numberdevice.identifier.udidmanagement.push-token。设备报告的状态为:

{
  "device": {
     "identifier": {
        "serial-number": "abc123",
        "udid": "d4bffb90be0845c6a8b8184a7e06d487"
     }
  },
  "management": {
     "push-token": "xyz789"
  }
}

状态项的值可以是字符串、数字、布尔值、空或数组。

状态项数组的值包含 JSON 对象,这些对象具有明确定义的架构,并且数组中的所有项目使用同一架构。这些架构专用于状态代表的项目类型。设备以增量方式报告数组状态项的变化 (请参阅 StatusReport,了解更多详细信息)。

要在状态项发生变化时接收它们的更新,服务器必须通过向设备发送 ManagementStatusSubscriptions 声明来订阅每个状态项。所有管理状态项 (以 management. 名称前缀开头) 会被自动报告给服务器,无需在状态订阅中引用。

当设备状态发生变化或者状态订阅声明变为活跃状态时,设备会向服务器发送 StatusReport

使用客户端和服务器功能来匹配功能集

随着系统不断添加、修改和弃用项目,声明式管理支持的功能和特性集可能会随着时间的推移而发生变化。设备和服务器会互相公布它们的功能和特性,因此即使服务器和设备单独升级,它们也能采用新的行为,而无需使它们保持同步。

设备通过 StatusManagementClientCapabilities 状态项公布它支持的声明类型和状态项集。当设备启用声明式管理时,它会将这个状态项发送到服务器。服务器需要针对每个注册永久保留这个状态项,因为功能集可能不仅仅因设备类型或操作系统版本而异。服务器不应向它尚未公布为支持的设备发送声明。

服务器通过它在启用声明式管理时向设备发送的 ManagementServerCapabilities 声明,来公布它支持的协议功能集。如果在启用后的任何时间服务器功能发生变化,则服务器应通过常规声明同步流程来使用新值更新设备。

另请参阅

当前页面为“利用声明式管理数据模型来扩展设备”