-
Amplía las capacidades de tu app con Virtualization
Incorpora las nuevas y potentes capacidades de macOS 27 a tu app de Virtualization. Descubre cómo automatizar la configuración de invitados de macOS mediante la configuración de la cuenta de usuario en el primer arranque. Exploraremos flujos de trabajo avanzados que incluyen la transferencia de accesorios USB a máquinas virtuales, así como topologías de red personalizadas y el reenvío de puertos. También descubrirás las mejoras recientes que pueden optimizar la experiencia al ejecutar las máquinas virtuales de tu app.
Capítulos
- 0:01 - Introducción
- 1:04 - Aprovisionamiento de invitados en macOS
- 4:34 - Accessory Access
- 8:26 - Topologías de red avanzadas
- 11:35 - DiskImageKit
- 15:57 - Virtio personalizado
Recursos
Videos relacionados
WWDC26
-
Buscar este video…
-
-
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() } } }
-