Introduction : pourquoi SSE est votre nouveau meilleur ami
Imaginez : vous êtes assis dans un café confortable, buvant un café, tandis que votre application iOS reçoit en arrière-plan les derniers taux de change, des notifications de nouveaux messages ou des données de capteurs IoT. Et tout cela — sans pings constants au serveur, sans décharge de batterie et sans protocoles complexes comme WebSocket. Découvrez : Server-Sent Events (SSE) en Swift — une technologie qui rend le streaming de données si simple que vous serez surpris de ne pas l'avoir utilisée plus tôt.
Dans cet article, nous allons voir comment implémenter les Server-Sent Events en Swift pour iOS, macOS, watchOS et tvOS. Vous apprendrez pourquoi SSE est souvent plus pratique que WebSocket, comment écrire votre propre client SSE à partir de zéro et quels pièges attendent les débutants. C'est parti !
Que sont les Server-Sent Events et pourquoi en avez-vous besoin ?
Les Server-Sent Events sont une norme W3C qui permet au serveur d'envoyer des données au client via une seule connexion HTTP. Contrairement à WebSocket, SSE fonctionne dans un seul sens (serveur → client), mais c'est précisément ce qui le rend idéal pour les tâches où une communication bidirectionnelle n'est pas nécessaire.
Quand choisir SSE plutôt que WebSocket ?
- Notifications et alertes — le serveur envoie des événements, le client ne fait que lire.
- Données en flux — cotations boursières, métriques serveur, suivi GPS.
- Flux d'actualités — mises à jour de type Twitter.
- Progression d'exécution — téléchargement de fichiers, traitement vidéo.
Le principal avantage de SSE par rapport à WebSocket est la simplicité. Vous n'avez pas besoin d'un protocole séparé, un simple HTTP suffit. Cela signifie que n'importe quel serveur en Python, Node.js ou Go peut envoyer des événements à votre application Swift sans bibliothèques supplémentaires.
Comment fonctionne SSE : décortiquons le protocole
Le serveur envoie une réponse HTTP standard avec l'en-tête Content-Type: text/event-stream. Les données sont formatées comme suit :
event: messagedata: {"text": "Bonjour le monde !"}id: 42
event: updatedata: {"count": 10}retry: 3000Champs clés :
event— type d'événement (optionnel).data— corps de l'événement (peut être multiligne).id— identifiant pour la reprise de connexion.retry— temps en ms avant la reconnexion en cas d'erreur.
Chaque événement est séparé par deux caractères de nouvelle ligne . Simple, non ?
Création d'un client SSE en Swift : du simple au complexe
La bibliothèque standard Foundation ne contient pas de classe prête à l'emploi pour SSE, mais en écrire une soi-même prend 15 minutes. Utilisons URLSession avec un délégué qui traite les données en flux.
Étape 1 : Classe de base EventSource
import Foundation
final class EventSource: NSObject { private var url: URL private var session: URLSession? private var task: URLSessionDataTask? private var currentData = Data() private var lastEventId: String? var onEvent: ((String, String) -> Void)? // event, data var onError: ((Error) -> Void)? var onOpen: (() -> Void)? init(url: URL) { self.url = url super.init() } func connect() { var request = URLRequest(url: url) request.setValue("text/event-stream", forHTTPHeaderField: "Accept") if let lastId = lastEventId { request.setValue(lastId, forHTTPHeaderField: "Last-Event-ID") } let config = URLSessionConfiguration.default config.timeoutIntervalForRequest = TimeInterval(INT_MAX) config.timeoutIntervalForResource = TimeInterval(INT_MAX) session = URLSession(configuration: config, delegate: self, delegateQueue: nil) task = session?.dataTask(with: request) task?.resume() } \