Biblioteca WebSocket Swift: Starscream para iOS/macOS

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

Starscream — Biblioteca WebSocket para Swift (iOS/macOS)



Starscream es una biblioteca ligera pero potente para trabajar con el protocolo WebSocket en plataformas Apple. Está escrita completamente en Swift, no tiene dependencias externas y es compatible con iOS, macOS, tvOS y watchOS. Si necesitas organizar comunicación bidireccional en tiempo real entre una aplicación móvil y un servidor (chat, notificaciones, juegos en línea), Starscream es una excelente opción.



Características principales

  • Soporte completo del estándar RFC 6455 (WebSocket Protocol).
  • Funciona con conexiones seguras wss:// y conexiones normales ws://.
  • Reconexión automática en caso de interrupción de la conexión.
  • Soporte de tramas: texto, datos binarios (Data), ping/pong.
  • Integración sencilla mediante CocoaPods, Swift Package Manager o Carthage.
  • Compatibilidad con Combine (iOS 13+) y Swift Concurrency (async/await).


Instalación mediante Swift Package Manager (recomendado)

Añade el paquete en Xcode: File → Add Packages e introduce la URL del repositorio:

https://github.com/daltoniam/Starscream.git

Selecciona la versión (la última estable) y añádelo a tu target.



Ejemplo básico de conexión

Vamos a crear un cliente WebSocket simple que se conecta al servidor y muestra los mensajes recibidos.

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("¡Conectado! Cabeceras: \\(headers)") case .disconnected(let reason, let code): print("Desconectado: \\(reason) (código: \\(code))") case .text(let string): print("Texto recibido: \\(string)") case .binary(let data): print("Datos binarios recibidos: \\(data.count) bytes") case .ping(let data): print("Ping: \\(data?.hexString ?? "sin datos")") case .pong(let data): print("Pong: \\(data?.hexString ?? "sin datos")") case .viabilityChanged(let isViable): print("Conexión activa: \\(isViable)") case .reconnectSuggested(let shouldReconnect): print("Se sugiere reconexión: \\(shouldReconnect)") case .cancelled: print("Conexión cancelada") case .error(let error): print("Error: \\(error?.localizedDescription ?? "error desconocido")") } }}


Envío de datos

Starscream permite enviar tanto cadenas de texto como datos binarios. Ejemplo de envío de 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)    }}

// Envío de archivo binario (por ejemplo, una imagen)func sendImage(data: Data) { socket?.write(data: data)}


Trabajar con Combine (iOS 13+)

Para programación reactiva, Starscream proporciona un Publisher:

import Combine

class CombineViewModel: ObservableObject { @Published var lastMessage: String = "" private var socket: WebSocket? private var cancellables = Set<AnyCancellable>() func setup() { var req

Recommendations