大多数浏览器和
Developer App 均支持流媒体播放。
-
利用 DriverKit 将您的驱动程序添加到 iPad
了解如何利用 DriverKit 将雷雳和 USB 配件轻松地连接到 iPad。我们将介绍如何在不更改代码的情况下转换您的现有 Mac 驱动程序,学习通过 AudioDriverKit 添加实时音频支持,并提供有关为 iPad 开发驱动程序的最佳实践和技巧。
资源
- Communicating between a DriverKit extension and a client app
- Implementing drivers, system extensions, and kexts
- System Extensions and DriverKit
相关视频
WWDC21
WWDC20
-
下载
♪ ♪
Souvik Banerjee: 大家好 欢迎来到 “Bring your driver to iPad with DriverKit” 我是 Souvik 今天我将谈一谈 DriverKit 的几个令人兴奋的新发展 今天我们将讨论三个话题 首先 我将简要介绍一下 DriverKit 然后 我将讨论 AudioDriverKit 的一些更新 最后 我将以如何将您的驱动程序 用于 iPad 来结束我的演讲 让我们从 DriverKit 的概述开始 2019年 我们推出了 DriverKit 它是 IOKit 设备驱动的一个替代 DriverKit 带来了一种 扩展系统的新方式 在用户空间中运行更可靠 更安全 由于其进程不在内核中 所以开发起来更容易 这些驱动程序扩展也被称为 dext 被捆绑在 App 中 在 Mac App Store 上发布 您的 App 和驱动程序很容易 人们可以轻易地通过搜索 找到您的驱动程序 如果您的驱动程序不再需要了 您可以删除 App 以卸载它 自从引入 DriverKit 以来 我们已经 添加了对许多新驱动家族的支持 我们现在支持 Networking Block Storage Serial Audio 和 SCSI 控制器 以及外设驱动程序 还有 USB PCI 和 HID 等传输设备 要想了解更多您可以使用 DriverKit 构建的驱动类型 请查看 WWDC 2021 的讲座 “Create audio drivers with DriverKit” 和 WWDC 2020 的讲座 “Modernize PCI and SCSI drivers with DriverKit” 接下来 我们最近在 AudioDriverKit 中 添加了几个新功能 我想强调一下 其中一个功能是实时操作 我们为在 AudioDriverKit 中 引入一个新功能而兴奋 它会允许您注册一个实时回调 每次发生 IO 操作时 都会调用此回调 如果需要在实时线程中修改 诸如信号处理的 音频缓冲区时可以使用此回调
为了在 AudioDriverKit 中 注册一个实时回调 我们要声明一个 IOOperationHandler 块 从而在 IOUserAudioDevice 上进行设置 当设备的 IOUserAudioStream 缓冲区 发生 IO 操作时 将从实时上下文 调用该块
在块内部 我们要检查操作是什么 而且可以根据需要修改数据 最后 我们要调用 SetIOOperationHandler 来设置音频设备上的块 现在我们来谈谈授权 当我们引入 AudioDriverKit 时 您必须在您的驱动上 使用 allow-any-userclient-access 授权 在 macOS 12.1 中 我们专门为 AudioDriverKit 引入了一个新的授权 请更新您的音频驱动程序 以使用新的音频系列授权 而不是 allow-any-userclient-access 授权 如果您想让任何 App 都能够与您的驱动程序通信 您可以继续允许 allow-any-userclient-access 授权 这个新的授权是对开发公开的 所以您可以开始使用它 而无需提交请求 事实上 所有的 DriverKit 系列授权 现在都可以用于开发 要申请此授权进行分发 请访问 developer.apple.com 上的 System Extension 页面 现在 我要非常兴奋地 和您聊聊 iPad 上的 DriverKit 专业人士越来越多地使用 iPad 来完成他们最好的工作 但很多人依赖的是 无法在 iPad 上使用的外部硬件 所以今天 我们很高兴地宣布 DriverKit 将会出现在 iPad 上
macOS 上的 DriverKit 使以一种安全可靠的方式 扩展系统成为可能 我们正在把同样的技术带到 iPad 上 事实上 如果您已经在 Mac 上 使用 DriverKit 创建了一个驱动程序 那么您就可以将 完全相同的驱动程序用在 iPad 上 而无需对您的驱动程序进行任何更改 USB PCI 和 Audio 都将在 iPadOS 16 中获得支持 这将使 Thunderbolt 音频接口 首次能在 iPad 和更多设备上运行 这是通过 M1 芯片的力量实现的 所有带有 M1 的 iPad 都将支持 DriverKit iPadOS 上的 DriverKit 与 macOS 上的相同 这意味着您可以构建一个 DriverKit 驱动程序 并让它在两个平台上工作 而不需要更改源代码 此外 使用 Xcode 14 新的 多平台 App 功能 您可以很容易地创建一个 单一的 App 目标 在 Mac 和 iPad 上 交付您的驱动程序 要了解更多关于多平台 App 的信息 请查看讲座 “Use Xcode to develop a multiplatform app”
Xcode 现在也支持 DriverKit 驱动的自动签名 它知道如何在 iPadOS 上 处理 DriverKit 并可以为 Mac 和 iPad 进行储备 您不再需要为 DriverKit 驱动 配置手动签名 您的 iPadOS App 和驱动程序 可以在 App Store 上发布 就像在 macOS 上一样 这意味着您可以利用 应用内购买项目等功能 让您的驱动程序易于被用户发现 让我们看看把一个现有的 macOS 驱动程序和 App 带到 iPad 上有多容易 这里 我有一个名为 DriverKitSampleApp 的 App 它有一个 SwiftUI 视图 带有标签和一个按钮 允许用户安装驱动程序 我们的驱动程序叫做 NullDriver 当驱动程序启动并开启一个 每秒触发一次的计时器时 它会打印一条消息 并增加一个 名为 timerCount 的计数器 要使它成为一个 iPad App 我需要做的就是在 Xcode 中 选择 DriverKitSampleApp 目标
并将 iPad 添加到支持的目的地
现在我可以将运行目的地更改到 已经连接到 Mac 的 iPad 上了
让我们试着在 iPad 上 运行这个 App 这是我们的 iPad App 我们有在 Xcode 中看到的 视图中的标签和按钮 点击 Install Dext 按钮会进入设置 在这里我们会看到 这个新的驱动程序链接 点击链接 就会看到该 App 中 绑定的所有驱动程序的列表 然后我们就可以启用 Null Driver 了 在演示中 您可能注意到了几点 我们的 Null Driver 被捆绑在 我们的 iPadOS App 中 它在安装后会被系统自动发现 在 macOS 上 您需要使用 SystemExtension framework 来提示用户安装驱动程序 在 iPadOS 上 没有 SystemExtensions framework
在 Xcode 中 您可以看到 我们的驱动程序嵌入在了 我们的 App 中 因为驱动程序是低级软件 是有特权的 它们需要经过用户的批准才能运行 在 macOS 上 用户需要进入 Security & Privacy 首选项 来允许系统扩展 在 iPadOS 上 驱动程序许可是在 Settings App 中 驱动程序许可有两个选项 如果至少有一个 App 安装了驱动程序 General Settings 内 将有一个带有 所有可用的驱动程序列表的菜单 每个驱动程序都可以开关 如果您的 App 包含一个设置包 在您 App 的设置中 将会有一个驱动程序链接 您的 App 应该在设置中 提示用户启用驱动程序 让我们再次开始我们的 macOS 驱动程序项目 看看我们如何让 App 提示用户在设置中启用驱动程序 我们首先要将 iPad 添加到受支持的目的地中
我们的 SwiftUI 视图 有一个按钮用于安装驱动程序 我们的视图模型有一个 与 SystemExtensions framework 交互的状态机 因为这个项目是 为 Mac 和 iPad 创建的 我们想保留我们的 Mac 视图和视图模型 但要创建一个用于 iPad 的新视图
然后 我们可以进入 Build Phase 和 Compile source 并为每个文件更改平台过滤器 以便有条件地为 iOS 或 macOS 编译
现在 让我们为我们的 App 添加一个设置包 现在 我们将使用默认的示例设置 但稍后 我们可以将这些 更改为 App 可以使用的实际设置
现在让我们检查一些 刚创建的 iOS 视图 我们可以将 macOS 视图 复制到 iOS 视图 作为一个起点
我们的 iOS 视图不使用视图模型 所以我们可以删除它
我们还需要改变按钮动作 来打开设置包 这将把用户带入设置 以便他们启用驱动程序
最后 我们要更改按钮文本 以明确 用户需要在设置中启用驱动程序
让我们看看它的实际效果 我们有了我们设计的视图 点击按钮会把我们带到设置包 然后进入驱动程序 并启用 Null Driver
重要的是要记住 驱动程序是按需发布的 虽然我们在设置中启用了驱动程序 但只有当硬件设备连接到 iPad 时 驱动程序才会开始运行 驱动程序开始运行后 我就可以使用 Xcode 无线调试 将一个调试器附加到它上面 为此 我要打开 Xcode 中的 Debug 菜单 附加到进程 然后选择 NullDriver 进程 连接之后 我可以设置断点 或暂停执行 这里 我在计时器中设置了一个断点 我要打印 timerCount 看看我们的计时器被调用了多少次
当您完成调试后 使用 Xcode 中的 Debug 菜单 从驱动进程中进行分离
现在我们有了一个驱动程序 但驱动程序本身并不是很有用 它需要与系统的其他部分通信 有些 DriverKit framework 比如 AudioDriverKit 会帮您处理它 但是如果您需要做一些更高级的事情 比如为您的硬件创建一个 自定义的控制面板 App 您需要让您的 App 能够与您的驱动程序通信 这是客户端允许您做的事情 它们允许您定义自己的界面 允许 App 和驱动程序通信 App 会使用 IOKit.framework 来打开客户端 有关这是如何运作的示例 请参考 developer.apple.com 上的 示例代码
我们知道 App 可以和驱动程序通信 但请记住安全很重要 因为驱动程序是有特权的 我们不想让每个 App 都和驱动程序通信
在 macOS 上 App 需要 driverkit userclient-access 授权 该值是一个被允许的 驱动包标识符数组
在 iPadOS 上 我们增加了一个名为 Communicates With Drivers 的新授权 它取代了 macOS 客户端授权 这个授权赋予了您的 App 向您的驱动程序 开放客户端的能力
如果您想将 Communicates With Drivers 授权 手动添加到您的 App 这是 XML 授权字符串
我们也可以用 Xcode 添加这个授权 在 Xcode 中 我们要进入 Signing and Capabilities 然后添加一个新能力 然后 我们可以搜索 “communicates with drivers” 并将该功能添加到我们的 App 中
客户端的另一个用例 是允许其他开发者的 App 与您的驱动程序交互 在这种情况下 假设您有一个 App 和驱动程序 而您想为其他 App 提供服务 包括其他开发者的 App DriverKit 客户端也支持它
每个需要与驱动程序通信的 App 都需要 communicates with drivers 授权 驱动程序需要 Allow Third Party User Clients 授权 这允许使用不同的团队标识符 构建的 App 向驱动程序打开客户端 如果没有这个授权 只有来自同一团队的 App 才能与驱动程序通信 如果您想手动向您的驱动程序添加 Allow Third Party User Client 授权 下面是 XML 授权字符串 或者我们也可以通过进入驱动程序的 Signing and Capabilities 从 Xcode 添加这个功能
这些新客户端授权是对开发公开的 这意味着您现在就可以开始使用它 无需任何批准 要申请使用这些授权 请参阅我们的开发者网站 DriverKit 驱动程序 对 App 更新也有重要影响 自动更新 App 能确保用户 总是获得最新版本的 App 然而 对于包含驱动程序的 App 更新过程略有不同 假设您在 App Store 发布了 App 的版本 1 然后 在 iPad 上安装了 该 App 及其绑定的驱动程序 并在设置中启用了驱动程序 当您为您的驱动插入硬件设备时 驱动会开始运行 一旦驱动开始运行 您的 App 就可以开始 使用客户端与您的驱动程序通信 现在 假设您在您的 App 中 发现了一个 bug 而您向 App Store 提交了版本 2 由于 App 自动更新 版本 2 的 App 是自动下载 并安装在您 iPad 上的 驱动程序批准状态 在更新中会一直维持 所以您不需要再次批准驱动程序 但是请注意 硬件仍然是插入的 我们的版本 1 驱动程序仍在运行 驱动程序版本 2 随着 App 更新被下载了下来 但没有开始运行 因为旧的驱动程序仍然在运行 您的版本 2 App 可能 不得不与版本 1 驱动程序通信
当硬件设备被拔出时 驱动程序会停止运行 所以现在驱动程序 版本 1 运行结束了 我们可以将驱动程序 更新到版本 2 了
现在 如果您再次插入设备 我们会启动版本 2 驱动程序 现在您的 App 正在与新驱动程序通信
总结一下 App 是通过 App 自动更新随时更新的 设备拔出后 驱动程序会被更新 您的 App 可能会和一个 老版驱动程序通信 当您的 App 和驱动程序准备好时 您可以将它们提交到 App Store 您的驱动程序只能在 支持 DriverKit 的设备上运行 如果您想把您的 App 限制在这些设备上 例如如果您的 App 只安装一个驱动程序 可以将 DriverKit 添加到您 App 的 UIRequiredDeviceCapabilities 上 这将防止用户在不支持 DriverKit 的 设备上安装您的 App 我们还建议您向 App 审核 提交一段视频 展示您的 App 和驱动程序 如何与您的硬件设备一起运作 这就是 iPad 上的 DriverKit 您现在可以将 USB PCI 和 Audio 驱动程序用在有 M1 的 iPad上 并在 App Store 的 App 内 发布这些驱动程序 如果您已经有驱动程序了 把它用在 iPad 上很容易 我们鼓励开发者 尝试在 iPad 上使用 DriverKit 并使用 Feedback Assistant 提供任何反馈 感谢收看
-
-
2:25 - Register real-time callback in AudioDriverKit
// Declare a IOOperationHandler block to set on the IOUserAudioDevice. // The block will be called from a real time context when a i/o operation // occurs on the IOUserAudioStream buffers for the device. io_operation = ^kern_return_t(IOUserAudioObjectID in_device, IOUserAudioIOOperation in_io_operation, uint32_t in_io_buffer_frame_size, uint64_t in_sample_time, uint64_t in_host_time) { // Add custom code to make modifications to the buffers as necessary if (in_io_operation == IOUserAudioIOOperationWriteEnd) { ... } else if (in_io_operation == IOUserAudioIOOperationBeginRead) { ... } return kIOReturnSuccess; }; this->SetIOOperationHandler(io_operation);
-
-
正在查找特定内容?在上方输入一个主题,就能直接跳转到相应的精彩内容。
提交你查询的内容时出现错误。请检查互联网连接,然后再试一次。