WebSocket en Swift: aplicaciones en tiempo real avanzadas 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

WebSocket en Swift: creación de aplicaciones en tiempo real de nivel avanzado

\n

En el desarrollo móvil moderno, la interacción en tiempo real se ha convertido no solo en una característica, sino en una necesidad. Cotizaciones financieras, juegos en línea, mensajería, edición colaborativa de documentos: todo esto requiere una transferencia instantánea de datos entre el cliente y el servidor. En el ecosistema de Apple, los frameworks Swift y Foundation proporcionan herramientas potentes para trabajar con el protocolo WebSocket. En este artículo, exploraremos técnicas avanzadas: desde el nativo URLSessionWebSocketTask hasta el manejo personalizado de errores, la multitarea y la optimización del rendimiento.

\n\n

1. Implementación nativa de WebSocket a través de URLSessionWebSocketTask (iOS 13+)

\n

A partir de iOS 13, Apple ofrece soporte integrado para WebSocket a través de URLSessionWebSocketTask. Esta es la forma preferida, ya que no requiere dependencias de terceros y está profundamente integrada con el sistema de gestión de conexiones.

\n\n

1.1. Creación y configuración de la sesión

\n

Para empezar, crearemos un gestor de WebSocket con soporte para reconexión y agrupación de hilos:

\n
import Foundation\n\nclass WebSocketManager: NSObject {\n    private var webSocketTask: URLSessionWebSocketTask?\n    private var session: URLSession!\n    private let queue = DispatchQueue(label: "com.websocket.queue", qos: .userInitiated)\n    private var isConnected = false\n    \n    override init() {\n        super.init()\n        let config = URLSessionConfiguration.default\n        config.waitsForConnectivity = true\n        config.timeoutIntervalForResource = 300\n        session = URLSession(configuration: config, delegate: self, delegateQueue: nil)\n    }\n    \n    func connect(url: URL) {\n        webSocketTask = session.webSocketTask(with: url)\n        webSocketTask?.resume()\n        receiveMessage()\n    }\n    \n    func disconnect() {\n        webSocketTask?.cancel(with: .normalClosure, reason: nil)\n        isConnected = false\n    }\n}
\n\n

1.2. Manejo avanzado de mensajes con tipificación

\n

Crearemos un enum para los tipos de mensajes e implementaremos el análisis:

\n
enum WebSocketMessage {\n    case text(String)\n    case data(Data)\n    case ping\n    case pong\n    case error(Error)\n}\n\nextension WebSocketManager: URLSessionWebSocketDelegate {\n    func urlSession(_ session: URLSession, webSocketTask: URLSessionWebSocketTask, didOpenWithProtocol protocol: String?) {\n        isConnected = true\n        print("WebSocket connected")\n    }\n    \n    func urlSession(_ session: URLSession, webSocketTask: URLSessionWebSocketTask, didCloseWith closeCode: URLSessionWebSocketTask.CloseCode, reason: Data?) {\n        isConnected = false\n        print("WebSocket closed: \\(closeCode)")\n        // Reconexión automática después de 5 segundos\n        DispatchQueue.global().asyncAfter(deadline: .now() + 5) { [weak self] in\n            self?.reconnect()\n        }\n    }\n    \n    private func receiveMessage() {\n        webSocketTask?.receive { [weak self] result in\n            switch result {\n            case .success(let message):\n                self?.handleMessage(message)\n                self?.receiveMessage() // Recepción cíclica\n            case .failure(let error):\n                self?.handleError(error)\n            }\n        }\n    }\n    \n    private func handleMessage(_ message: URLSessionWebSocketTask.Message) {\n        switch message {\n        case .string(let text):\n            processText(text)\n        case .data(let data):\n            processData(data)\n        @unknown default:\n            break\n        }\n    }\n}
\n\n

2. Trabajo avanzado con multitarea y rendimiento

\n

Las aplicaciones en tiempo real requieren un alto rendimiento. Veamos las optimizaciones clave.

\n\n

2.1. Cola de mensajes segura para hilos

\n
class ThreadSafeMessageQueue {\n    private var queue = [WebSocketMessage]()\n                

Blogs

Book Recommendations