Highlight
Session 由设备管理团队的 Nadia 和 Graham 主讲,覆盖 macOS Ventura 和 iOS/iPadOS 16 的设备管理新特性。
核心内容
企业和学校管理 Apple 设备,常见问题都很具体。
一台设备不在采购渠道里,管理员要把它补进 Apple Business Manager。员工用个人 iPhone 注册 MDM,却要在注册、公司 App、公司网站里重复登录。同一批 Mac 推送系统更新后,管理员想知道用户还剩几次延期机会。BYOD 设备只想保护公司 App 的网络流量,不想接管整台设备。
这场 session 把这些问题按部署、身份、MDM 协议、文档四条线展开。它发布了一组面向设备管理链路的更新:Apple Configurator for iPhone 支持添加 iPhone 和 iPad;身份系统加入 Google Workspace 联合认证、OAuth 2、Enrollment SSO 和 Platform SSO;macOS、iOS、iPadOS 的 MDM 协议加入更多状态、限制和查询;设备管理文档的源数据开放到 GitHub。
Apple Configurator for iPhone 扩展到 iPhone 和 iPad
(03:24)Apple Configurator for iPhone 最初用于把非正常采购渠道购买的 Mac 加入组织。到 iOS 和 iPadOS 16,它也能把 iPhone 和 iPad 加入 Apple School Manager 或 Apple Business Manager。
以前如果要把 iPhone 或 iPad 加入组织,Configurator for Mac 需要用 USB 逐台连接。新的 iPhone 版流程沿用扫描 Setup Assistant 动画的交互,只是扫描位置不同:iOS 和 iPadOS 扫描 Wi‑Fi 页面,macOS 扫描国家或地区页面。
交互式激活仍然要先人工完成。比如激活锁或运营商激活,必须在加入组织前处理好。
身份管理的目标:登录一次,系统内复用
(04:49)Apple 把身份管理目标说得很直接:用户登录一次,之后在操作系统中一致使用这个身份。
这里有四个更新。
第一,Apple Business Manager 支持 Google Workspace 作为联合身份认证提供方。组织可以用工作账号作为 Managed Apple ID 的认证入口,并用 Directory Sync 自动创建 Managed Apple ID。
第二,Sign in with Apple 支持 Managed Apple ID。已经支持 Sign in with Apple 的 App 不需要额外改动;管理员可以在 Apple School Manager 或 Apple Business Manager 里允许所有 App,或配置明确的允许列表。
第三,iOS 和 iPadOS 16 为 MDM 客户端认证加入 OAuth 2。OAuth 的 refresh token 机制可以配合短生命周期 access token 使用,避免频繁提示用户输入凭据。
第四,Enrollment Single Sign-on(注册单点登录)把账号驱动的用户注册和可扩展 SSO 结合起来。用户在 Settings 里输入邮箱,系统提示下载带 Enrollment SSO extension 的 App;这个 App 负责原生认证界面,并把用户带过 MDM 注册流程。
详细内容
Enrollment SSO:用 JSON 告诉系统该装哪个 SSO App
(09:12)Enrollment SSO 的入口来自 MDM 服务器的认证挑战响应。服务器在 HTTP header 里返回一个 URL,客户端用它下载 JSON 文档。这个 JSON 告诉系统:注册时使用哪个 App、关联哪些域、安装哪份配置描述文件。
{
"iTunesStoreID": 12345678,
"AssociatedDomains": [
"betterbag.com"
],
"AssociatedDomainsEnableDirectDownloads": false,
"ConfigurationProfile": "Base64EncodedProfile"
}
关键点:
iTunesStoreID指向注册过程中要使用的 Enrollment SSO App。AssociatedDomains使用与ApplicationAttributes相同的关联域配置。AssociatedDomainsEnableDirectDownloads控制关联域直接下载行为。ConfigurationProfile是 Base64 编码的配置描述文件,至少包含一个 Extensible SSO payload;需要证书时也可以包含证书 payload。
(11:02)开发阶段可以启用 test mode。它使用不同的响应 header,JSON 也把 iTunesStoreID 换成 AppIDs,方便安装还没有上架 App Store 的测试 App。
{
"AppIDs": [
"ABC123.com.example.singlesignonapp"
],
"AssociatedDomains": [
"betterbag.com"
],
"AssociatedDomainsEnableDirectDownloads": false,
"ConfigurationProfile": "Base64EncodedProfile"
}
关键点:
AppIDs是字符串数组,列出 test mode 下允许用于注册的 App ID。AssociatedDomains、AssociatedDomainsEnableDirectDownloads、ConfigurationProfile与正式模式保持一致。- 测试流程从 Settings 的 Developer 区域开启 Enrollment Single Sign-on test mode,再到 VPN and Device Management 发起注册。
- 测试 App 可以通过 Xcode、TestFlight 或企业分发安装。
Platform SSO:把 macOS 登录窗口接到身份提供方
(11:56)macOS Ventura 引入 Platform Single Sign-On。它让用户在登录窗口完成一次认证,随后自动登录组织 App 和网站。
这个能力面向身份提供方和 SSO extension 开发者。身份提供方需要实现 SSO protocol,更新自己的 SSO extension;管理员需要更新可扩展 SSO profile 的新 key。
工作方式也有明确边界。
用户第一次登录仍然使用本地账户密码,这同时解锁 FileVault,也保证离线或 captive network 环境可以登录。之后可以用身份提供方密码解锁。Platform SSO 支持密码或 Secure Enclave backed key 与身份提供方认证。取回的 SSO token 存入 keychain,再提供给 SSO extension。Kerberos TGT 也可以取回并导入 credential cache。
它不直接使用目录服务,也不会每次解锁都查询身份提供方。身份提供方只在用户尝试用新密码解锁,或需要取回 SSO token 时被调用。
OSUpdateStatus:系统更新状态变得可追踪
(15:15)macOS Ventura 改进了 Managed Software Updates。设备在睡眠或 Power Nap 模式下,也会确认并响应 ScheduleOSUpdate、OSUpdateStatus、AvailableOSUpdate 命令。
ScheduleOSUpdate 新增 priority key,值为 High 或 Low。High 会模拟用户在系统设置里主动请求更新的优先级。这个 key 只支持 minor OS updates。
(16:08)OSUpdateStatus 的返回值提供更多管理员可见性。
<key>DeferralsRemaining</key>
<integer>4</integer>
<key>DownloadPercentComplete</key>
<real>0.0</real>
<key>IsDownloaded</key>
<false/>
<key>MaxDeferrals</key>
<integer>5</integer>
<key>NextScheduledInstall</key>
<date>2022-04-19T09:00:00Z</date>
<key>PastNotifications</key>
<array>
<date>2022-04-18T17:03:51Z</date>
</array>
<key>ProductKey</key>
<string>MSU_UPDATE_22A240a_full_13.0_minor</string>
<key>ProductVersion</key>
<string>16.0</string>
关键点:
DeferralsRemaining表示用户还剩多少次更新提示延期机会。MaxDeferrals表示用户总共允许延期几次。NextScheduledInstall给出系统下一次尝试安装更新的时间。PastNotifications记录已经向用户展示更新通知的具体时间。ProductKey和ProductVersion帮助管理员把状态对应到具体系统更新。
(16:58)Rapid Security Response 也加入了管理限制。allowRapidSecurityResponseInstallation 用来禁用快速安全响应安装,allowRapidSecurityResponseRemoval 用来阻止终端用户移除快速安全响应。
Per-app DNS Proxy 和 Web Content Filter:保护 BYOD 上的公司 App 流量
(21:47)iOS 和 iPadOS 16 把 per-app 思路扩展到 DNS Proxy 和 Web Content Filter。它适合用户注册场景:组织可以保护公司 App 的流量,又不需要把整个个人设备流量都纳入管理。
配置分两步。第一步,在 Web Content Filter 或 DNS Proxy payload 中加入 UUID。第二步,在 InstallApplication 命令或 Settings 命令里,把同一个 UUID 写到对应 App 的 attributes。
(22:38)Web Content Filter payload 使用 ContentFilterUUID。
<plist version="1.0">
<dict>
<key>PayloadContent</key>
<array>
<dict>
<key>PayloadType</key>
<string>com.apple.webcontent-filter</string>
<key>ContentFilterUUID</key>
<string>063D927E-ACE2-445F-8024-B355A6921F50</string>
<key>FilterType</key>
<string>Plugin</string>
<key>FilterBrowsers</key>
<true/>
<key>FilterPackets</key>
<false/>
<key>FilterSockets</key>
<true/>
…
关键点:
PayloadType指明这是com.apple.webcontent-filterpayload。ContentFilterUUID是给 App attributes 复用的标识符。FilterBrowsers、FilterPackets、FilterSockets控制过滤器覆盖的流量类型。- 加入这个 UUID 后,该 payload 只能通过 MDM 安装。
(22:47)DNS Proxy payload 使用 DNSProxyUUID。
<plist version="1.0">
<dict>
<key>PayloadContent</key>
<array>
<dict>
<key>PayloadType</key>
<string>com.apple.dnsProxy.managed</string>
<key>DNSProxyUUID</key>
<string>063D927E-ACE2-445F-8024-B355A6921F50</string>
<key>AppBundleIdentifier</key>
<string>com.example.myDNSProxy</string>
…
关键点:
PayloadType指向托管 DNS Proxy payload。DNSProxyUUID是 per-app DNS Proxy 的关联标识。AppBundleIdentifier指向提供 DNS Proxy 能力的 App。- 系统允许多个 DNS Proxy,但不能混用 system-wide 和 per-app proxy。
(23:05)安装 App 时,把同样的 UUID 写进 Attributes。
<plist version="1.0">
<dict>
<key>RequestType</key>
<string>InstallApplication</string>
<key>iTunesStoreID</key>
<integer>361309726</integer>
<key>Attributes</key>
<dict>
<key>ContentFilterUUID</key>
<string>063D927E-ACE2-445F-8024-B355A6921F50</string>
<key>DNSProxyUUID</key>
<string>063D927E-ACE2-445F-8024-B355A6921F50</string>
</dict>
<key>ManagementFlags</key>
<integer>0</integer>
</dict>
</plist>
关键点:
RequestType使用InstallApplication,表示这是安装 App 的 MDM 命令。iTunesStoreID指向要安装的 App。Attributes承载 per-app 配置关联信息。ContentFilterUUID和DNSProxyUUID的值必须与前面 payload 中的 UUID 对应。- App 开发者不需要为这项能力改代码;已有 DNS Proxy 和 Web Content Filter App 可以继续使用。
eSIM 管理:先查 ServiceSubscriptions,再发 RefreshCellularPlans
(24:38)eSIM 部署分成两个动作:MDM 先从设备查询运营商需要的数据,再让设备从运营商服务器安装 eSIM。
DeviceInformation query 中的 ServiceSubscriptions 是蜂窝数据的一站式来源。返回两个 item 表示设备支持两个 active cellular plans;返回 EID 表示这是 eSIM。iPhone 13 和第三代 iPhone SE 等新设备支持双 active carrier eSIM profiles。
(24:56)下面是一个 ServiceSubscriptions 响应片段。
{
"CarrierSettingsVersion": "41.7.46",
"CurrentCarrierNetwork": "CarrierNetwork",
"CurrentMCC": "310",
"CurrentMNC": "410",
"EID": "89049032004008882600004821436874",
"ICCID": "6905 4911 1205 0650 3488",
"IMEI": "35 309418 464558 9",
"IsDataPreferred": false,
"IsRoaming": false,
"IsVoicePreferred": false,
"Label": "Secondary",
"LabelID": "FDG4225C-L9OY-89BM-JF38-36JR4JOL76B3",
"MEID": "35745008005631",
"PhoneNumber": "+14152739164",
"Slot": "CTSubscriptionSlotTwo"
}
关键点:
EID是每台设备唯一的 eSIM 标识。IMEI、EID、序列号和电话号码是运营商通常需要的四类数据。PhoneNumber非空时,可用于确认 eSIM 已安装成功。Slot表示这条订阅记录对应的蜂窝槽位。
(26:28)安装阶段由运营商提供 eSIM server URL。MDM 向设备发送 RefreshCellularPlans,设备访问运营商服务器,如果有可用 eSIM,就自动下载并安装,不需要用户交互。
这里有三个管理细节。
- eSIM 安装是一次性操作。之后要在同一设备再次安装,需要运营商配置新的 eSIM。
allowESIMModification可以防止用户误删 eSIM。- 擦除设备时,如果要保留 eSIM,
EraseDevice命令要把PreserveDataPlan设为True。
Shared iPad:减少输入,调整远程认证频率,明确配额
(27:45)Shared iPad 的更新集中在登录体验和存储配额。
ManagedAppleIDDefaultDomains 加入 SharedDeviceConfiguration 的 Settings 命令。用户输入 Managed Apple ID 时,QuickType 键盘会提示域名。命令可以接受任意数量的域名,但界面只展示三个。
(28:32)iPadOS 16 改变了远程认证要求。现有用户默认使用本地验证。管理员如果要强制远程认证,可以设置 OnlineAuthenticationGracePeriod。这个 key 是整数,表示两次远程认证之间的天数;值为 0 时,每次登录都要求远程认证。
(29:18)Shared iPad 配额仍通过 SharedDeviceConfiguration 管理,相关 key 是 QuotaSize 和 ResidentUsers。不管设置哪个 key,系统最终都会计算每个用户的存储配额。只要设备上没有缓存用户,iOS 13.4 之后可以随时调整 quota size。
MDM 管理可访问性设置和 Setup Assistant 中安装 App
(31:28)iOS 和 iPadOS 16 允许 MDM 管理多项常用可访问性设置,包括 Text Size、VoiceOver、Zoom、Touch Accommodations、Bold Text、Reduce Motion、Increase Contrast 和 Reduce Transparency。
<key>Settings</key>
<array>
<dict>
<key>Item</key>
<string>AccessibilitySettings</string>
<key>TextSize</key>
<integer>5</integer>
<key>VoiceOverEnabled</key>
<true/>
<key>ZoomEnabled</key>
<true/>
<key>TouchAccommodationsEnabled</key>
<true/>
<key>BoldTextEnabled</key>
<true/>
<key>ReduceMotionEnabled</key>
<true/>
<key>IncreaseContrastEnabled</key>
<true/>
<key>ReduceTransparencyEnabled</key>
<true/>
</dict>
</array>
关键点:
Item设为AccessibilitySettings,表示这组 Settings 针对可访问性。TextSize设置文字大小。VoiceOverEnabled、ZoomEnabled、TouchAccommodationsEnabled控制常见辅助功能开关。BoldTextEnabled、ReduceMotionEnabled、IncreaseContrastEnabled、ReduceTransparencyEnabled控制显示和动效相关设置。- 这些设置不会锁定,用户仍然可以按个人偏好修改;MDM 也可以通过
DeviceInformationquery 查询它们。
(32:23)Automated Device Enrollment 的 AwaitDeviceConfigured 阶段支持安装应用。这个阶段通常没有用户登录 App Store,所以 Apple 建议使用基于设备的 App license。这样设备离开 Setup Assistant 前,就能准备好用户开始工作需要的 App。
(32:55)安全边界也有变化。CertificateList query 在首次解锁前会返回 NotNow。
<plist version="1.0">
<dict>
<key>CommandUUID</key>
<string>0001_CertificateList</string>
<key>Status</key>
<string>NotNow</string>
<key>UDID</key>
<string>00008031-000123840A45507E</string>
</dict>
</plist>
关键点:
CommandUUID标识这次CertificateList命令。Status返回NotNow,表示设备当前不能提供结果。UDID标识响应设备。- 用户首次解锁后,query 会正常响应,直到设备重启。
- MDM 服务器要能处理这个
NotNow,不能把它当成永久失败。
设备管理文档开放为机器可读数据
(33:51)Apple 把设备管理文档背后的源代码开放到 GitHub,采用 MIT Open Source License。仓库包含 MDM 文档和 declarative device management 文档。
结构也面向工具化使用:MDM 目录里有 checkin、commands、profiles;declarative management 目录里有 declarations、protocol、status。每个 command、profile 或 declaration 都有 YAML 文件。
(35:00)YAML 里有几个关键字段。
payload表示 MDM 命令的 request type,例如ProfileList。supportedOS描述平台、系统版本、是否需要 supervision、是否支持 user enrollment。payloadkeys描述 query 的额外能力,子 key 可以覆盖上层supportedOS。response keys描述 MDM 服务器可以预期收到的响应结构。
这对 MDM vendor 很实用。工具可以直接读取 YAML,生成协议检查、版本差异、支持矩阵或文档页面。
核心启发
-
做一个 Enrollment SSO 开发检查器
- 做什么:检查 MDM 认证响应 header 指向的 JSON 是否包含正确的
iTunesStoreID或 test modeAppIDs。 - 为什么值得做:Enrollment SSO 涉及 MDM server、身份提供方、Managed Apple ID、SSO App 多方协作,配置错误会让用户卡在注册流程。
- 怎么开始:从服务器抓取 JSON,校验
AssociatedDomains、AssociatedDomainsEnableDirectDownloads、ConfigurationProfile,再在测试设备开启 Enrollment SSO test mode 验证。
- 做什么:检查 MDM 认证响应 header 指向的 JSON 是否包含正确的
-
做一个系统更新合规面板
- 做什么:展示每台 Mac 的
DeferralsRemaining、MaxDeferrals、NextScheduledInstall和PastNotifications。 - 为什么值得做:管理员能区分“设备没收到更新”、“用户还在延期”、“系统已安排安装”三类状态。
- 怎么开始:定期发送
OSUpdateStatus,把返回字段按设备和产品版本入库,再按剩余延期次数排序。
- 做什么:展示每台 Mac 的
-
做一个 BYOD 公司 App 网络策略生成器
- 做什么:为指定 App 自动生成 Web Content Filter、DNS Proxy payload 和
InstallApplicationattributes。 - 为什么值得做:per-app DNS Proxy 和 Web Content Filter 需要 UUID 在 profile 与 App attributes 之间一致,手工维护容易出错。
- 怎么开始:为每个策略生成 UUID,写入
ContentFilterUUID或DNSProxyUUID,再把同一个值写入InstallApplication的Attributes。
- 做什么:为指定 App 自动生成 Web Content Filter、DNS Proxy payload 和
-
做一个 eSIM 部署报告工具
- 做什么:从
ServiceSubscriptions汇总 IMEI、EID、序列号、电话号码,生成运营商交付清单。 - 为什么值得做:运营商开通 eSIM 前通常需要这几类数据,MDM 已经能从设备侧收集。
- 怎么开始:发起
DeviceInformationquery,提取ServiceSubscriptions,安装后再次查询并用非空PhoneNumber确认结果。
- 做什么:从
-
做一个设备管理 YAML 差异浏览器
- 做什么:读取 Apple GitHub 上的 device-management YAML,按系统版本展示新增命令、payload key 和支持平台变化。
- 为什么值得做:文档源数据已经机器可读,MDM vendor 可以把协议变更转成自动化检查。
- 怎么开始:拉取 Apple 的 device-management 仓库,解析
supportedOS、payloadkeys、response keys,按分支比较 iOS 16 与 macOS Ventura 的差异。
关联 Session
- Adopt declarative device management — 本 session 在开头点名推荐,继续讲声明式设备管理在平台支持、状态报告和谓词上的扩展。
- Discover Sign in with Apple at Work & School — 深入讲 Managed Apple ID 如何用于组织场景里的 Sign in with Apple。
- Discover Managed Device Attestation — 讲设备证明如何用 Secure Enclave 为服务器提供设备身份和软件版本保证。
- Explore Apple Business Essentials — 介绍面向小企业的一体化设备管理、支持和云存储订阅方案。
评论
GitHub Issues · utterances