-
Boostez la connectivité des appareils avec Wi-Fi Aware
Découvrez comment créer des connexions réseau peer-to-peer avec Wi-Fi Aware. Nous verrons également comment partager des vidéos en temps réel, transférer des fichiers volumineux et contrôler les accessoires avec une bande passante améliorée et une latence plus faible. Vous apprendrez également à utiliser DeviceDiscoveryUI, AccessorySetupKit et le framework Network pour intégrer Wi-Fi Aware dans votre app.
Chapitres
- 0:00 - Introduction
- 1:01 - Aperçu
- 7:46 - Associer
- 15:05 - Connecter
- 19:01 - Optimiser
- 22:26 - Directives
Ressources
Vidéos connexes
WWDC24
-
Rechercher dans cette vidéo…
-
-
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 - Introduction
Découvrez comment utiliser la fonction Wi-Fi Aware sur iOS et iPadOS pour créer des connexions réseau peer-to-peer à latence faible et débit élevé.
- 1:01 - Aperçu
Wi-Fi Aware est une norme qui permet une communication directe entre appareils sans avoir besoin de routeurs ou de serveurs centraux. Elle fonctionne parallèlement aux connexions Wi-Fi classiques. Grâce à cette technologie, les appareils peuvent se repérer et établir des connexions sécurisées et flexibles pour des usages temporaires, comme le transfert de fichiers, le streaming multimédia, la gestion d’accessoires ou le partage d’écran. Wi-Fi Aware fonctionne sur différentes plateformes et assure une compatibilité totale tout en garantissant des connexions sécurisées avec authentification et chiffrement. Les apps peuvent créer leurs propres services et attribuer des rôles d’éditeur ou d’abonné (ou les deux), ce qui permet aux appareils de se reconnecter automatiquement et instantanément dès qu’ils sont à portée de l’un de l’autre.
- 7:46 - Associer
Les appareils peuvent être jumelés à l’aide du framework DeviceDiscoveryUI ou AccessorySetupKit. DeviceDiscoveryUI est conçu pour le jumelage entre apps. Il prend aussi en charge les appareils Apple et ceux d’autres fabricants. AccessorySetupKit est spécialement conçu pour connecter des apps avec des accessoires. Une fois les appareils jumelés, les deux frameworks permettent aux apps d’accéder à la liste des appareils jumelés, de gérer cette liste, de récupérer leurs propriétés et de détecter les changements d’état du jumelage, ce qui permet à l’app d’adapter son interface et son fonctionnement en temps réel.
- 15:05 - Connecter
Une fois jumelés, les appareils peuvent se connecter les uns aux autres. Un appareil joue le rôle d’éditeur, tandis que l’autre joue le rôle d’abonné. L’éditeur filtre les appareils spécifiques et commence l’écoute, tandis que l’abonné filtre et commence la navigation. Lorsque l’abonné a trouvé l’éditeur, il fournit des points de terminaison à l’app, qui établit ensuite les connexions. L’écouteur reçoit et transmet ces demandes de connexion, ce qui permet l’échange de données.
- 19:01 - Optimiser
Pour optimiser les performances de connexion d’une app, le framework Wi-Fi Aware permet aux développeurs d’ajuster certains paramètres. Le framework propose deux modes de performance principaux : bulk et real-time. Le mode bulk est économe en énergie, mais présente une latence plus élevée, tandis que le mode real-time offre une latence plus faible, mais consomme plus d’énergie. Les développeurs peuvent également configurer différents niveaux de priorité pour la transmission des données, avec des options pour le meilleur effort, la vidéo interactive ou la voix et la classe de service en arrière-plan. Le framework fournit des rapports de performances à la demande qui incluent des statistiques sur la puissance du signal, le débit et la latence. Les développeurs peuvent s’en servir pour optimiser les performances de leur app en fonction de tests réels et de facteurs environnementaux.
- 22:26 - Directives
Les fabricants de matériel qui développent des appareils Wi-Fi Aware peuvent consulter les directives de conception des accessoires Apple sur le site web des développeurs pour obtenir des informations sur l’interopérabilité, la sécurité et l’optimisation des performances. Ce guide, ainsi que la documentation sur le framework et l’exemple d’app, fournissent des ressources essentielles pour créer des expériences utilisateur de haute qualité.