用 DriverKit 将驱动程序带到 iPad
Bring your driver to iPad with DriverKit
2022年6月6日
一句话判断
DriverKit 登陆 iPadOS 16——M1 iPad 首次支持 Thunderbolt 音频接口等外部硬件驱动,且 macOS 上的现有驱动可以零代码修改直接跨平台运行。
这场 Session 讲了什么
Apple 工程师 Souvik Banerjee 宣布了 DriverKit 在 iPadOS 16 上的到来,并介绍了 AudioDriverKit 的两个新特性。DriverKit 是 2019 年推出的 IOKit 设备驱动替代方案,运行在用户空间,比内核驱动更安全、更可靠,且可以打包在应用中通过 App Store 分发。
Session 分三个部分:DriverKit 概览、AudioDriverKit 更新(实时回调和新的 entitlement)、以及如何将现有 macOS 驱动移植到 iPad。
值得深挖的点
零源码修改的跨平台驱动。如果你已经在 macOS 上用 DriverKit 构建了驱动,同一个驱动可以直接在 iPadOS 上运行,无需任何代码修改。DriverKit 在两个平台上的实现完全一致。配合 Xcode 14 的多平台应用支持,你可以用一个 app target 同时交付 Mac 和 iPad 版本。
iPad 上的驱动安装流程与 Mac 不同。macOS 使用 SystemExtensions 框架提示用户安装驱动,用户需要在安全性与隐私设置中批准。iPadOS 没有 SystemExtensions 框架,驱动审批在 Settings app 中完成。如果应用包含 Settings Bundle,Settings 中会出现 Drivers 入口。应用自身需要引导用户前往 Settings 启用驱动。
AudioDriverKit 的实时操作。新增的 IOOperationHandler 允许注册一个实时回调,在每次 IO 操作时被触发。这对需要在实时线程上修改音频缓冲区(如信号处理)的场景至关重要。回调直接运行在实时上下文中。
新的 Audio Family Entitlement。macOS 12.1 引入了专门针对 AudioDriverKit 的 entitlement,取代了旧的 allow-any-userclient-access。新 entitlement 对开发公开可用,发布需要申请。所有 DriverKit family entitlement 现在都支持开发阶段直接使用。
M1 芯片是前提条件。DriverKit on iPad 仅支持 M1 及以上芯片的 iPad。Thunderbolt 音频接口在 iPad 上首次成为可能。
代码片段
// AudioDriverKit 注册实时回调
let handler: IOOperationHandler = { operation in
// 在实时上下文中处理音频缓冲区
switch operation {
case .read:
// 读取操作:修改输入缓冲区数据
self.processAudioInput()
case .write:
// 写入操作:准备输出缓冲区数据
self.processAudioOutput()
default:
break
}
}
// 将回调设置到音频设备
audioDevice.setIOOperationHandler(handler)
// Xcode 14 多平台配置:添加 iPad 到 Supported Destinations
// 使用 Build Phases 中的平台过滤器条件编译
// iOS 视图使用不同的驱动安装引导方式
Button("在设置中启用驱动") {
// iPad 上引导用户前往 Settings
if let url = URL(string: UIApplication.openSettingsURLString) {
UIApplication.shared.open(url)
}
}
最佳实践
- 迁移 macOS 驱动到 iPad 时,使用条件编译分离平台特定的 UI 代码(Mac 用 SystemExtensions,iPad 用 Settings 引导)
- 音频驱动从 allow-any-userclient-access 迁移到新的 audio family entitlement
- 驱动打包在应用内,用户删除应用即卸载驱动——让安装和卸载都很简洁
- iPad 应用应该主动提示用户去 Settings 启用驱动,不要假设用户知道在哪里找到开关
- 利用 Xcode 14 的自动签名支持,不再需要手动配置 DriverKit 驱动的签名
还有什么值得关注
- iPadOS 16 支持 USB、PCI 和 Audio 三种驱动类型,未来可能会扩展更多
- 驱动可以通过 App Store 分发,支持应用内购买等商业模式
- Settings Bundle 不仅用于驱动审批,还可以放应用本身的配置项
- 所有 DriverKit family entitlement 开发阶段无需申请即可使用,降低了入门门槛