使用 Fleet 为 iOS 与 iPadOS 主机下发 AirPrint 打印机配置
【免费下载链接】fleetOpen device management项目地址: https://gitcode.com/GitHub_Trending/fl/fleet
本文是一份面向 IT 管理员的实战指南,讲解如何在 Fleet 中通过 Apple 配置描述文件(.mobileconfig)为已纳入 MDM 管理的 iOS 与 iPadOS 主机批量添加 AirPrint 打印机,覆盖前置条件、负载结构、Fleet UI 上传、GitOps 声明式下发、验证方法与故障排查,并深入 Fleet 服务端源码说明配置文件“已验证(Verified)”状态背后的交付与校验机制。读完本文,你将能独立完成从生成 AirPrint payload 到确认打印机可实际出纸的全流程。
为什么 iOS/iPadOS 只能用 AirPrint payload 添加打印机
与 macOS、Windows、Linux 不同,iOS 与 iPadOS 不允许安装打印机驱动程序,因此 Fleet 无法为这些平台下发任意打印机的驱动。唯一可行的路径是使用 Apple 的 AirPrint(com.apple.airprint)payload:它向系统提供一份 AirPrint 打印机清单,供系统打印对话框展示和连接。
需要特别澄清的是:这个 payload只负责“列出”支持 AirPrint 的打印机,并不能让不支持 AirPrint 的打印机获得 AirPrint 能力。如果你的打印机本身不支持 AirPrint,这个配置负载不会起到任何作用。
关联阅读:使用 Fleet 部署打印机 一文对比了各平台的做法——macOS 可用自服务脚本或配置描述文件、Windows 可用内置 IPP 驱动或厂商驱动、Linux 走 CUPS、Android 则是部署打印服务 App 而非单台打印机,唯独 iOS/iPadOS 只能走本文的 AirPrint payload。
前置条件
开始之前,请确认满足以下条件:
- 一个 Fleet 实例,且已有 iOS 或 iPadOS 主机完成 MDM 注册(enroll)。
- 对目标 Fleet 拥有Admin(管理员)或 Maintainer(维护者)权限。
- 若需要将配置只下发到部分主机(例如按楼层、按部门的 label 定向),需要Fleet Premium(免费版只能全量下发到整个 team)。
- 每台目标打印机的IP 地址或主机名(hostname),以及它的resource path(资源路径)。开始配置前请务必确认打印机确实支持 AirPrint。
理解 AirPrint payload 的结构
Fleet 仓库在 docs/solutions/ios-ipados/configuration-profiles/airprint.mobileconfig 提供了一个可直接套用的 AirPrint 配置描述文件示例,其完整内容如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>PayloadContent</key> <array> <dict> <key>AirPrint</key> <array> <dict> <key>IPAddress</key> <string>TODO: PRINTER IP ADDRESS OR HOSTNAME</string> <key>ResourcePath</key> <string>TODO: RESOURCE PATH, e.g. ipp/print</string> </dict> </array> <key>PayloadDisplayName</key> <string>AirPrint</string> <key>PayloadIdentifier</key> <string>com.fleetdm.airprint.airprint</string> <key>PayloadType</key> <string>com.apple.airprint</string> <key>PayloadUUID</key> <string>A2E5F9B0-3D4C-4E7A-8F1B-2C9D6E4A7B22</string> <key>PayloadVersion</key> <integer>1</integer> </dict> </array> <key>PayloadDisplayName</key> <string>AirPrint</string> <key>PayloadIdentifier</key> <string>com.fleetdm.airprint</string> <key>PayloadType</key> <string>Configuration</string> <key>PayloadUUID</key> <string>9B3E7A5C-1F2D-4C6E-8A9B-3D5E7C1A9F44</string> <key>PayloadVersion</key> <integer>1</integer> </dict> </plist>对每台打印机,需要填写AirPrint数组中的两个关键字段:
| 字段 | 必填 | 说明 |
|---|---|---|
IPAddress | 是 | 打印机的 IP 地址或主机名(hostname) |
ResourcePath | 是 | 打印机上实际打印队列对应的资源路径,例如ipp/print;需与打印机自身网络设置页中显示的路径完全一致 |
其余字段是 Apple 配置描述文件的通用元数据:
PayloadType:内层负载必须为com.apple.airprint,顶层容器为Configuration。PayloadIdentifier/PayloadUUID:负载与描述文件的唯一标识,示例中使用的是com.fleetdm.airprint命名空间下的固定值,可自行更换为符合组织命名规范的标识符,但需保证全局唯一。PayloadVersion:payload 版本号,示例为1。PayloadDisplayName:在设备上显示的名称。
要给同一台设备下发多台打印机,只需在AirPrint数组中追加<dict>条目(每个条目一个IPAddress+ResourcePath组合)。也可以准备多个独立的 AirPrint 描述文件分别下发。
在 Fleet 中添加 AirPrint 配置文件
方式一:通过 Fleet UI 上传
- 生成负载:使用 iMazing Profile Creator 之类的 GUI 工具创建
com.apple.airprintpayload,为每台打印机填入 IP 地址/主机名与资源路径;也可以直接以仓库中的 airprint.mobileconfig 为蓝本手工编写。如果跳过 GUI,也可以让 AI 编码助手生成并校验 payload(参考 Fleet 官方的 “Build and validate configuration profiles with AI” 指南)。 - 在 Fleet 中进入Controls > OS settings > Configuration profiles,选择要下发到的 fleet(team)。
- 点击Add profile,上传
.mobileconfig文件并保存。
与 macOS 的 Printing payload 不同,Apple 允许向同一台主机交付多个 AirPrint payload,因此你可以按楼层、按部门拆分成多个描述文件分别管理,也可以把多台打印机塞进同一个 payload 的数组里,两种方式都可行。
注意:在 Fleet 的自服务配置描述文件(self-service configuration profiles,跟踪于 Fleet 官方 issue #46834)发布之前,该描述文件会推送到每一个被定向到的主机,无法由最终用户按需自行安装。
方式二:通过 GitOps 声明式下发
Fleet 支持通过fleetctl gitops用 YAML 声明配置描述文件。在 GitOps 模式下,AirPrint 描述文件在controls.apple_settings.configuration_profiles下列出:
controls: apple_settings: configuration_profiles: - path: ../lib/ios/profiles/floor2-airprint.mobileconfig关于这段 YAML 的更多细节,可参考 docs/Configuration/yaml-files.md 中的apple_settings配置说明:
configuration_profiles是配置描述文件列表,接受.mobileconfig/.json(macOS/iOS/iPadOS)或.xml(Windows)格式的文件。- 每个条目既可以用
path:引用单个文件,也可以用paths:配合 glob 模式(例如../lib/ios/profiles/*.mobileconfig)一次匹配多个文件;文件名不得包含*、?、[、{这些字符(使用path:时)。 - 默认情况下描述文件会下发到该 team 的全部主机;如果只希望定向到一部分主机,可以配合 label 使用
labels_include_all(命中所有指定 label 的主机)、labels_include_any(命中任一指定 label 的主机)或labels_exclude_any(排除命中任一指定 label 的主机),这三个字段只能同时出现一个。例如只给“二楼”标签的主机下发楼层打印机:
controls: apple_settings: configuration_profiles: - path: ../lib/ios/profiles/floor2-airprint.mobileconfig labels_include_any: - Floor 2验证部署结果
描述文件上传并推送后,从两个层面进行验证:
- 在 Fleet 侧确认安装状态:打开主机的Host details页面,进入OS settings标签页,确认该 AirPrint 描述文件的状态显示为Verified(已验证)。这里的状态反映的是 Fleet 服务端对该主机的 MDM 配置校验结果(详见下一节)。
- 在设备侧确认可用性:在主机上从任意 App 打开打印(Print)对话框,确认目标打印机出现在Printer列表中;然后实际打印一张测试页,确认连接真正可用——配置文件“安装成功”不等于打印机“能出纸”,这一步不能省。
Fleet 是如何交付并“验证”配置文件的
理解 “Verified” 状态从何而来,能帮助你更准确地排查问题。在 Fleet 服务端,这套机制由 server/mdm/apple/profile_verifier.go 中的 Profile verification 逻辑实现,其核心流程如下:
- Fleet 通过 MDM 协议向主机下发 InstallProfile 命令。命令入队后,该主机上对应 profile 的校验状态被置为pending(待处理)。
- 当主机通过 MDM 协议回报命令执行结果时,Fleet 服务端解析结果并更新状态:命令被确认(acknowledged)则进入verifying(校验中);若命令报错,服务端会判断应重试(重新入队 InstallProfile 命令)还是直接标记为failed(失败)。
- 当主机通过 osquery 上报 host details 时,Fleet 会摄取主机上实际安装的 profile 清单,与“该主机所属 team 应当安装的 profile 清单”逐一比对:找到预期 profile 则置为verified(已验证);若某个预期 profile 缺失,同样判断重试或标记为 failed。
- 此外,Fleet 服务端还有一个周期运行的 cron,会为那些校验状态仍为 null(尚未校验)的 host profile 补发 InstallProfile 命令。触发安装命令的时机还包括:主机新注册、主机更换 team、上传了新 profile、修改了既有 profile、重试失败 profile 等。
简而言之:“Verified” = MDM 命令已被确认 + osquery 上报的已安装 profile 与预期清单匹配。这解释了为什么有时 profile 显示验证通过,打印机却连不上——那通常是负载内容(IP/资源路径)与打印机实际情况不符,而非下发链路的问题。
故障排查
现象:打印对话框中不出现目标打印机
- 首先确认打印机确实支持 AirPrint。不少网络打印机把 AirPrint 作为可选固件功能,需要在打印机自己的设置界面里手动开启。如果打印机根本不支持 AirPrint,这个 payload 无济于事——它只负责列出 AirPrint 打印机,而不是安装驱动。
- 确认负载已成功下发(对照上文的 OS settings 状态),并确认主机的 iOS/iPadOS 版本支持 AirPrint 负载。
现象:profile 显示 Verified,但打印机不响应
- 对照打印机自身的网络设置页面,核对 payload 中填写的IP 地址或主机名以及resource path。一个 profile 完全可以在 resource path 与实际打印队列不匹配的情况下成功安装——payload 只负责在打印对话框中“注册”这个条目,路径对不对、队列存不存在,只有发起打印时才知道。
限制与边界
- AirPrint payload 只适用于 AirPrint 打印机;iOS/iPadOS 无法安装任何打印机驱动。
- 在 Fleet 的自服务配置描述文件功能发布前,profile 会推送到每个被定向的主机,用户无法自选。
- 定向到部分主机(label 作用域)需要 Fleet Premium;免费版仅支持按 team 全量下发。
- 每个 payload 条目都需要填写
IPAddress与ResourcePath两个字段,二者都必须与打印机端实际情况一致才能正常出纸。
如需了解 Fleet 如何交付和验证配置描述文件的通用机制,可参阅 Fleet 官方的自定义 OS 设置指南;在仓库中,你还可以继续阅读 docs/Configuration/yaml-files.md 获取 GitOps YAML 的完整参数说明,以及 server/mdm/apple/profile_verifier.go 了解验证状态机源码。
【免费下载链接】fleetOpen device management项目地址: https://gitcode.com/GitHub_Trending/fl/fleet
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考