Einführung in WebSocket mit Swift: Von der Theorie zur Praxis
Moderne mobile und Desktop-Anwendungen erfordern zunehmend eine sofortige Datenübertragung. Ob Chat, Börsenterminal, Online-Spiel oder Überwachungssystem – Benutzer erwarten, dass Informationen in Echtzeit aktualisiert werden, ohne dass der Bildschirm ständig neu geladen werden muss. Genau hier kommt das Protokoll WebSocket ins Spiel.
Im Gegensatz zu einer klassischen HTTP-Anfrage, die nach dem Prinzip „Anfrage-Antwort" funktioniert, stellt WebSocket eine permanente bidirektionale Verbindung zwischen Client und Server her. Das bedeutet, dass der Server jederzeit Daten an den Client senden kann, ohne dass eine vorherige Anfrage erforderlich ist. Im Apple-Ökosystem stehen für die Arbeit mit WebSocket sowohl native Lösungen (URLSessionWebSocketTask) als auch beliebte Drittanbieter-Bibliotheken wie Starscream zur Verfügung.
In diesem Artikel werden wir untersuchen, wie Sie WebSocket in Ihre Swift-Anwendung für iOS und macOS integrieren, funktionierende Codebeispiele schreiben und Best Practices betrachten.
1. Native WebSocket-Implementierung mit URLSession
Ab iOS 13 und macOS 10.15 bietet Apple integrierte WebSocket-Unterstützung über die Klasse URLSessionWebSocketTask. Dies ist die einfachste und empfohlene Methode, die keine Installation von Drittanbieter-Abhängigkeiten erfordert.
Verbindung erstellen und konfigurieren
Zunächst muss eine Instanz von URLSession erstellt und eine Konfiguration festgelegt werden. Dann erstellen wir eine URL mit dem Protokoll ws:// (oder wss:// für eine gesicherte Verbindung) und erstellen eine WebSocket-Aufgabe.
import Foundation
class WebSocketManager: NSObject { private var webSocketTask: URLSessionWebSocketTask? private let session: URLSession override init() { let config = URLSessionConfiguration.default 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() receiveMessage() } func disconnect() { webSocketTask?.cancel(with: .normalClosure, reason: nil) }}Senden und Empfangen von Nachrichten
WebSocket unterstützt das Senden sowohl von Text- (URLSessionWebSocketTask.Message.string) als auch von Binärdaten (.data). Zum Empfangen von Nachrichten muss die Methode receive rekursiv aufgerufen werden, da sie jeweils nur eine Nachricht verarbeitet.
extension WebSocketManager { func sendMessage(_ text: String) { let message = URLSessionWebSocketTask.Message.string(text) webSocketTask?.send(message) { error in if let error = error { print("Sendefehler: \\(error.localizedDescription)") } } } 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: print("Unbekannter Nachrichtentyp") } // Rekursiv weiterhören self?.receiveMessage() case .failure(let error): print("Empfangsfehler: \\(error.localizedDescription)") } } }}Beachten Sie den rekursiven Aufruf von receiveMessage() innerhalb des Erfolgs-Closures – dies stellt sicher, dass Ihre Anwendung kontinuierlich neue Daten empfängt.