WebSocket in Swift: Echtzeit-Anwendungen für iOS und macOS erstellen

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 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                

Blogs

Buchempfehlungen