Einleitung: Warum WebSocket für Swift-Entwickler wichtig ist
In der modernen mobilen und Desktop-Entwicklung sind Benutzer an sofortige Aktualisierungen gewöhnt: Der Newsfeed aktualisiert sich ohne Neuladen, der Status des Gesprächspartners im Chat ändert sich in Echtzeit, und Börsenkurse kommen mit Millisekunden-Verzögerung. Traditionelles HTTP mit seinem Request-Response-Modell ist für solche Aufgaben ineffizient – es erzeugt unnötige Last auf dem Server und der Gerätebatterie.
Hier kommt das Protokoll WebSocket zur Hilfe. Es stellt eine permanente bidirektionale Verbindung zwischen dem Client (iOS/macOS-App in Swift) und dem Server her. In diesem Artikel werden wir zwei Hauptmethoden für die Arbeit mit WebSocket in Swift behandeln: natives URLSessionWebSocketTask (iOS 13+ / macOS 10.15+) und die beliebte Drittanbieter-Bibliothek Starscream. Sie erfahren, wie Sie einen Echtzeit-Chat erstellen, automatische Wiederverbindung einrichten und Fehler behandeln.
Grundlagen von WebSocket in Swift: URLSessionWebSocketTask
Ab iOS 13 und macOS Catalina bietet Apple integrierte WebSocket-Unterstützung über die Klasse URLSessionWebSocketTask. Dies ist eine einfache und sichere Methode, die keine Installation zusätzlicher Abhängigkeiten erfordert.
Erstellen und Konfigurieren einer Verbindung
Zunächst erstellen wir eine Instanz von URLSession und legen die Konfiguration fest. Beachten Sie: Für die Arbeit mit WebSocket muss das Protokoll wss:// (gesicherte Verbindung) oder ws:// (ungesichert, nur für die Entwicklung) verwendet werden.
import Foundation
class WebSocketManager: NSObject { private var webSocketTask: URLSessionWebSocketTask? private let session: URLSession override init() { let config = URLSessionConfiguration.default config.timeoutIntervalForRequest = 30 config.waitsForConnectivity = true self.session = URLSession(configuration: config, delegate: nil, delegateQueue: OperationQueue()) super.init() } func connect() { guard let url = URL(string: "wss://echo.websocket.org") else { return } webSocketTask = session.webSocketTask(with: url) webSocketTask?.resume() print("WebSocket Verbindung hergestellt") receiveMessage() }}Senden und Empfangen von Nachrichten
WebSocket unterstützt zwei Arten von Nachrichten: Zeichenketten (String) und binäre Daten (Data). Betrachten wir das Senden:
func sendMessage(_ text: String) { let message = URLSessionWebSocketTask.Message.string(text) webSocketTask?.send(message) { error in if let error = error { print("Fehler beim Senden: \\(error.localizedDescription)") } else { print("Nachricht gesendet: \\(text)") } }}Zum Empfangen von Nachrichten muss ein rekursiver Aufruf der Methode receive implementiert werden:
private func receiveMessage() { webSocketTask?.receive { [weak self] result in switch result { case .success(let message): switch message { case .string(let text): print("Textnachricht empfangen: \\(text)") case .data(let data): print("Binärdaten empfangen: \\(data.count) Bytes") @unknown default: break } // Weiter auf folgende Nachrichten hören self?.receiveMessage() case .failure(let error): print("Fehler beim Empfangen: \\(error.localizedDescription)") // Hier kann eine Wiederverbindung implementiert werden } }}Verbindung schließen und Fehlerbehandlung
Das korrekte Beenden der WebSocket-Verbindung ist ein wichtiger Teil einer Production-App:
func disconnect() { let closeCode = URLSessionWebSocketTask.CloseCode.normalClosure webSocketTask?.cancel(with: closeCode, reason: nil) p