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

    • 探索容器机
  • 搜索此视频…
    • 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. 保留所有权利。
    使用条款 隐私政策 协议和准则