Bibliotecas WebSocket para Swift (iOS/macOS): Starscream y URLSessionWebSocketTask
WebSocket es un protocolo que proporciona una conexión bidireccional persistente entre un cliente (aplicación iOS/macOS) y un servidor. A diferencia de HTTP, una vez establecida la conexión, los datos pueden transmitirse en tiempo real sin solicitudes repetidas. Para Swift, existen dos enfoques principales: usar el URLSessionWebSocketTask integrado (disponible desde iOS 13/macOS 10.15) y la biblioteca de terceros Starscream (que admite versiones anteriores y proporciona funcionalidad avanzada).
1. URLSessionWebSocketTask — WebSocket nativo en Swift
A partir de iOS 13 y macOS 10.15, Apple agregó soporte para WebSocket directamente en URLSession. Esto significa que para escenarios básicos no es necesario instalar dependencias adicionales.
Ejemplo de conexión y envío de mensaje
import Foundation
class WebSocketManager: NSObject { private var webSocketTask: URLSessionWebSocketTask? private let session = URLSession(configuration: .default) func connect() { guard let url = URL(string: "wss://echo.websocket.org") else { return } webSocketTask = session.webSocketTask(with: url) webSocketTask?.resume() receiveMessage() } func sendMessage(_ text: String) { let message = URLSessionWebSocketTask.Message.string(text) webSocketTask?.send(message) { error in if let error = error { print("Error al enviar: \\(error.localizedDescription)") } } } private func receiveMessage() { webSocketTask?.receive { [weak self] result in switch result { case .success(let message): switch message { case .string(let text): print("Recibido: \\(text)") case .data(let data): print("Datos binarios recibidos: \\(data.count) bytes") @unknown default: break } self?.receiveMessage() // seguimos escuchando case .failure(let error): print("Error al recibir: \\(error.localizedDescription)") } } } func disconnect() { webSocketTask?.cancel(with: .normalClosure, reason: nil) }}Ventajas de URLSessionWebSocketTask
- Sin dependencias — todo ya está en el sistema.
- Integración nativa con tareas en segundo plano y App Transport Security.
- Soporte de Apple y actualizaciones junto con el sistema operativo.
Desventajas
- Versión mínima iOS 13 / macOS 10.15.
- Sin soporte integrado para reconexión y ping/pong (debe implementarse manualmente).
- Menos flexibilidad en la configuración.
2. Starscream — biblioteca WebSocket potente y flexible para Swift
Starscream es la biblioteca WebSocket de terceros más popular para Swift. Es compatible con iOS 8+, macOS 10.10+, así como watchOS y tvOS. Starscream proporciona un mecanismo de reconexión incorporado, ping/pong automático y soporte para SSL/TLS.
Instalación mediante Swift Package Manager
// En Package.swift o mediante Xcode: File → Add Packages...// URL: https://github.com/daltoniam/Starscream.git// Versión: 4.0.0 o superiorEjemplo de uso de Starscream
import Starscream
class StarscreamManager: WebSocketDelegate { var socket: WebSocket? func setupConnection() { var request = URLRequest(url: URL(string: "wss://echo.websocket.org")!) request.timeoutInterval = 5 socket = WebSocket(request: request) socket?.delegate = self socket?.connect() }\