-
Turbine a conectividade do dispositivo com o Wi-Fi Aware
Saiba como criar conexões de rede ponto a ponto com o Wi-Fi Aware. Também abordaremos como compartilhar vídeos em tempo real, transferir arquivos grandes e controlar acessórios com largura de banda aprimorada e latência menor. E você saberá como usar os frameworks DeviceDiscoveryUI, AccessorySetupKit e Network para usar o Wi-Fi Aware em seu app.
Capítulos
- 0:00 - Introdução
- 1:01 - Visão geral
- 7:46 - Emparelhar
- 15:05 - Conectar
- 19:01 - Otimizar
- 22:26 - Diretrizes
Recursos
Vídeos relacionados
WWDC24
-
Buscar neste vídeo...
-
-
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 - Introdução
Saiba como usar o Wi-Fi Aware no iOS e no iPadOS para criar conexões de rede ponto a ponto com baixa latência e alta taxa de transferência.
- 1:01 - Visão geral
O Wi-Fi Aware é um padrão que permite a comunicação direta entre dispositivos, sem a necessidade de roteadores ou servidores centrais. Ele funciona em paralelo com conexões Wi‑Fi tradicionais, permitindo que dispositivos se descubram e se conectem de forma segura e dinâmica para criar experiências locais e efêmeras, como compartilhamento de arquivos, streaming de mídia, controle de acessórios e compartilhamento de tela. O Wi‑Fi Aware é multiplataforma e interoperável, com conexões totalmente autenticadas e criptografadas. Os apps podem definir serviços, especificar funções como editor, assinante ou ambos e emparelhar dispositivos para reconexões rápidas e contínuas sempre que estiverem próximos.
- 7:46 - Emparelhar
Os dispositivos podem ser emparelhados usando o framework DeviceDiscoveryUI ou AccessorySetupKit. O DeviceDiscoveryUI é indicado para emparelhamento entre apps e é compatível com dispositivos Apple e de terceiros. Já o AccessorySetupKit é adequado para emparelhamento entre o app e os acessórios. Após o emparelhamento, ambos os frameworks permitem que os apps acessem e gerenciem a lista de dispositivos emparelhados, recuperem suas propriedades e monitorem alterações no status de emparelhamento, possibilitando a atualização da interface e do estado do app, conforme necessário.
- 15:05 - Conectar
Quando estão emparelhados, os dispositivos podem se conectar uns aos outros. Um dispositivo tem a função de editor e o outro, de assinante. O editor filtra dispositivos específicos e começa a escutar, enquanto o assinante filtra e começa a navegar. Depois que o assinante encontra o editor, ele fornece pontos de extremidade para o app, que então estabelece conexões. O ouvinte recebe e encaminha essas solicitações de conexão, possibilitando a troca de dados.
- 19:01 - Otimizar
Para otimizar o desempenho de conexão de um app, o framework Wi‑Fi Aware permite que os desenvolvedores ajustem determinados parâmetros. Ele oferece dois modos principais de desempenho: em massa e em tempo real. O modo em massa é mais eficiente em termos de energia, mas apresenta maior latência, enquanto o modo em tempo real oferece menor latência com maior consumo de energia. Os desenvolvedores também podem definir a classe de serviço de tráfego para priorizar a transmissão de pacotes, com opções como melhor esforço, vídeo ou voz interativos e serviço em segundo plano. O framework oferece relatórios de desempenho sob demanda, com métricas de intensidade de sinal, taxa de transferência e latência, que os desenvolvedores podem usar para ajustar o desempenho do app com base em testes no mundo real e fatores ambientais.
- 22:26 - Diretrizes
Fabricantes de hardware que desenvolvem dispositivos compatíveis com Wi‑Fi Aware podem consultar as Diretrizes de Design para Acessórios da Apple, disponíveis no site para desenvolvedores, para garantir interoperabilidade, segurança e otimização de desempenho. Esse guia, junto com a documentação do framework e o app de exemplo, oferece recursos essenciais para a criação de experiências de uso de alta qualidade.