Introdução: por que o WebSocket é importante para o desenvolvedor Swift
No desenvolvimento moderno para dispositivos móveis e desktop, os usuários estão acostumados a atualizações instantâneas: o feed de notícias é atualizado sem recarregar, o status do interlocutor no chat muda em tempo real, e as cotações da bolsa chegam com atraso de milissegundos. O HTTP tradicional com seu modelo de requisição-resposta é ineficiente para essas tarefas — ele cria carga excessiva no servidor e na bateria do dispositivo.
O protocolo WebSocket vem em socorro. Ele estabelece uma conexão bidirecional permanente entre o cliente (aplicativo iOS/macOS em Swift) e o servidor. Neste artigo, vamos analisar duas formas principais de trabalhar com WebSocket em Swift: o nativo URLSessionWebSocketTask (iOS 13+ / macOS 10.15+) e a popular biblioteca de terceiros Starscream. Você aprenderá como criar um chat em tempo real, configurar a reconexão automática e lidar com erros.
Fundamentos do WebSocket em Swift: URLSessionWebSocketTask
A partir do iOS 13 e macOS Catalina, a Apple forneceu suporte nativo a WebSocket através da classe URLSessionWebSocketTask. Esta é uma forma simples e segura, que não requer a instalação de dependências adicionais.
Criação e configuração da conexão
Para começar, vamos criar uma instância de URLSession e definir a configuração. Observe: para trabalhar com WebSocket, é necessário usar o protocolo wss:// (conexão segura) ou ws:// (não segura, apenas para desenvolvimento).
import Foundation
class WebSocketManager: NSObject { private var webSocketTask: URLSessionWebSocketTask? private let session: URLSession override init() { let config = URLSessionConfiguration.default config.timeoutIntervalForRequest = 30 config.waitsForConnectivity = true self.session = URLSession(configuration: config, delegate: nil, delegateQueue: OperationQueue()) super.init() } func connect() { guard let url = URL(string: "wss://echo.websocket.org") else { return } webSocketTask = session.webSocketTask(with: url) webSocketTask?.resume() print("Conexão WebSocket estabelecida") receiveMessage() }}Envio e recebimento de mensagens
O WebSocket suporta dois tipos de mensagens: string (String) e binárias (Data). Vamos analisar o envio:
func sendMessage(_ text: String) { let message = URLSessionWebSocketTask.Message.string(text) webSocketTask?.send(message) { error in if let error = error { print("Erro ao enviar: \\(error.localizedDescription)") } else { print("Mensagem enviada: \\(text)") } }}Para receber mensagens, é necessário implementar uma chamada recursiva ao método receive:
private func receiveMessage() { webSocketTask?.receive { [weak self] result in switch result { case .success(let message): switch message { case .string(let text): print("Mensagem de texto recebida: \\(text)") case .data(let data): print("Dados binários recebidos: \\(data.count) bytes") @unknown default: break } // Continua ouvindo as próximas mensagens self?.receiveMessage() case .failure(let error): print("Erro ao receber: \\(error.localizedDescription)") // Aqui pode ser implementada a reconexão } }}Fechamento da conexão e tratamento de erros
O encerramento correto do trabalho com WebSocket é uma parte importante de uma aplicação em produção:
func disconnect() { let closeCode = URLSessionWebSocketTask.CloseCode.normalClosure webSocketTask?.cancel(with: closeCode, reason: nil) p