Server-Sent Events in Swift: Echtes Daten-Streaming ohne WebSocket

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum SSE Ihr neuer bester Freund ist



Stellen Sie sich vor: Sie sitzen in einem gemütlichen Café, trinken Kaffee, während Ihre iOS-App im Hintergrund aktuelle Wechselkurse, Benachrichtigungen über neue Nachrichten oder Daten von IoT-Sensoren empfängt. Und das alles – ohne ständige Pings an den Server, ohne Batterieentladung und ohne komplexe Protokolle wie WebSocket. Lernen Sie kennen: Server-Sent Events (SSE) in Swift – eine Technologie, die Daten-Streaming so einfach macht, dass Sie sich wundern werden, warum Sie sie nicht schon früher genutzt haben.



In diesem Artikel werden wir durchgehen, wie Sie Server-Sent Events in Swift für iOS, macOS, watchOS und tvOS implementieren. Sie erfahren, warum SSE oft praktischer als WebSocket ist, wie Sie Ihren eigenen SSE-Client von Grund auf schreiben und welche Fallstricke auf Anfänger warten. Los geht's!



Was sind Server-Sent Events und wozu braucht man sie?



Server-Sent Events sind ein W3C-Standard, der es dem Server ermöglicht, Daten über eine einzige HTTP-Verbindung an den Client zu senden. Im Gegensatz zu WebSocket arbeitet SSE nur in eine Richtung (Server → Client), aber genau das macht es ideal für Aufgaben, bei denen keine bidirektionale Kommunikation erforderlich ist.



Wann SSE statt WebSocket wählen?

  • Benachrichtigungen und Alarme – der Server sendet Ereignisse, der Client liest nur.
  • Streaming-Daten – Aktienkurse, Servermetriken, GPS-Tracking.
  • Newsfeeds – Twitter-ähnliche Updates.
  • Fortschrittsanzeigen – Datei-Uploads, Videoverarbeitung.


Der Hauptvorteil von SSE gegenüber WebSocket ist die Einfachheit. Sie benötigen kein separates Protokoll, normales HTTP reicht aus. Das bedeutet, dass jeder Server mit Python, Node.js oder Go Ereignisse an Ihre Swift-App senden kann, ohne zusätzliche Bibliotheken.



Wie SSE funktioniert: Das Protokoll im Detail



Der Server sendet eine normale HTTP-Antwort mit dem Header Content-Type: text/event-stream. Die Daten werden wie folgt formatiert:



event: messagedata: {"text": "Hallo, Welt!"}id: 42

event: updatedata: {"count": 10}retry: 3000


Wichtige Felder:

  • event – Ereignistyp (optional).
  • data – Ereignisinhalt (kann mehrzeilig sein).
  • id – Kennung zur Wiederherstellung der Verbindung.
  • retry – Zeit in ms vor der Wiederverbindung bei Fehlern.


Jedes Ereignis wird durch zwei Zeilenumbrüche

getrennt. Einfach, oder?



SSE-Client in Swift erstellen: Vom Einfachen zum Komplexen



In der Standardbibliothek Foundation gibt es keine vorgefertigte Klasse für SSE, aber eine eigene zu schreiben, ist eine Sache von 15 Minuten. Wir verwenden URLSession mit einem Delegaten, der die Streaming-Daten verarbeitet.



Schritt 1: Basisklasse 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() } \

Blogs

Buchempfehlungen