-
Exploitez la concurrence structurée avec le framework Network
Le framework Network est le meilleur moyen d'établir des connexions réseau de bas niveau sur les plates-formes Apple – et dans iOS, iPadOS et macOS 26, il s'intègre parfaitement à votre code de concurrence structurée. Nous verrons comment vous pouvez établir des connexions, envoyer et recevoir des données et des messages structurés, écouter les connexions entrantes et parcourir le réseau à la recherche de services. Nous aborderons également les bonnes pratiques essentielles tout au long du processus.
Chapitres
- 0:00 - Bienvenue
- 0:45 - Établir des connexions
- 7:22 - Envoyer et recevoir
- 14:22 - Accepter les connexions entrantes
- 16:05 - Rechercher d’autres appareils
Ressources
Vidéos connexes
WWDC25
WWDC18
-
Rechercher dans cette vidéo…
-
-
4:04 - Make a connection with TLS
// Make a connection import Network let connection = NetworkConnection(to: .hostPort(host: "www.example.com", port: 1029)) { TLS() } -
4:41 - Make a connection with TLS and IP options
// Make a connection import Network let connection = NetworkConnection(to: .hostPort(host: "www.example.com", port: 1029) { TLS { TCP { IP() .fragmentationEnabled(false) } } } -
5:07 - Make a connection with customized parameters
// Make a connection import Network let connection = NetworkConnection(to: .hostPort(host: "www.example.com", port: 1029), using: .parameters { TLS { TCP { IP() .fragmentationEnabled(false) } } } .constrainedPathsProhibited(true)) -
7:30 - Send and receive on a connection
// Send and receive on a connection import Network public func sendAndReceiveWithTLS() async throws { let connection = NetworkConnection(to: .hostPort(host: "www.example.com", port: 1029)) { TLS() } let outgoingData = Data("Hello, world!".utf8) try await connection.send(outgoingData) let incomingData = try await connection.receive(exactly: 98).content print("Received data: \(incomingData)") } -
8:29 - Send and receive on a connection
// Send and receive on a connection import Network public func sendAndReceiveWithTLS() async throws { let connection = NetworkConnection(to: .hostPort(host: "www.example.com", port: 1029)) { TLS() } let outgoingData = Data("Hello, world!".utf8) try await connection.send(outgoingData) let remaining32 = try await connection.receive(as: UInt32.self).content guard var remaining = Int(exactly: remaining32) else { /* ... throw an error ... */ } while remaining > 0 { let imageChunk = try await connection.receive(atLeast: 1, atMost: remaining).content remaining -= imageChunk.count // Parse the next portion of the image before continuing } } -
11:06 - Tic-Tac-Toe game messages
// TicTacToe game messages import Network enum GameMessage: Int { case selectedCharacter = 0 case move = 1 } struct GameCharacter: Codable { let character: String } struct GameMove: Codable { let row: Int let column: Int } -
11:24 - Send TicTacToe game messages with TLV
// Send TicTacToe game messages with TLV import Network public func sendWithTLV() async throws { let connection = NetworkConnection(to: .hostPort(host: "www.example.com", port: 1029)) { TLV { TLS() } } let characterData = try JSONEncoder().encode(GameCharacter(character: "🐨")) try await connection.send(characterData, type: GameMessage.selectedCharacter.rawValue) } -
11:53 - Receive TicTacToe game messages with TLV
import Network public func receiveWithTLV() async throws { let connection = NetworkConnection(to: .hostPort(host: "www.example.com", port: 1029)) { TLV { TLS() } } let (incomingData, metadata) = try await connection.receive() switch GameMessage(rawValue: metadata.type) { case .selectedCharacter: let character = try JSONDecoder().decode(GameCharacter.self, from: incomingData) print("Character selected: \(character)") case .move: let move = try JSONDecoder().decode(GameMove.self, from: incomingData) print("Move: \(move)") case .none: print("Unknown message") } } -
12:50 - Tic-Tac-Toe game messages with Coder
// TicTacToe game messages with Coder import Network enum GameMessage: Codable { case selectedCharacter(String) case move(row: Int, column: Int) } -
13:13 - Send TicTacToe game messages with Coder
// Send TicTacToe game messages with Coder import Network public func sendWithCoder() async throws { let connection = NetworkConnection(to: .hostPort(host: "www.example.com", port: 1029)) { Coder(GameMessage.self, using: .json) { TLS() } } let selectedCharacter: GameMessage = .selectedCharacter("🐨") try await connection.send(selectedCharacter) } -
13:53 - Receive TicTacToe game messages with Coder
// Receive TicTacToe game messages with Coder import Network public func receiveWithCoder() async throws { let connection = NetworkConnection(to: .hostPort(host: "www.example.com", port: 1029)) { Coder(GameMessage.self, using: .json) { TLS() } } let gameMessage = try await connection.receive().content switch gameMessage { case .selectedCharacter(let character): print("Character selected: \(character)") case .move(let row, let column): print("Move: (\(row), \(column))") } } -
15:16 - Listen for incoming connections with NetworkListener
// Listen for incoming connections with NetworkListener import Network public func listenForIncomingConnections() async throws { try await NetworkListener { Coder(GameMessage.self, using: .json) { TLS() } }.run { connection in for try await (gameMessage, _) in connection.messages { // Handle the GameMessage } } } -
17:39 - Browse for nearby paired Wi-Fi Aware devices
// Browse for nearby paired Wi-Fi Aware devices import Network import WiFiAware public func findNearbyDevice() async throws { let endpoint = try await NetworkBrowser(for: .wifiAware(.connecting(to: .allPairedDevices, from: .ticTacToeService))).run { endpoints in .finish(endpoints.first!) } // Make a connection to the endpoint }
-
-
- 0:00 - Bienvenue
Découvrez les nouveautés du framework Network. Apprenez à créer des connexions, envoyer et recevoir des données, écouter les connexions entrantes et découvrir les points de terminaison sur le réseau.
- 0:45 - Établir des connexions
Le framework Network simplifie la mise en réseau des apps. Il offre des fonctionnalités comme Connect by Name et Happy Eyeballs pour une résolution d’adresses efficace. Il intègre la sécurité TLS et prend en charge des protocoles modernes comme QUIC. Avec le framework Network, vous pouvez créer une pile de protocoles via une API déclarative. Le framework gère automatiquement les transitions d’interface réseau, les proxies et les états de connexion, garantissant des connexions robustes et réactives. Les objets NetworkConnection gèrent le cycle de vie de la connexion, en passant par des états tels que preparing, ready, waiting, failed ou canceled. Vous pouvez, en option, surveiller ces états pour mettre à jour l’interface.
- 7:22 - Envoyer et recevoir
L’envoi et la réception de données dans Network sont des fonctions asynchrones qui établissent une connexion si nécessaire. La fonction send suspend la tâche jusqu’au traitement des données fournies. Lors de la réception de données avec des protocoles en flux comme TLS et TCP, le nombre d’octets doit être spécifié. Des erreurs peuvent survenir lors de l’envoi ou de la réception, avec des explications fournies pour chaque interruption. Si la taille des données est inconnue, vous pouvez utiliser la fonction receive à plusieurs reprises avec des plages d’octets minimales et maximales spécifiées. Pour simplifier la gestion des messages, le framework intègre un encodeur/décodeur Type-Length-Value (TLV) qui garantit que ce qui est envoyé est bien ce qui est reçu. iOS et macOS 26 prennent désormais en charge l’envoi et la réception directes de types Codable.
- 14:22 - Accepter les connexions entrantes
NetworkListener permet à votre app d’accepter des connexions entrantes. Il s’initialise avec une pile de protocoles et, lors de l’appel à run, lance une sous-tâche pour chaque connexion entrante, transmise à un gestionnaire pour un traitement asynchrone des messages.
- 16:05 - Rechercher d’autres appareils
Dans iOS 26, le framework Network introduit NetworkBrowser, qui permet à votre app de découvrir des points de terminaison réseau. NetworkBrowser peut aussi utiliser Wi-Fi Aware, une technologie peer-to-peer ou Bonjour, pour détecter les appareils ou services à proximité. Vous pouvez créer un NetworkBrowser pour rechercher des services spécifiques via des descripteurs, et utiliser un point de terminaison découvert pour initialiser une NetworkConnection. Ces nouvelles API, conçues pour la concurrence structurée de Swift, facilitent et simplifient la création d’apps réseau, supprimant le code répétitif tout en conservant la puissance et la flexibilité du framework Network.