Starscream – WebSocket-Bibliothek für Swift (iOS/macOS)
Starscream ist eine leichte, aber leistungsstarke Bibliothek für die Arbeit mit dem WebSocket-Protokoll auf Apple-Plattformen. Sie ist vollständig in Swift geschrieben, hat keine externen Abhängigkeiten und unterstützt iOS, macOS, tvOS und watchOS. Wenn Sie eine bidirektionale Echtzeit-Kommunikation zwischen einer mobilen App und einem Server (Chat, Benachrichtigungen, Online-Spiele) benötigen, ist Starscream eine ausgezeichnete Wahl.
Hauptfunktionen
- Vollständige Unterstützung des Standards RFC 6455 (WebSocket-Protokoll).
- Funktioniert über gesicherte Verbindungen
wss://und normalews://. - Automatische Wiederverbindung bei Verbindungsabbruch.
- Unterstützung von Frames: Text, Binärdaten (Data), Ping/Pong.
- Einfache Integration über CocoaPods, Swift Package Manager oder Carthage.
- Kompatibilität mit Combine (iOS 13+) und Swift Concurrency (async/await).
Installation über Swift Package Manager (empfohlen)
Fügen Sie das Paket in Xcode hinzu: File → Add Packages und fügen Sie die Repository-URL ein:
https://github.com/daltoniam/Starscream.gitWählen Sie die Version (die neueste stabile) und fügen Sie sie zu Ihrem Target hinzu.
Basisbeispiel für die Verbindung
Erstellen wir einen einfachen WebSocket-Client, der eine Verbindung zum Server herstellt und empfangene Nachrichten ausgibt.
import Starscream
class WebSocketManager { var socket: WebSocket? func connect() { var request = URLRequest(url: URL(string: "wss://echo.websocket.org")!) request.timeoutInterval = 5 socket = WebSocket(request: request) socket?.delegate = self socket?.connect() }}
extension WebSocketManager: WebSocketDelegate { func didReceive(event: WebSocketEvent, client: WebSocket) { switch event { case .connected(let headers): print("Verbunden! Header: \\(headers)") case .disconnected(let reason, let code): print("Getrennt: \\(reason) (Code: \\(code))") case .text(let string): print("Text erhalten: \\(string)") case .binary(let data): print("Binärdaten erhalten: \\(data.count) Bytes") case .ping(let data): print("Ping: \\(data?.hexString ?? "keine Daten")") case .pong(let data): print("Pong: \\(data?.hexString ?? "keine Daten")") case .viabilityChanged(let isViable): print("Verbindung aktiv: \\(isViable)") case .reconnectSuggested(let shouldReconnect): print("Wiederverbindung empfohlen: \\(shouldReconnect)") case .cancelled: print("Verbindung abgebrochen") case .error(let error): print("Fehler: \\(error?.localizedDescription ?? "unbekannter Fehler")") } }}Daten senden
Starscream ermöglicht das Senden von Textzeichenfolgen sowie Binärdaten. Beispiel für das Senden von JSON:
func sendMessage(text: String) { let message: [String: Any] = [ "type": "chat", "content": text, "timestamp": Int(Date().timeIntervalSince1970) ] if let jsonData = try? JSONSerialization.data(withJSONObject: message, options: []), let jsonString = String(data: jsonData, encoding: .utf8) { socket?.write(string: jsonString) }}
// Senden einer Binärdatei (z. B. eines Bildes)func sendImage(data: Data) { socket?.write(data: data)}Arbeiten mit Combine (iOS 13+)
Für reaktive Programmierung stellt Starscream einen Publisher bereit:
import Combine
class CombineViewModel: ObservableObject { @Published var lastMessage: String = "" private var socket: WebSocket? private var cancellables = Set<AnyCancellable>() func setup() { var req