Meet declarative device management
System & Services 进阶 23m

初识声明式设备管理

Meet declarative device management

2021年6月10日

在 Apple 官方观看视频

一句话判断

Declarative Device Management 是 Apple 设备管理领域这几年最重要的架构转变——如果你做 MDM 开发,现在不搞懂 DDM,两年后你会发现自己维护的是一个过时的系统。

这场 Session 讲了什么

这个 Session 系统性地介绍了 Declarative Device Management(DDM)的设计理念和具体实现。DDM 把传统的”命令-响应”模式换成了”声明-同步”模式:MDM 服务器不再一条条发送指令,而是推送一组目标状态声明(Declarations),设备自行计算差异并执行。

Session 详细拆解了 DDM 的三层结构:Configuration(配置,比如 WiFi、VPN 设置)、Asset(资源,比如证书、脚本文件)和 Management(管理策略,比如软件更新计划)。每层都有自己的 identifier 和 server token,设备通过对比 token 来判断是否需要更新。状态上报通道(Status Channel)是另一个关键设计——设备在声明变更或定时周期内主动上报当前状态,MDM 服务器不需要轮询。整个架构的最终目标:减少 MDM 服务器的负载,提升设备管理在大规模部署下的可靠性。

值得深挖的点

Declaration 的版本管理机制

每个 Declaration 都有一个 ServerToken,MDM 服务器每次修改声明内容时需要更新这个 token。设备在 check-in 时对比本地存储的 token 和服务器端的 token,只拉取有变化的声明。这个设计看似简单,但它解决了 MDM 的一个大痛点:之前每次 check-in 都要推送完整的 profile,即使内容没变。对于管理 10 万台设备的企业来说,这意味着大量的无效网络传输被消除了。

Status Channel 的实时性和幂等性

Status 上报不是一次性的,而是持续的。设备在声明应用成功、失败、或者配置被用户修改时都会上报。更重要的是,Status 是幂等的——设备可以重复上报同一个状态,MDM 服务器不需要做去重。这让网络不稳定场景下的管理变得可靠:设备断网又恢复后,重新上报一次状态就行了,不需要 MDM 服务器猜测”上次命令到底成功了没有”。

代码片段

// 一个完整的 Declaration 集合示例
// 包含配置、资源和策略三种类型的声明
{
    "Declarations": [
        {
            "Type": "com.apple.configuration.wifi",
            "Identifier": "com.example.wifi-corporate",
            "ServerToken": "20210607-v3",
            "Payload": {
                "SSID": "Corp-Network",
                "SecurityType": "WPA2Enterprise",
                "EAPClientConfiguration": {
                    "EAPType": "TTLS",
                    "TLSAllowTrustExceptions": false
                }
            }
        }
    ]
}
// 资源声明(Asset Declaration)示例
// 用于分发证书文件,被配置声明引用
{
    "Type": "com.apple.asset.certificate",
    "Identifier": "com.example.corp-root-ca",
    "ServerToken": "20210101-v1",
    "Payload": {
        "Reference": "https://mdm.example.com/assets/root-ca.der",
        "Hash": "sha256-abc123..."
    }
}
// 设备主动上报的 Status Items
// MDM 服务器可以订阅感兴趣的状态类型
{
    "StatusItems": [
        {
            "Type": "com.apple.status.device.identity",
            "Identifier": "device-identity",
            "Status": {
                "SerialNumber": "C02ZW1XXMD6P",
                "OSVersion": "12.0",
                "EnrollmentID": "user@example.com"
            }
        }
    ]
}

最佳实践

  • 迁移策略采用双轨制:新的设备管理需求用 DDM 实现,旧的命令式管理保持不变。两者可以共存,不需要一刀切。
  • ServerToken 的管理要严谨——建议使用时间戳+版本号的格式(如 20210607-v1),避免用自增整数,因为在多 MDM 服务器集群场景下自增 ID 容易冲突。
  • Status Channel 的数据可以存入时序数据库,用来做设备合规性趋势分析,这比传统的”最后 check-in 时间”有价值得多。

还有什么值得关注

  • DDM 目前支持 macOS Monterey 和 iOS 15,但不支持所有 MDM payload 类型,第一批支持的主要是 WiFi、VPN、Passcode 等基础配置。
  • DeclarationItems endpoint 让设备可以主动查询自己应该有哪些声明,这是实现”设备自主拉取”的基础。
  • Apple 开源了一个 DDM 的参考实现(DDM-Tool),值得 MDM 厂商用来验证自己的服务器实现是否合规。
WWDC 2021