Starscream — Bibliothèque WebSocket pour Swift (iOS/macOS)
Starscream est une bibliothèque légère mais puissante pour travailler avec le protocole WebSocket sur les plateformes Apple. Entièrement écrite en Swift, elle n'a aucune dépendance externe et prend en charge iOS, macOS, tvOS et watchOS. Si vous avez besoin d'organiser une communication bidirectionnelle en temps réel entre une application mobile et un serveur (chat, notifications, jeux en ligne) — Starscream est un excellent choix.
Fonctionnalités principales
- Prise en charge complète de la norme RFC 6455 (Protocole WebSocket).
- Fonctionne via une connexion sécurisée
wss://et une connexion standardws://. - Reconnexion automatique en cas de rupture de connexion.
- Prise en charge des trames : texte, données binaires (Data), ping/pong.
- Intégration simple via CocoaPods, Swift Package Manager ou Carthage.
- Compatibilité avec Combine (iOS 13+) et Swift Concurrency (async/await).
Installation via Swift Package Manager (recommandé)
Ajoutez le paquet dans Xcode : File → Add Packages et collez l'URL du dépôt :
https://github.com/daltoniam/Starscream.gitChoisissez la version (la dernière stable) et ajoutez-la à votre cible.
Exemple de base de connexion
Créons un client WebSocket simple qui se connecte au serveur et affiche les messages reçus.
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("Connecté ! En-têtes : \\(headers)") case .disconnected(let reason, let code): print("Déconnecté : \\(reason) (code : \\(code))") case .text(let string): print("Texte reçu : \\(string)") case .binary(let data): print("Données binaires reçues : \\(data.count) octets") case .ping(let data): print("Ping : \\(data?.hexString ?? "aucune donnée")") case .pong(let data): print("Pong : \\(data?.hexString ?? "aucune donnée")") case .viabilityChanged(let isViable): print("Connexion active : \\(isViable)") case .reconnectSuggested(let shouldReconnect): print("Reconnexion suggérée : \\(shouldReconnect)") case .cancelled: print("Connexion annulée") case .error(let error): print("Erreur : \\(error?.localizedDescription ?? "erreur inconnue")") } }}Envoi de données
Starscream permet d'envoyer à la fois des chaînes de texte et des données binaires. Exemple d'envoi 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) }}
// Envoi d'un fichier binaire (par exemple, une image)func sendImage(data: Data) { socket?.write(data: data)}Utilisation avec Combine (iOS 13+)
Pour la programmation réactive, Starscream fournit un Publisher :
import Combine
class CombineViewModel: ObservableObject { @Published var lastMessage: String = "" private var socket: WebSocket? private var cancellables = Set<AnyCancellable>() func setup() { var req