WWDC Quick Look 💓 By SwiftGGTeam
Meet declarative device management

Meet declarative device management

观看原视频

Highlight

Apple 在现有 MDM 协议中加入声明式设备管理,让 iOS 15 和 iPadOS 15 的用户注册设备在本地判断策略、应用配置,并通过状态通道主动向服务器报告变化。

核心内容

大型组织管理设备,最怕的是来回问。

一台设备的策略变了,服务器要发命令。设备执行后,服务器还要继续查询状态。几千台设备一起更新时,这些往返请求会堆在服务器上。管理员想知道设备是否已经满足密码策略,也只能等下一轮轮询。

Apple 在这场 session 里给出的答案,是声明式设备管理(Declarative Device Management)。服务器不再把每一步操作拆成命令下发,改为把组织想要的策略写成声明,发送给设备。

设备拿到声明后,在本地判断当前状态。状态匹配,就应用策略。状态变化,就重新计算。服务器不用一直追问设备,只订阅自己关心的状态项。

这个变化直接解决了两个痛点。

第一,策略判断靠近设备。设备知道自己的系统版本、硬件型号、声明是否已应用,能立即处理状态变化。

第二,状态报告变成主动推送。设备通过状态通道(status channel)报告关键变化,服务器只接收订阅项和声明状态变化。

Apple 没有要求 MDM 厂商替换协议。声明式能力集成在现有 MDM 协议里,继续使用注册、注销、HTTP 传输、设备认证和用户认证这些已有机制。

详细内容

声明:把组织策略写成 JSON

03:16)声明(Declaration)表示组织希望设备执行的策略,例如账户、设置和限制。它的结构类似 profile payload,网络传输时使用 JSON object,而非 plist。

所有声明都有三个必需属性:TypeIdentifierServerTokenPayload 存放和声明类型相关的数据。

{
  "Type": "passcode configuration",
  "Identifier": "4D2A0F90-1E1B-4B73-9B8D-8C4D6D1C0F11",
  "ServerToken": "revision-1",
  "Payload": {
    "Policy": "device passcode restrictions"
  }
}

关键点:

  • Type 定义这条声明代表哪一种策略,session 用密码配置作为例子。
  • Identifier 在设备收到的所有声明中唯一标识这一条声明,通常是 UUID 字符串。
  • ServerToken 表示这条声明的某个修订版本,同一个 Identifier 的每次修订都要使用不同值。
  • Payload 存放具体策略数据,不同声明类型会有不同字段。

声明分为四类:配置(configuration)、资源(asset)、激活(activation)和管理(management)。这四类合在一起,构成设备本地可执行的策略模型。

配置和资源:把公共策略与用户数据拆开

05:02)配置(configuration)表示要应用到设备的策略,作用接近现有 MDM profile payload。账户、设置、限制都可以做成配置声明。

资源(asset)表示配置需要引用的辅助数据。大文件可以放在 URL 后面,让设备从 MDM 服务器或内容分发网络(CDN)下载。用户姓名、邮箱、账户密码、证书也可以独立成资源声明。

{
  "Type": "user identity asset",
  "Identifier": "7B52C2F5-A5D8-46BC-9D31-8C02C4A69A22",
  "ServerToken": "revision-3",
  "Payload": {
    "FullName": "A Managed User",
    "EmailAddress": "[email protected]"
  }
}

关键点:

  • Type 表示这是一个用户身份资源,session 用它说明用户联系方式这类数据。
  • Identifier 让配置可以引用这份资源。
  • ServerToken 让设备知道资源是否更新。
  • Payload 保存用户相关数据,避免把每个用户的定制数据复制到多个配置里。

06:41)资源和配置是一对多关系。一个用户凭据资源可以被多个账户配置引用。凭据更新时,只更新资源;引用它的配置保持不变。设备会根据新资源更新策略。

激活:让设备原子性应用一组配置

07:38)激活(activation)表示设备要原子性应用的一组配置。组内配置和引用资源都有效时,设备才应用整组策略。任何一项无效,激活失败。

激活还可以包含 predicate(谓词)。设备用它判断激活状态是否为 active。session 举了两个例子:只在 iPad 上生效,或只在特定系统版本上生效。

{
  "Type": "simple activation",
  "Identifier": "0DCC1890-93AA-4F99-81D5-0F7B2E056D5D",
  "ServerToken": "revision-1",
  "Payload": {
    "Configurations": [
      "4D2A0F90-1E1B-4B73-9B8D-8C4D6D1C0F11",
      "C4712A8E-03F5-4B28-A7F5-35805E4D2F07"
    ],
    "Predicate": "device type is iPad"
  }
}

关键点:

  • Type 表示这是一条简单激活声明。
  • Identifier 标识这条激活声明。
  • Configurations 保存要一起应用的配置标识符。
  • Predicate 把业务规则下放到设备,设备状态变化后会重新求值。

09:16)设备状态变化时,激活谓词会重新求值,不需要服务器介入。新的策略会应用,过期策略会移除。没有 predicate 时,设备总是处理激活引用的配置。

状态通道:设备主动报告变化

10:23)声明状态和设备实际状态可能不一致。密码策略就是典型场景:策略已经下发,但用户还没有设置符合要求的新密码。

状态通道(status channel)用来补上这个可见性缺口。服务器订阅具体状态项,设备先发送初始报告,之后只在订阅项变化时发送增量报告。

{
  "Type": "status subscription configuration",
  "Identifier": "F2E64D28-4553-49E6-9380-8D7B50C4630A",
  "ServerToken": "revision-1",
  "Payload": {
    "StatusItems": [
      "device.operating-system.version",
      "device.model.family",
      "device.model.identifier"
    ]
  }
}

关键点:

  • Type 表示这是一条状态订阅配置。
  • StatusItems 列出服务器关心的状态 key-path。
  • device.operating-system.version 对应设备系统版本。
  • device.model.familydevice.model.identifier 对应设备类型和型号。

11:44)状态报告是增量的。设备从 iOS 14.5 升级到 iOS 15 后,只需要报告系统版本这个变化项。声明是否已应用的状态变化会自动报告,服务器无需订阅。

扩展性:设备和服务器互相声明能力

12:48)声明式管理把扩展性放进数据模型。设备和服务器会互相发布支持的能力,避免服务器硬编码系统版本或硬件依赖。

服务器能力通过管理声明发送给设备。设备能力通过状态项发送给服务器,能力变化时会重新报告。

{
  "Type": "server capabilities management",
  "Identifier": "A414E797-2ED0-4E76-9B6A-7F634BA18474",
  "ServerToken": "revision-2",
  "Payload": {
    "SupportedFeatures": [
      "declarative management feature"
    ]
  }
}

关键点:

  • Type 表示这是一条服务器能力管理声明。
  • SupportedFeatures 表示服务器支持的协议功能。
  • 服务器升级后,会像同步其他声明一样把新能力同步到设备。
  • 设备的能力变化会作为状态项报告给服务器。

13:31)客户端还会发布 supported payloads,列出它支持的声明和状态项。服务器拿到这些信息后,可以立即使用设备新增的特性和 payload。

MDM 集成:用现有协议启动和同步

14:17)声明式管理集成在现有 MDM 协议中。注册、注销、HTTP 传输、设备认证和用户认证继续沿用已有机制。声明和状态通道可以与现有 MDM commands、profiles 共存。

启动声明式管理需要新的 DeclarativeManagement MDM command。这个命令有两个作用:在设备上激活声明式管理;携带同步 token,在需要时启动同步流程。

{
  "Command": {
    "RequestType": "DeclarativeManagement",
    "SynchronizationTokens": {
      "DeclarationsToken": "server-token-value"
    }
  }
}

关键点:

  • RequestType 使用 DeclarativeManagement,对应 session 中新增的 MDM command。
  • 设备收到命令后会激活声明式管理。
  • 激活后不能关闭,但服务器可以移除全部声明,让声明式管理不再产生实际策略效果。
  • SynchronizationTokens 可用于触发同步流程。

16:16)设备同步声明和发送状态报告时,会使用新的 DeclarativeManagement CheckIn request type。

{
  "MessageType": "DeclarativeManagement",
  "Endpoint": "declaration-items"
}

关键点:

  • MessageType 设置为 DeclarativeManagement
  • Endpoint 设置为 declaration-items 时,设备请求声明 manifest。
  • 服务器返回 manifest,列出所有声明的 IdentifierServerToken
  • 对于新增或变化的声明,设备再用唯一资源路径发起 CheckIn request,获取单条声明 JSON。

17:22)迁移可以逐步进行。Apple 提供一种把 profile 作为配置安装的声明类型。服务器可以先把现有 profile 通过 URL 交给设备,让设备用声明式流程安装。

{
  "Type": "profile configuration",
  "Identifier": "2B1B2C10-88D5-4F8B-A2D7-5F5F29D93F31",
  "ServerToken": "revision-1",
  "Payload": {
    "ProfileURL": "https://mdm.example.com/profiles/account.mobileconfig"
  }
}

关键点:

  • Type 表示这是一条 profile 配置声明。
  • ProfileURL 指向现有 profile。
  • 激活这条配置后,设备从 URL 获取 profile 并安装。
  • 这种方式让 MDM 厂商先迁移策略逻辑,不必一次重写全部 profile 工作流。

iOS 15 首批支持范围

19:52)iOS 15 和 iPadOS 15 首批支持声明式管理。它只适用于用户注册(User Enrollment)类型,包括 iOS 15 新的 onboarding flow 和 iOS 13 已有流程。

Platform: iOS 15, iPadOS 15
Enrollment: User Enrollment
Configurations: account, passcode, profile, status subscription
Activations: simple activation with optional predicate
Assets: user identity, user credential
Management: organization details, server capabilities
Status: declaration status, device hardware model, operating system

关键点:

  • 账号和密码配置覆盖对应的 MDM account 和 passcode profile payload。
  • profile 配置可以安装 MDM 支持的完整 profile 集合。
  • 状态订阅配置用于声明服务器想接收哪些状态项。
  • 简单激活可以原子性应用配置列表,并可带 predicate。
  • 每条声明都有自己的状态项,声明状态变化会自动报告。

核心启发

  1. 做什么:给 MDM 控制台增加“状态订阅模板”。 为什么值得做:状态通道允许服务器只订阅关心的状态项,减少轮询。 怎么开始:先生成 status subscription configuration,订阅 device.operating-system.versiondevice.model.familydevice.model.identifier,把设备初始报告和增量报告写入设备详情页。

  2. 做什么:把密码策略从传统 profile 迁移到声明式配置。 为什么值得做:密码策略常常需要用户操作,声明状态可以让服务器知道策略是否已应用。 怎么开始:为密码策略生成 configuration declaration,再用 simple activation 引用它,监听对应声明状态变化。

  3. 做什么:为 iPad 和不同系统版本配置不同策略包。 为什么值得做:activation predicate 让设备本地判断策略是否生效,服务器可以一次下发多套声明。 怎么开始:把策略拆成多个 configuration,用 activation predicate 表达设备类型或系统版本条件。

  4. 做什么:把用户身份和凭据从账户配置中拆成 asset。 为什么值得做:一个 asset 可以被多个配置引用,用户信息更新时只同步 asset。 怎么开始:创建 user identity asset 和 user credential asset,让账户配置通过标识符引用它们。

  5. 做什么:先用 profile configuration 包装现有 profile。 为什么值得做:profile 配置让团队在保留现有 profile 的同时,把安装和激活流程迁移到声明式管理。 怎么开始:把现有 .mobileconfig 放到服务器 URL,生成 profile configuration,再用 activation 激活它。

关联 Session

评论

GitHub Issues · utterances