-
Mejora la conectividad de los dispositivos con Wi-Fi Aware
Aprende a crear conexiones de redes entre pares con Wi-Fi Aware. También abarcaremos cómo compartir videos en tiempo real, transferir archivos de gran tamaño y controlar accesorios con un ancho de banda mejorado y una menor latencia. Y aprenderás a usar DeviceDiscoveryUI, AccessorySetupKit y el marco Network para usar Wi-Fi Aware en tu app.
Capítulos
- 0:00 - Introducción
- 1:01 - Descripción general
- 7:46 - Emparejar
- 15:05 - Conectar
- 19:01 - Optimizar
- 22:26 - Lineamientos
Recursos
Videos relacionados
WWDC24
-
Buscar este video…
-
-
6:57 - Access capabilities and services
import WiFiAware // Check if Wi-Fi Aware is supported on your device guard WACapabilities.supportedFeatures.contains(.wifiAware) else { return } // Publishable service declared in Info.plist extension WAPublishableService { public static var fileService: WAPublishableService { allServices["_file-service._tcp"]! } } // Subscribable services declared in Info.plist extension WASubscribableService { public static var fileService: WASubscribableService { allServices["_file-service._tcp"]! } public static var droneService: WASubscribableService { allServices["_drone-service._udp"]! } } -
10:33 - Pair with DeviceDiscoveryUI
import DeviceDiscoveryUI import WiFiAware import SwiftUI // Listener (Publisher) Device // Invoke Listener UI DevicePairingView(.wifiAware(.connecting(to: .fileService, from: .selected([])))) { // Provide a view to display to user before launching System UI } fallback: { // Provide a view in case of error } // Browser (Subscriber) Device // Invoke Browser UI DevicePicker(.wifiAware(.connecting(to: .selected([]), from: .fileService))) { endpoint in // Process the paired network endpoint } label: { // Provide a view to display to user before launching System UI } fallback: { // Provide a view in case of error } -
12:29 - Pair with AccessorySetupKit
import AccessorySetupKit // Configure ASDiscoveryDescriptor (Subscriber) let descriptor = ASDiscoveryDescriptor() descriptor.wifiAwareServiceName = "_drone-service._udp" descriptor.wifiAwareModelNameMatch = .init(string: "Example Model") descriptor.wifiAwareVendorNameMatch = .init(string: "Example Inc", compareOptions: .literal) let item = ASPickerDisplayItem(name: "My Drone", productImage: UIImage(named: "DroneProductImage")!, descriptor: descriptor) // Create and activate session let session = ASAccessorySession() session.activate(on: sessionQueue) { event in // Closure will execute when device is added with event: .accessoryAdded // ASAccessoryWiFiAwarePairedDeviceID can be used to lookup a WAPairedDevice } // Present Picker UI session.showPicker(for: [item]) { error in // Handle error } -
13:51 - Access paired devices
import Foundation import WiFiAware // WAPairedDevice var device: WAPairedDevice // Get using WAPairedDevice.allDevices // Access WAPairedDevice properties let pairingName = device.pairingInfo?.pairingName let vendorName = device.pairingInfo?.vendorName let modelName = device.pairingInfo?.modelName // Create a filter to select devices of interest let filter = #Predicate<WAPairedDevice> { $0.pairingInfo?.vendorName.starts(with: "Example Inc") ?? false } // Get all paired devices, matching the filter, at the current moment // A new snapshot of all paired devices each time a device is added, changed, or removed for try await devices in WAPairedDevice.allDevices(matching: filter) { // Process new snapshot of all paired devices } -
16:23 - Filter paired devices
import Foundation import WiFiAware // Listener (Publisher) Device // Specify the paired devices of interest for the use case let deviceFilter = #Predicate<WAPairedDevice> { $0.name?.starts(with: "My Device") ?? false } // Browser (Subscriber) Device // Specify the paired devices of interest for the use case let deviceFilter = #Predicate<WAPairedDevice> { $0.pairingInfo?.vendorName.starts(with: "Example Inc") ?? false } -
16:54 - Create listener and browser
import WiFiAware import Network // Listener (Publisher) Device: Construct a NetworkListener let listener = try NetworkListener(for: .wifiAware(.connecting(to: .fileService, from: .matching(deviceFilter))), using: .parameters { TLS() }) .onStateUpdate { listener, state in // Process state update } // Browser (Subscriber) Device: Construct a NetworkBrowser let browser = NetworkBrowser(for: .wifiAware(.connecting(to: .matching(deviceFilter), from: .fileService)) ) .onStateUpdate { browser, state in // Process state update } -
17:44 - Establish a connection
// Listener (Publisher) Device: Start NetworkListener try await listener.run { connection in // Radio resources in use // Closure executes for each incoming connection connection.onStateUpdate { connection, state in // Process state update } } // Browser (Subscriber) Device: Start NetworkBrowser let endpoint = try await browser.run { waEndpoints in // Radio resources in use // Review endpoints, decide whether to return or skip if let endpoint = self.endpoint(in: waEndpoints) { return .finish(endpoint) } else { return .continue } } // Create the connection let connection = NetworkConnection(to: endpoint, using: .parameters { TLS() }) .onStateUpdate { connection, state in // Process state update } -
21:11 - Tune performance
// Listener (Publisher) Device // Configure .realtime + .interactiveVideo on NetworkListener let listener = try NetworkListener(for: .wifiAware(.connecting(to: .fileService, from: .matching(deviceFilter))), using: .parameters { TLS() } .wifiAware { $0.performanceMode = .realtime } .serviceClass(.interactiveVideo)) // Browser (Subscriber) Device // Configure .realtime + .interactiveVideo on NetworkConnection let connection = NetworkConnection(to: endpoint, using: .parameters { TLS() } .wifiAware { $0.performanceMode = .realtime } .serviceClass(.interactiveVideo)) // Listener (Publisher) Device & Browser (Subscriber) Device // Read performance report let performanceReport = try await connection.currentPath?.wifiAware?.performance
-
-
- 0:00 - Introducción
Aprende a usar Wi-Fi Aware en iOS y iPadOS para crear conexiones de red punto a punto con baja latencia y alto rendimiento.
- 1:01 - Descripción general
Wi-Fi Aware es un estándar que permite la comunicación directa entre dispositivos sin necesidad de enrutadores o servidores centrales. Funciona junto con conexiones Wi-Fi regulares, lo que permite que los dispositivos se descubran y se conecten de forma segura y dinámica para experiencias efímeras locales como el intercambio de archivos, la transmisión multimedia, el control de accesorios y la pantalla compartida. Wi-Fi Aware es multiplataforma e interoperable, con conexiones totalmente autenticadas y encriptadas. Las apps pueden definir servicios, especificar roles como editores o suscriptores (o ambos) y sincronizar dispositivos para lograr reconexiones rápidas y sin inconvenientes siempre que estén cerca.
- 7:46 - Emparejar
Los dispositivos se pueden enlazar mediante la estructura DeviceDiscoveryUI o la estructura AccessorySetupKit. DeviceDiscoveryUI es adecuada para el enlace de app a app y es compatible con dispositivos Apple y de terceros. AccessorySetupKit es adecuada para el enlace de app a accesorio. Una vez enlazados los dispositivos, ambas estructuras permiten que las apps accedan y administren la lista de dispositivos enlazados, recuperen sus propiedades y escuchen los cambios en el estado de emparejamiento, lo que permite que la app actualice su IU y su estado en consecuencia.
- 15:05 - Conectar
Una vez enlazados, los dispositivos pueden conectarse entre sí. Un dispositivo tiene el rol de editor y el otro dispositivo tiene el rol de suscriptor. El editor filtra por dispositivos específicos y comienza a escuchar, mientras que el suscriptor filtra y comienza a navegar. Una vez que el suscriptor encuentra al editor, proporciona puntos finales a la app, que después establece conexiones. El receptor recibe y reenvía estas solicitudes de conexión, lo que permite el intercambio de datos.
- 19:01 - Optimizar
Para optimizar el rendimiento de la conexión de una app, la estructura Wi-Fi Aware permite a los desarrolladores ajustar ciertos parámetros. La estructura proporciona dos modos de rendimiento principales: masivo y en tiempo real. El modo masivo es energéticamente eficiente, pero tiene mayor latencia, mientras que el modo en tiempo real ofrece menor latencia, pero consume más energía. Los desarrolladores también pueden configurar la clase de servicio de tráfico para priorizar la transmisión de paquetes, con opciones de mejor esfuerzo, video o voz interactivos y clase de servicio en segundo plano. El marco ofrece informes de rendimiento a pedido que incluyen métricas sobre la intensidad de la señal, el rendimiento y la latencia, que los desarrolladores pueden usar para ajustar el rendimiento de su app en función de pruebas del mundo real y factores ambientales.
- 22:26 - Lineamientos
Los fabricantes de hardware que desarrollan dispositivos compatibles con Wi-Fi Aware pueden consultar las pautas de diseño de accesorios de Apple en el sitio web para desarrolladores para optimizar la interoperabilidad, la seguridad y el rendimiento. La guía, junto con la documentación de la estructura y la app de muestra, proporcionan recursos esenciales para crear experiencias de usuario de alta calidad.