Server-Sent Events em Swift: streaming de dados real sem WebSocket

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Introdução: por que SSE é seu novo melhor amigo



Imagine: você está sentado em um café aconchegante, tomando café, enquanto seu aplicativo iOS recebe em segundo plano cotações de moedas atualizadas, notificações de novas mensagens ou dados de sensores de dispositivos IoT. E tudo isso — sem pings constantes ao servidor, sem descarregar a bateria e sem protocolos complexos como WebSocket. Conheça: Server-Sent Events (SSE) em Swift — uma tecnologia que torna o streaming de dados tão simples que você vai se perguntar por que não a usou antes.



Neste artigo, vamos abordar como implementar Server-Sent Events em Swift para iOS, macOS, watchOS e tvOS. Você descobrirá por que SSE é frequentemente mais conveniente que WebSocket, como escrever seu próprio cliente SSE do zero e quais armadilhas esperam os iniciantes. Vamos lá!



O que são Server-Sent Events e para que servem?



Server-Sent Events é um padrão W3C que permite ao servidor enviar dados ao cliente por uma única conexão HTTP. Ao contrário do WebSocket, o SSE funciona apenas em uma direção (servidor → cliente), mas é exatamente isso que o torna ideal para tarefas onde a comunicação bidirecional não é necessária.



Quando escolher SSE em vez de WebSocket?

  • Notificações e alertas — o servidor envia eventos, o cliente apenas lê.
  • Dados em fluxo — cotações de ações, métricas do servidor, rastreamento GPS.
  • Feeds de notícias — atualizações estilo Twitter.
  • Progresso de execução — upload de arquivos, processamento de vídeo.


A principal vantagem do SSE sobre o WebSocket é a simplicidade. Você não precisa de um protocolo separado, apenas HTTP comum. Isso significa que qualquer servidor em Python, Node.js ou Go pode enviar eventos para seu aplicativo Swift sem bibliotecas extras.



Como o SSE funciona: analisando o protocolo



O servidor envia uma resposta HTTP comum com o cabeçalho Content-Type: text/event-stream. Os dados são formatados assim:



event: messagedata: {"text": "Olá, mundo!"}id: 42

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


Campos principais:

  • event — tipo do evento (opcional).
  • data — corpo do evento (pode ser multilinha).
  • id — identificador para reconexão.
  • retry — tempo em ms antes de reconectar em caso de erro.


Cada evento é separado por dois caracteres de nova linha

. Simples, não é?



Criando um cliente SSE em Swift: do simples ao complexo



Na biblioteca padrão Foundation não há uma classe pronta para SSE, mas escrever a sua própria leva 15 minutos. Usamos URLSession com um delegate que processa dados em fluxo.



Passo 1: Classe 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