Introduction : Pourquoi WebSocket est important pour le développeur Swift
Les applications mobiles et de bureau modernes nécessitent de plus en plus un échange instantané de données. Qu'il s'agisse d'un chat, d'un terminal boursier, d'un jeu en ligne ou d'un système de notifications push, les utilisateurs attendent une réaction en temps réel. Le protocole WebSocket est devenu la norme pour ces tâches, et dans l'écosystème Swift (iOS/macOS), son support est implémenté nativement via URLSessionWebSocketTask.
Dans cet article, nous allons détailler le cycle complet de travail avec WebSocket en Swift : de la configuration de la connexion à la création d'une application temps réel complète. Vous apprendrez comment éviter les erreurs typiques, organiser la reconnexion et intégrer WebSocket dans l'architecture MVVM.
Fondamentaux de WebSocket en Swift : URLSessionWebSocketTask
Depuis iOS 13 et macOS 10.15, Apple fournit une classe intégrée URLSessionWebSocketTask dans Foundation. Cela évite d'avoir à ajouter des bibliothèques tierces (par exemple, Starscream) pour les scénarios de base.
Création d'une connexion WebSocket
Pour établir une connexion, il faut créer une session URLSession et définir la configuration :
import Foundation
class WebSocketManager { private var webSocketTask: URLSessionWebSocketTask? private let session: URLSession init() { let config = URLSessionConfiguration.default config.timeoutIntervalForRequest = 30 config.waitsForConnectivity = true session = URLSession(configuration: config, delegate: self, delegateQueue: OperationQueue()) } func connect() { guard let url = URL(string: "wss://echo.websocket.org") else { return } webSocketTask = session.webSocketTask(with: url) webSocketTask?.resume() receiveMessage() }}Notez l'utilisation de waitsForConnectivity — cela permet de rétablir automatiquement la connexion lorsque le réseau réapparaît.
Envoi et réception de messages
WebSocket prend en charge deux types de messages : texte (String) et binaires (Data). Voici un exemple d'envoi :
func sendMessage(_ text: String) { let message = URLSessionWebSocketTask.Message.string(text) webSocketTask?.send(message) { error in if let error = error { print("Erreur d'envoi : \\(error.localizedDescription)") } }}
func sendData(_ data: Data) { let message = URLSessionWebSocketTask.Message.data(data) webSocketTask?.send(message) { error in // gestion de l'erreur }}Pour recevoir des messages, on utilise un appel récursif à receive :
private func receiveMessage() { webSocketTask?.receive { [weak self] result in switch result { case .success(let message): switch message { case .string(let text): print("Texte reçu : \\(text)") case .data(let data): print("Données reçues : \\(data.count) octets") @unknown default: break } // Continuer à écouter self?.receiveMessage() case .failure(let error): print("Erreur de réception : \\(error)") } }}Important : l'appel à receive ne traite qu'un seul message. Pour une réception continue des données, il faut l'appeler à nouveau à l'intérieur de la fermeture de succès.
Architecture d'une application temps réel en Swift
Pour une utilisation industrielle de WebSocket, il est nécessaire de concevoir une architecture. Il est recommandé d'utiliser une couche de service avec un protocole et un délégué, afin de séparer la logique réseau de l'interface utilisateur.
Protocole du service WebSocket
protocol WebSocketServiceProtocol: AnyObject { var isConnected: Bool { get } func connect() func disconnect() f