Server-Sent Events en Swift: transmisión de datos en tiempo real sin WebSocket

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

Introducción: por qué SSE es su nuevo mejor amigo



Imagine: está sentado en una acogedora cafetería, tomando un café, mientras su aplicación iOS recibe en segundo plano los últimos tipos de cambio, notificaciones de nuevos mensajes o datos de sensores de dispositivos IoT. Y todo esto, sin pings constantes al servidor, sin agotar la batería y sin protocolos complejos como WebSocket. Conozca: Server-Sent Events (SSE) en Swift — una tecnología que hace que la transmisión de datos sea tan simple que se preguntará por qué no la usó antes.



En este artículo, analizaremos cómo implementar Server-Sent Events en Swift para iOS, macOS, watchOS y tvOS. Descubrirá por qué SSE suele ser más conveniente que WebSocket, cómo escribir su propio cliente SSE desde cero y qué obstáculos esperan a los principiantes. ¡Allá vamos!



¿Qué son los Server-Sent Events y para qué sirven?



Server-Sent Events es un estándar W3C que permite al servidor enviar datos al cliente a través de una única conexión HTTP. A diferencia de WebSocket, SSE funciona solo en una dirección (servidor → cliente), pero eso es precisamente lo que lo hace ideal para tareas donde no se necesita comunicación bidireccional.



¿Cuándo elegir SSE y no WebSocket?

  • Notificaciones y alertas — el servidor envía eventos, el cliente solo lee.
  • Datos en flujo — cotizaciones de acciones, métricas del servidor, seguimiento GPS.
  • Fuentes de noticias — actualizaciones tipo Twitter.
  • Progreso de ejecución — carga de archivos, procesamiento de video.


La principal ventaja de SSE sobre WebSocket es la simplicidad. No necesita un protocolo separado, basta con HTTP normal. Esto significa que cualquier servidor en Python, Node.js o Go podrá enviar eventos a su aplicación Swift sin bibliotecas adicionales.



Cómo funciona SSE: analizando el protocolo



El servidor envía una respuesta HTTP normal con el encabezado Content-Type: text/event-stream. Los datos se formatean así:



event: messagedata: {"text": "¡Hola, mundo!"}id: 42

event: updatedata: {"count": 10}retry: 3000


Campos clave:

  • event — tipo de evento (opcional).
  • data — cuerpo del evento (puede ser multilínea).
  • id — identificador para restablecer la conexión.
  • retry — tiempo en ms antes de reconectar en caso de error.


Cada evento se separa con dos caracteres de nueva línea

. Sencillo, ¿verdad?



Creando un cliente SSE en Swift: de lo simple a lo complejo



En la biblioteca estándar de Foundation no hay una clase preparada para SSE, pero escribir la suya propia es cuestión de 15 minutos. Usamos URLSession con un delegado que procesa datos en flujo.



Paso 1: Clase básica EventSource



import Foundation

final class EventSource: NSObject { private var url: URL private var session: URLSession? private var task: URLSessionDataTask? private var currentData = Data() private var lastEventId: String? var onEvent: ((String, String) -> Void)? // event, data var onError: ((Error) -> Void)? var onOpen: (() -> Void)? init(url: URL) { self.url = url super.init() } func connect() { var request = URLRequest(url: url) request.setValue("text/event-stream", forHTTPHeaderField: "Accept") if let lastId = lastEventId { request.setValue(lastId, forHTTPHeaderField: "Last-Event-ID") } let config = URLSessionConfiguration.default config.timeoutIntervalForRequest = TimeInterval(INT_MAX) config.timeoutIntervalForResource = TimeInterval(INT_MAX) session = URLSession(configuration: config, delegate: self, delegateQueue: nil) task = session?.dataTask(with: request) task?.resume() } \

Blogs

Book Recommendations