Bring your driver to iPad with DriverKit
System & Services 进阶 20m

用 DriverKit 将驱动程序带到 iPad

Bring your driver to iPad with DriverKit

2022年6月6日

在 Apple 官方观看视频

一句话判断

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 开发阶段无需申请即可使用,降低了入门门槛
WWDC 2022