大多数浏览器和
Developer App 均支持流媒体播放。
-
采用声明式设备管理
了解如何使用声明式方法让开发设备管理解决方案变得更简单。我们将介绍平台支持的最新更新,并探索状态和预测的协议扩展。
资源
相关视频
WWDC23
WWDC22
WWDC21
-
下载
♪ 柔和乐器演奏的嘻哈音乐 ♪ ♪ 欢迎收看本期视频 本期主题是 采用声明式设备管理 我叫 Cyrus Daboo 是设备管理团队的工程师 本期视频 我将讲述声明式设备管理 加入了哪些激动人心的新功能 在 WWDC 21 大会上 我的同事 Melissa 简要介绍 声明式设备管理 通过这一管理 Apple 设备的新模式 Melissa 表达了 对 MDM 协议本身的全新展望 从其介绍 我们知道了 声明式设备管理功能的强大之处 声明式管理能够 使设备自治 并获得主动 设备自治指的是 设备能够对自身状态变化做出反应 随即无需服务器提示 就能将管理逻辑应用于自己 而设备获得主动意味着 发生重要的状态更改时 服务器可通过状态通道收到异步报告 避免服务器轮询设备 声明式设备管理数据模型 包含两个关键要素 即 声明和状态 声明包括激活函数与谓词 配置 资产 和管理类型 状态包括状态项和状态报告 让我们花点时间说说其重要之处 以及 这对您和您产品的用户组织 都意味着什么 我们创造这项技术的目的是 为了支持新的复杂管理策略 改善设备托管用户的整体体验 为 IT 管理员 减少重复和繁琐的任务 让设备自我驱动 自主管理 如果您是 设备管理解决方案的开发人员 采用声明式 可以让您的服务器 减轻体量 增强反应性 而且 声明式数据模型 能够更紧密地映射到组织结构 也就是说 设备更改会更加简明直观 状态报告包含多样的反馈渠道 使服务器能够更密切地监控设备 并提供相关信息 这种报告方式 更及时 更可靠 不必像轮询设备那样 采用各种复杂策略 综上 声明式管理能够简化开发工作 使您能够专注于设备管理功能 将价值增加在刀刃上 并为客户创建符合喜好的解决方案 如果您是 IT 管理员 如果采用声明式管理 您会对设备是否 处于预期状态更有信心 如果设备并非处于预期状态 所有敏感的组织数据 也会处于被保护的安全状态 即使丢失与服务器的连接也不必担心 声明式管理中的状态报告 提供了来自设备的关键反馈 能够减少网络带宽等资源的占用 进而提高管理员的效率 如果您是组织用户 声明式管理 可以提升设备管理的响应性 增强可靠性 使数据打通更加高效 缩短恢复时间 并更好地获得组织支持 考虑到所有这些好处 再加上我们都知道 未来协议特征必将侧重于 声明式设备管理 对您来说 在现有产品中采用声明式设备管理 显得愈发重要 如果您希望 进一步了解声明式设备管理 以及采用步骤 请务必观看 WWDC 21 讲座视频 在此版本中 我们将重点放在了三个领域上 扩大声明式设备管理的范围 增强状态报告 以及增强谓词 让我们先来说说 扩大声明式设备管理的范围 声明式设备管理在刚推出时 只有用户注册模式的 iOS 可以支持 现在 声明式设备管理可用于 所有 MDM 支持的注册类型 例如 包括受监督设备在内的 自动设备注册 基于个人资料的注册 以及基于个人资料和帐户的用户注册 现在 共享 iPad 也同样适用 声明式设备管理 iOS 16 的用户 可以通过“设置” 在 MDM 配置文件 详细信息视图中找到配置 点击配置行可查看 活动配置相关的详细信息 还有 我很高兴能在此宣布 现在 MDM 支持的每个平台 都能够使用声明式设备管理 macOS Ventura 支持声明式管理 macOS 支持的 所有 MDM 注册类型皆适用 tvOS 16 也支持声明式管理 所有 MDM 设备注册 类型也都适用 在操作系统支持的情况下 凡是在 iOS 上可用的 声明和状态集 在 macOS 和 tvOS 也同样适用 macOS 的配置部分显示在 MDM 配置文件详细信息视图中 可以查看活动配置 tvOS 也是如此 其配置部分 显示在 MDM 配置文件 详细信息视图中 最后需要注意的是 macOS 和 共享 iPad 设备 都有两个 MDM 通道 即 设备通道和用户通道 设备通道允许管理 设备级状态 用户通道则针对管理 特定用户的状态 要在任何通道上使用声明式设备管理 都必须为该通道单独启用 也就是必须在相应的频道上 分别发送声明式管理命令 此外 声明性设备管理的状态报告 也会单独为各通道生成 同样需要分别监控 接下来是第二个重点领域:状态报告 让我们快速回顾一下状态报告 这指的是 设备可以逐步向服务器报告状态 订阅状态项 设备通过跟踪来自服务器的成功响应 来确保状态更新无误 而遇到网络或其他问题时 也不会错过更新 设备通过状态报告获得了主动 服务器不必再为了观察状态变化 而不断轮询设备 在 iOS 15 中 我们引入了一组状态项 以适应各种设备属性 例如模型类型 和各操作系统版本 本次我们将在三个方面扩展状态 密码状态 通过配置安装的帐户 和 MDM 安装 App 我们从密码状态开始说起 在 iOS 15 中 我们引入了密码策略配置 当用户更改密码时 策略的应用和密码合规 可能存在一定时间差 MDM 密码策略配置文件也是如此 因此 MDM 服务器必须轮询设备 才能确定密码什么时候合规 但如果应用了新的 声明式设备管理密码状态项 就没有必要这样做了 我们添加了两个状态项 passcode.is-compliant 和 passcode.is-present 合规性用于指示密码是否符合 通过 MDM 文件或配置应用的 所有密码策略 这些状态项具有布尔值 能够反映那些可通过 MDM 查询 检索到的等价属性 让我们探索一个典型的服务器行为 一般来说 组织都会在设备上 应用安全敏感状态 例如 只允许 VPN 或 Wi-Fi 配置文件 访问受保护的网络 而在设备启用该状态必须有个前提 那就是存在强密码策略 且密码符合该策略 在传统的 MDM 中 当用户更改密码时 服务器必须先发送密码策略配置文件 然后轮询设备 等待密码合规 最初密码可能不合规 导致无法发送 Wi-Fi 配置文件 最后 用户更改密码 才能使其合规 接着 服务器在下一次轮询中 检测到更改后的合规状态 确定可以发送 Wi-Fi 配置文件 然后才能将其安装在设备上 声明式设备管理的激活函数谓词 能够被密码的合规状态触发 因此免去了服务器轮询 服务器将密码策略 和 Wi-Fi 配置文件 作为配置同时发送 且 Wi-Fi 配置绑定于 基于密码合规性的激活函数 可以立即激活密码配置 并应用强大的密码策略 密码可能在最开始显示不合规 导致激活谓词求值为假 Wi-Fi 配置保持未激活状态 等到用户更新密码 使其合规后 会触发对激活函数的重新求值 这时候 谓词求值就会为真 并激活 Wi-Fi 配置 以上过程完全不需要服务器的干预 甚至也不需要 和现存服务器进行连接 而当配置激活时 服务器会自动从设备获取状态报告 因此 服务器知道何时发生变化 以上过程说明了我们成功地 将业务逻辑从服务器移动到设备 并避免轮询的过程 设备行为也能够因此 变得更灵敏 更可靠 现在 让我们转向帐户状态 在 iOS 15 中 我们引入了账户配置 以在设备上安装各种类型的帐户 通常都是组织帐户 用来授予用户访问组织数据的权限 能够知道账户合适成功安装 以及账户处于什么状态 对管理员来说是很有用的功能 方便管理员支持可能遇到问题的用户 此版本为邮件 日历和其他帐户类型 添加了八个帐户状态项 请注意 该状态仅会报告 通过配置安装的帐户 且手动创建的帐户 或通过 MDM 配置文件 安装的账户也不适用 每个新的状态项 都和帐户配置类型对应 对于接收和发送邮件的帐户 其状态会被分别报告 每个新的状态项 使用不同类型的 JSON 对象 来表示对应账户类型的状态 以下是接收邮件状态项 和订阅日历状态项的示例 对于状态项对象数组中的对象 标识符键的值是唯一标识符 稍后会详细介绍 声明标识符键的值 匹配安装帐户的配置文件的 标识符属性值 更易于交叉引用 状态项对象及其相关配置 这两个键始终存在于 所有类型的帐户状态项对象中 其余键则针对特定帐户类型 例如 邮件服务器的主机名和端口 或已订阅日历的日历链接 此版本引入了值为数组的状态项 支持报告一个或多个 同类型帐户 这样的数组值具有特殊行为 数组中的每一项 都是一个 JSON 对象 其模式和用于单个数组中 所有对象的相同 每个对象类型都有一个标识符键 作为在数组内定位对象 的主键 还有其他键 与所报告的基本状态类型相关联 为了能够前向兼容 未来操作系统版本中可能添加的键 您的服务器必须能够接受 数组对象中的未知键 为了性能考虑 凡是数组值的更改 都会基于单个对象逐步报告到服务器 让我们来看个例子 看看这个新功能是如何工作的 在这个例子中 服务器向设备发送了 两个邮件账户配置 由于两个账户都处于活动状态 因此设备上存在着两个邮件帐户 服务器现在发送信号 订阅邮件帐户状态项 订阅激活后 会收集帐户状态 且设备会向服务器发送状态报告 状态报告将包括在状态数组中的 两个帐户状态对象 使服务器能对设备当前内容 有全面的了解 每个数组对象都有不同的标识符 处理完这份报告后 服务器储存着两个邮件帐户的状态 和设备上的内容一致 当服务器通过发送新配置 以在设备上添加邮件帐户时 设备上的状态项 在其数组值中添加了一个新对象 又向服务器发送了一份状态报告 该报告仅反映了新项目 由于标识符键的值 与服务器已知的都不匹配 服务器因此可以推断出 该标识符来自新帐户 处理完这份报告后 服务器储存着三个邮件帐户的状态 两个初始账户和一个新账户 依旧与设备内容完全一致 当账户状态发生变化时 例如当用户切换邮件 或便笺启用状态时 设备上的状态项 将在其数组值中增加一个更新对象 于是状态报告再次被发送到服务器 且仅报告更改的项目 在这个例子中 用户关闭了账户中的 便笺功能 标识符键的值 和服务器储存的其中之一相匹配 所以 服务器可以推断出这是 一次现有帐户的更新 然后 服务器用新对象替换了 现有的状态项数组对象 处理完这份报告后 服务器储存着三个邮件帐户的状态 其中之一经历了更改 从设备中删除帐户配置时 设备上的状态项 会被打上相应的对象标记 以示删除 又一份状态报告被发送到服务器 仅报告已删除的项目 为了表示删除 数组项对象仅包含两个键 首先是 标识符键 其值与服务器已有的值相匹配 其次是删除键 其值被设置为真 有了这两个键 服务器就能够 通过删除现有项目来更新设备状态 处理完这份报告后 服务器只储存着两个邮件帐户的状态 和设备现状完全一致 关于状态报告 我还有最后一点要说 设备会限制状态报告的发送速率 以避免性能出现问题 在最长为 1 分钟的时间间隔内 设备会整合状态项的更改 再向服务器发送状态报告 也就是说 设备状态的报告速度虽快 却不是即时的 接下来 让我们换个方向 看看该如何解决 长期存在的 MDM 瓶颈 即 监控 App 安装状态 MDM 服务器通常需要 在设备上安装 App 才能授权用户访问其 工作或教育所需的工具 通常来说 App 是否安装成功 决定了服务器端的逻辑 所以 MDM 服务器 需要监控 App 安装进度 还要注意用户是否会删除 设备上的托管 App 目前 MDM 服务器可以使用 InstalledApplicationList 或 ManagedApplicationList 命令来轮询设备 以观察 App 安装进度 而我们可以通过让设备主动 向服务器反映应用安装进度 来避免轮询 所需要用到的工具就是 声明式设备管理状态报告 此版本添加了一个 mdm.app 状态项 其值是一个对象数组 每个对象代表一个 已由 MDM 服务器 安装的 App 由于值是数组 所以 其采用的是增量式报告 这一过程我们之前已经描述过了 请注意 即使在受监督的设备上此 也只有 MDM 安装的 App 会被报告 此状态报告包含 已安装完成应用的状态项 对于数组项对象 标识符键是唯一标识符 在这种情况下 标识符键 也是 App 的捆绑标识符 name 键表示 App 的名称 三个 version 键 分别是普通 简要 和外部版本标识符 而 state 键则用于指明 App 当前的安装阶段 这些键的值和 MDM 托管 App 列表 命令响应中的等价项 相互对应 有了这些信息 服务器可以立即识别出 正在报告哪个 App 以及该 App 正处于什么状态 以某个 App 安装时的 数据流为示例 右侧是一台 iOS 16 设备 由 MDM 服务器管理 其服务器已启用了声明式设备管理 并发送了对于 MDM 安装 App 状态项 的状态订阅 服务器下一步要做的是 通过 MDM 命令安装 App 由于是用户注册 安装 App 需要用户批准 所以当设备处理 App 安装命令时 会出现弹窗提示 此时 安装进度暂停 等待用户输入 设备将向服务器发送状态报告 报告内容包括单个 MDM 安装 App 的状态对象 以及 App 的捆绑 ID 和弹窗提示状态 有时候 当用户点击安装按钮 设备随即开始安装 App 随着安装的进行 将发送另一个状态报告 这次将应用状态设置为正在安装 表示正在下载和安装该 App 知道最后 App 完成安装 可以投入使用 此时 将发送另一个状态报告 将应用状态设置为托管 表明 App 已正确安装和管理 现在假设用户 手动删除了设备上的 App 同样 设备将发送状态报告 这次 App 状态将被设置为 托管但已卸载 表明该 App 不再处于安装状态 但仍在设备上 跟踪其管理状态 假设服务器要删除 应用管理状态 为了实现这一点 服务器会向设备 发送 App 删除命令 这样就删除了原本的管理状态 且如果 App 仍然存在 这时也会被删除 接下来 被标记为已从 应用状态数组中移除的 App 对象 将与另一份状态报告一起发送 通过以上说明 我们了解了 新 MDM 状态项的强大功能 它能够帮助提高响应能力 也能增强 App 安装的可靠性 而且简单便捷 只需几个步骤即可实施 接下来 让我们看看 第三个重点领域 谓词 先快速回顾一下激活谓词 激活函数包括一个可选谓词 以确定激活中引用的配置 是否将应用于设备 谓词可以引用状态项 以便测试状态项的值 当谓词中引用的状态项发生更改时 设备将重新处理所有激活函数 重新对所有谓词求值 NSPredicate 即谓词语法 谓词被指定为字符串 记录在 Apple Developer 网站上 为了支持更复杂的谓词表达式 我们扩展了谓词语法 使其更容易检测出表达式中的状态项 在新语法中 状态项名称被放置于 谓词字符串中的 @status 项内 在示例中 序列号状态项 运用使用新语法 出现在谓词表达式中 以前的语法依然有效 但是为了向后兼容 旧语法已被弃用了 所以 请您采用新语法 让我们看看面对状态项数组值时 谓词是如何运作的 正如之前的流程 现在有了状态项值 其指的是帐户的数组 和 MDM 安装 App 的状态项 能够在数组的某个项目上触发激活 会很有帮助 比如说 在设备上安装和管理 具有特定捆绑标识符的 App 时 我们可能需要触发激活 NSPredicate 有一个子查询词条 可用于对数组进行操作 此 NSPredicate 表达式使用的子查询 正针对着 MDM 安装 App 状态项 状态项被用作子查询的第一个参数 第二个参数定义了一个变量 该变量将引用数组的每个元素 第三个参数是谓词表达式 用于测试由该变量标识的每个元素 子查询表达式返回一个 与第三参数中的谓词 相匹配的元素数组 接着 @count 运算符 返回该数组的长度 并且对其长度进行检查 以确定是否存在结果匹配 安装和管理指定的 App 时 该子查询表达式将用一个元素 返回一个数组 此时谓词求值将为真 未安装应用时 子查询表达式 将返回一个空数组 且谓词求值将为假 请注意 为了 在状态项数组对象中引用键 必须使用 @key 扩展项 来确保关键路径被正确处理 新的谓词语法是可扩展的 我们现在说说该怎么使用新语法 来为一种新型数据添加谓词 服务器需要的是 能够更直接地控制谓词求值 以便将复杂的服务器端逻辑 转化为设备上的简单状态变化 并且无需为了实现这些变化 而大量同步配置 举个例子 有这个需求的组织 可能希望在将设备分发给用户时 能够高效 即时地 将设备分配给多个角色 也有可能 该组织需要的是 能够快速分发替换设备 或快速开启设备的安全模式 来保护组织数据 我很高兴能告诉开发者 为了满足以上需求 我们正在添加一个新的声明 以允许服务器在设备上设置任意属性 用于直接激活谓词 这就是新的管理属性声明 该声明由一个 JSON 对象组成 其键名由服务器定义 JSON 对象值可以 是任何 JSON 值类型 包括数组或对象 屏幕上的管理属性声明 包括三个属性 其中姓名和年龄 具有字符串和整数值 而角色属性则是字符串数组 这是一个带有谓词的激活函数 引用了一些管理属性 该函数首先会测试年龄属性 判断其整数值是否 大于 18 或等于 18 接着 该函数会测试角色属性 判断属性数组值中 是否出现字符串“12 年级” 每个属性的引用都使用了 @property 扩展术语 且属性键名称就属于该类术语 虽然可以向设备发送 多个管理属性声明 但所有键名都应该互不重复 如果键名重复 则引用属性时 其值会随机被谓语引用 导致难以预料的结果 所以 请避免使用重复的键名 让我们来看一个使用案例 该系统由一所学校采用 学校里有很多教师 这点不用多说 这所学校分为两个学部 高年部和低年部 每个学部都有自己的校区 和独立 Wi-Fi 网络 部分教师是 IT 管理员 需要访问共享邮件帐户 其中部分教师兼任体育教练 需要为体育比赛制定时间表 订阅日历 因此 一名教师可能 可以扮演四种不同的角色 有时甚至需要身兼多职 而每个角色都有一组配置 添加到设备时 必须按设备分配的角色区分 让我们以两位教师为例 一号教师在低年部任教 兼任体育教练 二号教师在高年部任教 同时是一名 IT 管理员 传统的 MDM 服务器 该如何处理这样的用例呢? 一般来说 在完成设备配置之前 传统服务器必须先 等待设备被分配给教师 服务器必须先确定教师的角色 才能确定该如何链接配置文件 接着 服务器必须轮流地在设备上 分别安装配置文件 如果教师改变角色 服务器必须 添加或删除配置文件来匹配新角色 这一过程不仅耗时 还可能导致设备管理系统的重大卡顿 高峰期尤其如此 我们以角色分配完成后的 开学第一天作为案例背景 新的管理属性声明 提供了一个更有效的替代方案 该方案可以在设备上 预加载一整套声明 通过管理属性 可以根据角色触发谓词 来将配置分配给激活函数 设备分配给教师后 服务器只需要发送 一份管理属性声明 以及该教师的角色 来触发激活其角色的配置 这种方法不仅可以将整个服务器 和网络的流量消耗降至最低 还能够使快速更改设备状态更加简便 回到学校的例子 服务器将预加载以下声明集 两个用于为各学部 设置 Wi-Fi 网络的 激活/配置对 一个为 IT 管理员 安装邮件帐户的激活/配置对 最后是一个安装订阅日历的 激活/配置对 每个激活函数都备有一个谓词 用于检测学部或 角色管理属性的函数名称 最初在未分配的设备上加载时 所有谓词都为假 因此不会应用任何内容 接下来 让我们看看 分配当天会发生什么 服务器只需要给每位教师 分别创建 管理属性声明 一号教师的角色属性 列出了低学部和体育 二号教师的角色属性 列出了高学部和 IT 管理员 单独向每个分配的设备 发送这些声明时 预加载的激活函数将全部重新求值 在一号教师的设备中 激活了低学部和体育教练的配置 而二号教师的设备 激活了高学部和 IT 管理员配置 只需一个声明即可触发 应用多种配置 最后 让我们再来看看 当教师改变角色时会发生什么 目前为止 在当前已分配角色的基础上 二号教师增加了体育教练的角色 分配给教师的设备中 管理属性声明现已更新 加入了新增角色的名称 当该声明在设备上更新时 所有激活函数都被重新求值 于是 适用于体育教练角色的 订阅日历配置将被启用 同样 只需要一个声明更改就能触发 以上过程说明了 管理属性声明 提供了一种强大的解决方案 能够快捷切换设备配置集 使复杂的服务器端逻辑 能够转化为设备上的简单状态变化 最后 让我们总结一下 我们在 iOS 16 机型 tvOS 16 机型 和 macOS Ventura 上 扩展了声明式设备管理的范围 并且使其适用于所有 MDM 注册用户的适用类型 共享 iPad 也包括在内 因此 所有支持 MDM 的 Apple 设备 都能够支持声明式设备管理 我们为密码 帐户 和 MDM 安装 App 都添加了新的状态项 MDM 安装的 App 状态 为解决 MDM 的关键瓶颈之一 提供了一个很好的解决方案 最后 我们增强了谓词语法 使其更具可扩展性和易于使用 并添加了新的管理属性声明 使得服务器能够更便捷地 将复杂的业务逻辑转移到设备上 是时候让您的产品 采用声明式设备管理了 您将如何运用声明式设备管理 来重新构想设备管理解决方案 我们期待见到您的答案 一如往常 我们期待着您的反馈 感谢收看 请继续享受 WWDC 之旅 ♪
-
-
7:41 - Passcode status items
{ "management": { "client-capabilities": { "supported-payloads": { "status-items": [ ... "passcode.is-compliant", "passcode.is-present", ... ] } } } }
-
10:52 - Account status items
{ ... "status-items": [ ... "account.list.caldav", "account.list.carddav", "account.list.exchange", "account.list.google", "account.list.ldap", "account.list.mail.incoming", "account.list.mail.outgoing", "account.list.subscribed-calendar", ... ] ... }
-
11:19 - Mail and subscribed calendar status item objects
{ "identifier": "592D763E-C15B-44F8-A1FC-F88EB1901646", "declaration-identifier": "BF8FD199-467B-4BA5-886D-D82B7849E517", "hostname": "mail.example.com", "port": 443, "username": "user01", "is-mail-enabled": true, "are-notes-enabled": false } { "identifier": "592D763E-C15B-44F8-A1FC-F88EB1901646", "declaration-identifier": "BF8FD199-467B-4BA5-886D-D82B7849E517", "calendar-url": "https://holidays.example.com/country/US.ics", "username": "user01", "is-enabled": true }
-
17:13 - MDM app status item
{ "management": { "client-capabilities": { "supported-payloads": { "status-items": [ ... "mdm.app", ... ] } } } }
-
17:35 - Status report with MDM app status item
{ "StatusItems": { "mdm": { "app": [ { "identifier": "com.apple.Pages", "name": "Pages", "version": "7358.0.134", "short-version": “12.0", "external-version-id": "844362702", "state": "managed" } ] } }, "Errors": [] }
-
22:15 - Predicate subquery using the MDM app status item
SUBQUERY(@status(mdm.app), $app, ($app.@key(identifier) == "com.example.app") AND ($app.@key(state) == "managed") ).@count == 1
-
24:10 - Management properties declaration
{ "management": { "client-capabilities": { "supported-payloads": { "declarations": { ... "management": [ ... "com.apple.management.properties", ... ] ... } } } } }
-
24:40 - Management properties declaration object
{ "Type": "com.apple.management.properties", "Identifier": "AAE09D73-6EF6-4F3B-9E15-11B0F86D5591", "ServerToken": "AB4C5B91-3E08-4D4E-A9FF-1E44FE5BFDD4", "Payload": { "name": "Student One", "age": 7, "roles": ["grade1", "spanish"] } }
-
24:53 - Activation with management properties predicate
{ "Type": "com.apple.activation.simple", "Identifier": "076F928B-9D8E-4BA2-AD34-5655805C82D7", "ServerToken": "4FFA91BF-85AE-4053-B8FE-B1C3E507A9CB", "Payload": { "StandardConfigurations": [ "3BBB4407-238A-44B1-ABB1-5E7AB95160E0" ] }, "Predicate": "(@property(age) >= 18) AND ("Grade12" IN @property(roles))" }
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。