View in English

  • Apple 开发者
    • 入门汇总

    探索“入门汇总”

    • 概览
    • 学习
    • Apple Developer Program

    及时了解最新动态

    • 最新动态
    • 开发者你好
    • 平台

    探索“平台”

    • Apple 平台
    • iOS
    • iPadOS
    • macOS
    • Apple tvOS
    • visionOS
    • watchOS
    • App Store

    精选

    • 设计
    • 分发
    • 游戏
    • 配件
    • 网页
    • Home
    • CarPlay 车载
    • 技术

    探索“技术”

    • 概览
    • Xcode
    • Swift
    • SwiftUI

    精选

    • 辅助功能
    • App Intents
    • Apple 智能
    • 游戏
    • 机器学习与 AI
    • 安全性
    • Xcode Cloud
    • 社区

    探索“社区”

    • 概览
    • “与 Apple 会面交流”活动
    • 社区主导的活动
    • 开发者论坛
    • 开源

    精选

    • WWDC
    • Swift Student Challenge
    • 开发者故事
    • App Store 大奖
    • Apple 设计大奖
    • Apple Developer Centers
    • 文档

    探索“文档”

    • 文档库
    • 技术概述
    • 示例代码
    • 《人机界面指南》
    • 视频

    发布说明

    • 精选更新
    • iOS
    • iPadOS
    • macOS
    • watchOS
    • visionOS
    • Apple tvOS
    • Xcode
    • 下载

    探索“下载”

    • 所有下载
    • 操作系统
    • 应用程序
    • 设计资源

    精选

    • Xcode
    • TestFlight
    • 字体
    • SF Symbols
    • Icon Composer
    • 支持

    探索“支持”

    • 概览
    • 帮助指南
    • 开发者论坛
    • “反馈助理”
    • 联系我们

    精选

    • 《开发者账户帮助》
    • 《App 审核指南》
    • 《App Store Connect 帮助》
    • 即将实行的要求
    • 协议和准则
    • 系统状态
  • 快速链接

    • 活动
    • 新闻
    • 论坛
    • 示例代码
    • 视频
 

视频

打开菜单 关闭菜单
  • 专题
  • 所有视频
  • 关于

更多视频

  • 简介
  • 概要
  • 转写文稿
  • 代码
  • 扩展虚拟化 App 的功能

    将 macOS 27 强大的新功能融入你的虚拟化 App。了解如何通过在首次启动时设置用户账户来自动配置 macOS 客户机。我们将一起探索一些高级工作流程,看看如何实现 USB 配件直通虚拟机,以及自定网络拓扑和端口转发。你还将了解能够丰富 App 虚拟机体验的最新改进。

    章节

    • 0:01 - Introduction
    • 1:04 - macOS guest provisioning
    • 4:34 - Accessory Access
    • 8:26 - Advanced network topologies
    • 11:35 - DiskImageKit
    • 15:57 - Custom Virtio

    资源

    • DiskImageKit
    • Accessory Access
    • vmnet
    • Virtual I/O Device (VIRTIO) Version 1.4
    • Virtualization
      • 高清视频
      • 标清视频

    相关视频

    WWDC26

    • 探索容器机
  • 搜索此视频…

    你好!

    我是Ronnie Misra 来自Virtualization团队 在本讲座中 我将探讨 如何为你的Virtualization App 添加高级功能 你可以使用Virtualization框架 创建提供完整桌面体验的App 或实现复杂的开发者工作流 例如测试协作式Mac App 及设备间的网络连接 你还可以构建命令行工具和自动化脚本 在受控环境中 实现一致的测试流程 今天 我将带你了解 一些新的和现有的API 让你的Virtualization App 更加强大 我将介绍:自动化 虚拟Mac的设置流程 以及将USB设备连接到虚拟机 通过Accessory Access框架 我将探讨如何配置 高级网络拓扑 以及如何创建高性能 高效的磁盘镜像 通过DiskImageKit框架 最后 我将介绍 如何创建自定义 使用Virtio构建 高性能虚拟设备

    首先 我将向你展示 Virtualization如何让你 自动化macOS访客预配置 将macOS安装到 虚拟Mac之后 你可以按照与实体Mac 完全相同的方式进行配置 使用你已熟悉的设置助理 这提供了便捷的方式 来创建用户账户 并配置常用设置 但对于自动化使用场景 以编程方式设置虚拟Mac 会更加方便 Virtualization框架现在 允许你的App指定预配置选项 在虚拟Mac启动时 你提供全名、用户名和密码 还可以选择启用 自动登录或SSH远程登录 当访客首次启动时 这些参数会自动传递给设置助理 系统将使用指定的凭据创建用户 并根据请求启用 自动登录和远程登录 要使用macOS访客预配置API 首先创建 VZMacGuestProvisioningOptions对象 并配置所需的设置 这里我创建了provisioningOptions 用于创建用户账户 启用自动登录以及启用SSH 然后构建 VZMacOSVirtualMachineStartOptions对象 并设置其访客预配置属性 为刚才构建的provisioningOptions 最后使用这些startOptions 启动你的虚拟Mac 当访客启动时 这些预配置选项将用于 自动化虚拟Mac的配置 现在我来演示实际效果 我修改了macOS虚拟机示例App 以使用macOS访客预配置API 我已将macOS安装 到新的虚拟Mac上 但尚未启动它 我将双击App以首次 启动该虚拟Mac

    App提示我 输入预配置选项 由于之前运行过这个App 它记住了我偏好的 预配置选项 为Jane Appleseed创建用户 并启用自动登录 和远程登录 我现在点击"好" 接受这些设置

    我的App已使用这些 预配置选项启动了虚拟Mac Virtualization框架将把 这些选项传递给访客 这样我就无需手动浏览设置助理了 设置助理自动创建了一个新用户 设置助理已成功 创建了新账户 由于我的预配置选项 指示应启用自动登录 访客已登录到该账户 我现在将在虚拟Mac中 打开一个Finder窗口

    侧边栏显示用户名jappleseed 与我提供的用户名一致 现在我将打开系统设置 并浏览到远程登录共享设置

    系统设置确认 远程登录已启用 我的虚拟Mac现在已准备就绪! 我只需启动它即可 请注意 这些设置仅在 访客尚未完成设置时才有效 如果访客中已经创建了用户 后续启动时传入的 预配置选项将被忽略 使用这些API时 请认真考虑密码的处理方式 并考虑对App的安全影响 例如 不要在代码中 硬编码密码

    而是从钥匙串中读取 或从配置文件或环境变量中获取 接下来 我将介绍 如何附加USB配件 通过Accessory Access

    某些虚拟机使用场景 需要能够 将连接到主机的USB配件 的访问权限授予访客 例如 有人可能希望 使用USB驱动器 在虚拟机内部 与此同时 用户应保持 对其设备的控制权 Accessory Access是一个新框架 旨在支持 将USB设备提供给 macOS和Linux虚拟机使用 Accessory Access的核心原则是 用户应拥有明确的控制权 哪些设备被附加到哪些App 用户可以了解哪些App 正在使用其设备 并可以随时附加或分离设备 Accessory Access支持设备热插拔 当有人授予App访问设备的权限时 设备可以在运行时 附加到虚拟机 而无需更改虚拟机的静态配置 在深入了解细节之前 先来看Accessory Access的实际效果 我正在运行此前展示的 macOS虚拟机示例App 我现在将把USB驱动器 连接到我的Mac

    我的驱动器图标 已出现在桌面上 另外 由于虚拟机App正在运行 并且已声明对存储设备感兴趣 菜单栏中现在出现了一个配件图标 我现在将在配件菜单中 选择我的磁盘 并将其附加到我的App

    由于我将此驱动器 附加到了虚拟Mac 我的主机已卸载该驱动器 而访客已挂载它 现在我将从虚拟Mac内部 安全弹出该驱动器

    然后我将使用配件菜单 将驱动器释放回我的主机

    现在我已将驱动器 释放回主机 主机已重新挂载该驱动器 这演示了Accessory Access如何 让你轻松使用USB配件 在虚拟机中 要使用Accessory Access 你的App要向其注册一个监听器 并附带描述感兴趣设备类型 的匹配条件 你可以按设备类别和子类别过滤 供应商ID和产品ID 或其他条件 当匹配的设备 连接到Mac时 Accessory Access菜单附加项将出现 用户可以在此决定 是否将设备附加到你的App 如果设备被附加到你的App 你App的监听器对象将收到 新附加设备的通知 要使用Accessory Access 首先创建 AAUSBAccessoryMatchingCriteria对象数组 描述你感兴趣的设备类型 你可以使用空数组 来表示对所有USB设备感兴趣 然后使用AAUSBAccessoryManager 注册一个监听器 此监听器应实现 AAUSBAccessoryListener协议 registerListener将返回 之前已附加的配件 到你App的任何配件 当有人将设备附加到你的App时 你的监听器的usbAccessoryDidConnect 函数将被调用 在此函数中 你可以将 设备附加到你的虚拟机 VZVirtualMachine要求 在其专用队列上进行修改 在该队列上 你可以使用 VZUSBPassthroughDeviceConfiguration类 创建VZUSBPassthroughDevice 然后将此设备附加到 虚拟机的某个USB控制器

    为了让你的App 使用Accessory Access 请在Xcode目标的功能中 添加"声明USB配件"功能 请记住 用户可以随时选择 将设备附加或分离到你的App 你的App应能优雅地处理这些事件 请参阅Accessory Access文档 了解支持的设备类型详情

    在macOS 26及更高版本中 你的App可以使用vmnet框架 来配置虚拟网络接口 Virtualization框架可以轻松 配置隔离的虚拟机 使用基本的NAT或桥接网络 但对于更高级的使用场景 你可能需要更多控制 虚拟机之间或与外部网络 的交互方式 例如 你可能想测试 与服务器虚拟机的连接 来自同一网络或不同网络上的客户端 vmnet框架允许你 创建自定义网络拓扑 以支持这些高级使用场景 使用vmnet框架 你可以为 你的macOS和Linux VM 创建自定义网络拓扑 vmnet允许你控制 你的VM如何相互通信 vmnet还允许你配置 这些自定义网络的各种参数 例如 你可以配置 网络的DHCP设置 或添加规则来转发 TCP或UDP主机端口 到特定的虚拟机 要将vmnet与 Virtualization框架配合使用 首先创建 vmnet网络配置对象 使用该配置构建vmnet网络对象 然后可以使用该网络对象 构建网络设备附件 此网络设备附件随后 附加到网络设备配置 而网络设备配置依次 添加到虚拟机配置 最后使用该虚拟机配置 构建虚拟机 如果你希望第二个虚拟机 使用同一vmnet网络 按照相同步骤 配置第二个虚拟机 确保使用同一个vmnet网络对象 现在我用代码来展示这些步骤 首先创建vmnet配置对象 使用vmnet_network_configuration_create vmnet提供了几个函数 来自定义该网络: 例如 你可以配置 网络的DHCP设置 启用端口转发等 一旦你有了网络配置对象 你可以使用vmnet_network_create 构建vmnet网络对象 然后构建 VZVmnetNetworkDeviceAttachment 让Virtualization使用 你刚创建的vmnet网络

    接下来 在VZVirtioNetworkDeviceConfiguration 对象上设置附件 此networkDeviceConfiguration 被添加到networkDevices数组中 在你的VZVirtualMachineConfiguration对象上 最后 此配置将用于 构建你的VZVirtualMachine vmnet网络对象是一个 引用计数的Objective-C对象 当最后一个引用被释放时 该网络将消失 这也意味着vmnet网络 在App退出时不会持久化 如果你希望创建 一致的网络配置 你的App必须自行 持久化vmnet设置 vmnet提供了 vmnet_network_copy_serialization 和vmnet_network_create_with_serialization API 用于通过XPC连接 将vmnet网络从一个进程 传输到另一个进程 这在你希望在单独进程中 运行多个VM时很有用 但将它们连接到同一网络

    接下来 我将向你展示 如何使用DiskImageKit高效处理磁盘镜像 Virtualization框架支持 使用标准原始磁盘镜像文件 作为虚拟机磁盘的后端 这种简单格式将磁盘块 与文件块一一对应 这种简单性意味着该格式 被现有软件广泛支持 然而 这种简单性是有代价的 原始磁盘镜像本身 无法表示稀疏性 例如 100 GB的磁盘 由100 GB的文件表示 这也使快照的开销很大 对VM磁盘进行快照 需要复制整个磁盘

    DiskImageKit是macOS 27中的新框架 旨在使磁盘镜像管理 更加高效 它支持在macOS 26中引入的 Apple Sparse Image Format(ASIF) DiskImageKit允许你 构建镜像堆栈 允许写入进入覆盖层 同时保持基础层不变 DiskImageKit还支持原始磁盘镜像 在构建堆叠镜像时 DiskImageKit支持 几种不同类型的层 堆叠镜像的最底层 称为基础层 此层可以是 DiskImageKit支持的任何格式 上层始终是ASIF镜像 这些层可以是 缓存层或覆盖层 缓存层可用于提升性能 当底层存储在慢速存储设备上时 例如远程网络文件系统 处理读取请求时 如果缓存层无法满足该读取 DiskImageKit将从下层 满足该读取 但会在缓存层 存储一份数据副本 后续对同一数据的读取 将从缓存中读取

    覆盖层可用于实现 快照的写时复制语义 向堆叠镜像写入时 如果DiskImageKit在遍历堆栈时 发现可写覆盖层 它会将写入数据存储在该层

    DiskImageKit允许只读层 被多个并发堆栈共享 这允许高效复用共享内容 在多个虚拟机之间 同时保持各自的独立写入分离

    ASIF镜像是稀疏的 这意味着ASIF镜像在逻辑上 可能代表更多块 多于实际存储在镜像中的块 从ASIF文件读取时 未存储在镜像中的块 被视为全零填充

    我将介绍DiskImageKit如何 处理读取和写入请求 以一个示例堆栈为例 在这个示例中 基础层 包含块0、1和4的内容 缓存层不包含任何块的内容 覆盖层包含块4的更新内容 以及块5的内容 注意 一个层可以有 不同的逻辑大小 与其上层或下层不同 要满足对块0的读取 DiskImageKit将遍历 堆叠镜像的各层 直到找到包含该块内容的层 此读取将由基础层满足 由于存在缓存层 DiskImageKit将缓存 此块的内容 然后将内容返回给调用方 后续对同一块的读取 将由缓存层满足

    写入块2时 DiskImageKit将发现 最顶层是覆盖层 并将内容存储在那里

    要将DiskImageKit镜像 与Virtualization配合使用 首先创建DiskImage对象

    如果你想使用堆叠镜像 创建多个DiskImage对象 然后按顺序追加它们 然后可以构建 VZDiskImageStorageDeviceAttachment 从你的stackedImage 然后可以将其附加 到storageDeviceConfiguration 例如VZVirtioBlockDeviceConfiguration 将此storageDeviceConfiguration添加 到你的虚拟机配置的 storageDevices中 最后使用此配置 创建你的VZVirtualMachine

    使用堆叠镜像时 值得注意的是浅层堆栈性能更好 存在性能开销 随着磁盘镜像堆栈深度的增加 请记住虚拟机 不仅仅包含磁盘镜像 例如 虚拟Mac有辅助存储文件 使用EFI引导加载程序的VM 有EFI变量存储文件 如果你想克隆VM 并使用共享基础层 请记住必须复制 那些其他文件

    最后 我将展示 自定义Virtio API 如何让你构建自定义通信通道 在你的App 与Linux虚拟机之间

    虽然Virtualization框架 已经支持多种 标准设备类别 但某些使用场景 可能需要更专业的功能 也许你想实现自定义协议 用于主机与访客之间 性能敏感的通信 也许你想实现协处理器 例如Virtio加密设备 你可能想提供高效的访客访问 机器学习加速器 这就是自定义Virtio设备API 的用武之地 Virtio是一种半虚拟化设备 的行业标准 它是用于实现许多 内置Virtualization设备的协议 在macOS 27中 Virtualization框架 允许你实现 自己的Virtio设备 从而实现你的主机App与 Linux虚拟机之间的自定义通信 这对性能敏感的场景尤其有用 在这些场景中你需要 低延迟、高吞吐量的通信

    Virtio协议使用内存缓冲区 在访客和主机之间共享 这些缓冲区被组织 成Virtio队列 Virtio旨在最小化 访客与主机之间的 上下文切换次数 访客中的设备驱动程序 通知运行在主机上的设备 数据已入队 类似地 主机可以使用中断 通知访客驱动程序 已入队的数据

    在macOS 27中 VZCustomVirtioDevice类 可用于实现你的自定义设备 你的App在设备上设置委托 当访客在其队列上入队数据时 此委托将收到通知 你也可以通过在设备上 触发中断来发起访客中的活动 要使用自定义Virtio设备API 首先创建 VZCustomVirtioDeviceConfiguration对象 使用你的设备的Virtio 设备身份来配置此对象 其PCI类别和子类别 以及你的设备使用的 Virtio队列数量

    你还需要在配置上设置提供者 VZCustomVirtioDeviceDelegateProvider 用于配置委托 该委托实现 VZCustomVirtioDeviceConfigurationDelegate协议 然后将此deviceConfiguration 添加到你的virtualMachineConfiguration的 customVirtioDevices数组中 并使用该配置 创建VZVirtualMachine

    当虚拟机启动时 将创建一个VZCustomVirtioDevice对象 并调用你的配置委托的 didCreateDevice函数 在此函数中 你应该设置设备的委托 此委托应实现 VZCustomVirtioDeviceDelegate协议 你也可以保留设备本身的引用 以便你的设备 可以触发访客中断

    VZCustomVirtioDeviceDelegate协议中 有几个函数 可用于监控设备的生命周期 并与设备进行交互 didReceiveNotificationFor函数 是你实现逻辑的地方 用于从设备队列出队元素 处理这些元素 然后将它们返回队列

    请记住 自定义设备 需要自定义驱动程序 才能让访客使用你的设备 Virtio队列旨在提供 高效的通信 在访客和主机之间 在设计访客驱动程序时 请务必遵循最佳实践 以充分利用Virtio队列 在结束之前 我想简要介绍 Virtualization的其他改进 可以让你的App更加出色

    iCloud支持对桌面体验 尤为有价值 允许用户在VM中访问 其iCloud数据和服务 EFI Secure Boot以现代安全功能 强化Linux VM macOS访客可以利用Metal功能 例如参数缓冲区 和间接命令缓冲区

    你现在已准备好为你的 Virtualization App 添加更多功能 自动化macOS用户账户的设置 通过配置预配置选项 使用Accessory Access框架 将USB设备附加到VM 通过构建自己的网络拓扑 为你的VM自定义网络 并配置端口转发 使用DiskImageKit框架 创建高效的稀疏磁盘镜像 对于Linux访客中 自定义高性能设备的需求 考虑使用Virtio创建自定义设备

    感谢观看! 祝WWDC愉快

    • 1:57 - Provision a macOS guest

      import Virtualization
      
      let provisioningOptions = VZMacGuestProvisioningOptions()
      provisioningOptions.fullName = fullName
      provisioningOptions.username = username
      provisioningOptions.password = password
      provisioningOptions.logsInAutomatically = true
      provisioningOptions.enablesRemoteLogin = true
      
      let startOptions = VZMacOSVirtualMachineStartOptions()
      try startOptions.setGuestProvisioning(provisioningOptions)
      
      try await virtualMachine.start(options: startOptions)
    • 7:12 - Register an Accessory Access listener

      import AccessoryAccess
      
      let criteria: [AAUSBAccessoryMatchingCriteria] = []
      let accessories = try await AAUSBAccessoryManager.shared.registerListener(self, matchingCriteria: criteria)
      
      for accessory in accessories {
          // Handle previously attached accessories.
      }
    • 7:39 - Respond to USB accessory connection

      import AccessoryAccess
      import Virtualization
      
      class AccessoryListener: NSObject, AAUSBAccessoryListener {
          func usbAccessoryDidConnect(_ usbAccessory: AAUSBAccessory) {
              virtualMachine.queue.async {
                  do {
                      let configuration = VZUSBPassthroughDeviceConfiguration(device: usbAccessory)
                      let device = try VZUSBPassthroughDevice(configuration: configuration)
                      self.virtualMachine.usbControllers.first?.attach(device: device) { error in
                          // Handle error if necessary...
                      }
                  } catch {
                      // Handle error...
                  }
              }
          }
      }
    • 10:04 - Create a custom vmnet network

      import Virtualization
      import vmnet
      
      var status: vmnet_return_t = .VMNET_FAILURE
      guard let networkConfiguration =
          vmnet_network_configuration_create(.VMNET_SHARED_MODE, &status) else { ... }
      
      guard let network =
          vmnet_network_create(networkConfiguration, &status) else { ... }
      
      let attachment = VZVmnetNetworkDeviceAttachment(network: network)
      
      let networkDeviceConfiguration = VZVirtioNetworkDeviceConfiguration()
      networkDeviceConfiguration.attachment = attachment
      
      virtualMachineConfiguration.networkDevices = [networkDeviceConfiguration]
      
      let virtualMachine = VZVirtualMachine(configuration: virtualMachineConfiguration)
    • 14:54 - Use DiskImageKit with Virtualization

      import DiskImageKit
      import Virtualization
      
      let baseImage = try DiskImage(opening: .open(url: baseLayerURL, mode: .readOnly))
      let cacheImage = try baseImage.appending(.asifLayer(url: cacheLayerURL, type: .cache))
      let overlayImage = try DiskImage(opening: .open(url: overlayLayerURL))
      let stackedImage = try cacheImage.appending(overlayImage)
      
      let storageDeviceAttachment = try VZDiskImageStorageDeviceAttachment(diskImage: stackedImage)
      
      let storageDeviceConfiguration =
          VZVirtioBlockDeviceConfiguration(attachment: storageDeviceAttachment)
      
      virtualMachineConfiguration.storageDevices = [storageDeviceConfiguration]
      
      let virtualMachine = VZVirtualMachine(configuration: virtualMachineConfiguration)
    • 17:41 - Configure a custom Virtio device

      import Virtualization
      
      let deviceConfiguration = VZCustomVirtioDeviceConfiguration()
      
      // Virtio entropy device.
      deviceConfiguration.deviceID = 4
      // PCI class for crypto devices.
      deviceConfiguration.pciClassID = 0x10
      // PCI subclass for network and computing encryption controllers.
      deviceConfiguration.pciSubclassID = 0x00
      // An entropy device uses a single Virtio queue.
      deviceConfiguration.virtioQueueCount = 1
      
      deviceConfiguration.provider =
          VZCustomVirtioDeviceDelegateProvider(deviceQueue: deviceQueue, delegate: provider)
      
      virtualMachineConfiguration.customVirtioDevices = [deviceConfiguration]
      
      let virtualMachine = VZVirtualMachine(configuration: virtualMachineConfiguration)
    • 18:20 - Attach a delegate to a VZCustomVirtioDevice

      import Virtualization
      
      class DeviceConfigurationDelegate: NSObject, VZCustomVirtioDeviceConfigurationDelegate {
          func customVirtioConfiguration(_ deviceConfiguration: VZCustomVirtioDeviceConfiguration,
                                         didCreateDevice device: VZCustomVirtioDevice) {
              device.delegate = deviceDelegate
              self.device = device
          }
      }
    • 18:42 - Process Virtio queue elements

      import Virtualization
      
      class DeviceDelegate: NSObject, VZCustomVirtioDeviceDelegate {
          func customVirtioDevice(_ device: VZCustomVirtioDevice,
                                  didReceiveNotificationFor queue: VZVirtioQueue) {
              while let element = queue.nextElement() {
                  // Process element...
                  element.returnToQueue()
              }
          }
      }
    • 0:01 - Introduction
    • The advanced Virtualization capabilities ahead — automating Virtual Mac setup, attaching USB devices with the Accessory Access framework, configuring advanced networking, creating disk images with DiskImageKit, and building custom Virtio devices.

    • 1:04 - macOS guest provisioning
    • Automate the provisioning of user accounts in Setup Assistant for virtual Macs. Use the VZMacGuestProvisioningOptions API to set credentials and enable features like auto-login and SSH on first boot.

    • 4:34 - Accessory Access
    • Pass through USB accessories directly into virtual machines using the Accessory Access framework. This approach gives people explicit control over which physical devices, such as external drives, are passed through to the virtual machine.

    • 8:26 - Advanced network topologies
    • Configure complex network topologies by integrating the vmnet framework with Virtualization. You can create custom network architectures that define exactly how multiple virtual machines interact with each other and the host.

    • 11:35 - DiskImageKit
    • DiskImageKit is a new framework in macOS 27 designed for managing high-performance, space-efficient disk images. You can use layered disk images, including base layers, cache layers, and overlay layers, to share data efficiently across multiple virtual machines.

    • 15:57 - Custom Virtio
    • Define and implement custom paravirtualized devices using the industry-standard Virtio protocol. By using the VZCustomVirtioDevice API, you can enable specialized, high-performance communication between the host and custom drivers running in the virtual machine.

Developer Footer

  • 视频
  • WWDC26
  • 扩展虚拟化 App 的功能
  • 打开菜单 关闭菜单
    • iOS
    • iPadOS
    • macOS
    • Apple tvOS
    • visionOS
    • watchOS
    打开菜单 关闭菜单
    • Swift
    • SwiftUI
    • Swift Playground
    • TestFlight
    • Xcode
    • Xcode Cloud
    • SF Symbols
    打开菜单 关闭菜单
    • 辅助功能
    • 配件
    • Apple 智能
    • App 扩展
    • App Store
    • 音频与视频 (英文)
    • 增强现实
    • 设计
    • 分发
    • 教育
    • 字体 (英文)
    • 游戏
    • 健康与健身
    • App 内购买项目
    • 本地化
    • 地图与位置
    • 机器学习与 AI
    • 开源资源 (英文)
    • 安全性
    • Safari 浏览器与网页 (英文)
    打开菜单 关闭菜单
    • 完整文档 (英文)
    • 部分主题文档 (简体中文)
    • 教程
    • 下载
    • 论坛 (英文)
    • 视频
    打开菜单 关闭菜单
    • 支持文档
    • 联系我们
    • 错误报告
    • 系统状态 (英文)
    打开菜单 关闭菜单
    • Apple 开发者
    • App Store Connect
    • 证书、标识符和描述文件 (英文)
    • 反馈助理
    打开菜单 关闭菜单
    • Apple Developer Program
    • Apple Developer Enterprise Program
    • App Store Small Business Program
    • MFi Program (英文)
    • Mini Apps Partner Program
    • News Partner Program (英文)
    • Video Partner Program (英文)
    • 安全赏金计划 (英文)
    • Security Research Device Program (英文)
    打开菜单 关闭菜单
    • 与 Apple 会面交流
    • Apple Developer Center
    • App Store 大奖 (英文)
    • Apple 设计大奖
    • Apple Developer Academies (英文)
    • WWDC
    阅读最近新闻。
    获取 Apple Developer App。
    版权所有 © 2026 Apple Inc. 保留所有权利。
    使用条款 隐私政策 协议和准则