WebSocket em Swift: tempo real para iOS e macOS

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
```html

Introdução ao WebSocket em Swift: da teoria à prática avançada

No desenvolvimento mobile moderno, a interação em tempo real (real-time) tornou-se não apenas um diferencial, mas uma necessidade. Os usuários esperam que chats, feeds de notícias, cotações e notificações sejam atualizados instantaneamente, sem a necessidade de gestos extras como pull-to-refresh. WebSocket é o protocolo que permite estabelecer uma conexão bidirecional permanente entre o cliente (seu aplicativo em Swift) e o servidor.

Neste artigo, iremos além do simples "Hello, World!" e abordaremos técnicas avançadas de trabalho com WebSocket em Swift para as plataformas iOS e macOS. Você aprenderá como configurar uma conexão confiável, lidar com cenários complexos (perda de conexão, reconexão, modo de fundo) e construir uma arquitetura que suporte a carga de um aplicativo de bolsa de valores real ou de um chat com milhares de usuários.

Abordaremos tanto o nativo URLSessionWebSocketTask (iOS 13+) quanto a biblioteca popular Starscream para versões anteriores. O código será totalmente funcional e pronto para integração.



1. Configuração Avançada de um Cliente WebSocket em Swift

Começaremos pela base. Em vez de uma conexão trivial, criaremos um gerenciador que controlará o ciclo de vida da conexão, tratará erros e suportará reconnect (reconexão automática).



1.1. Gerenciador com Reconexão Automática (Reconnect)

Implementaremos a classe WebSocketManager, que utiliza URLSessionWebSocketTask. A característica principal é o atraso exponencial entre as tentativas de reconexão, para não sobrecarregar o servidor.



import Foundation

final class WebSocketManager: NSObject { private var webSocketTask: URLSessionWebSocketTask? private var session: URLSession? private var isConnected = false private var reconnectAttempt = 0 private let maxReconnectDelay: TimeInterval = 30 // Atraso máximo de 30 seg private let baseDelay: TimeInterval = 2 // Atraso base de 2 seg var onMessageReceived: ((String) -> Void)? var onConnectionStateChanged: ((Bool) -> Void)? func connect(url: URL) { session = URLSession(configuration: .default, delegate: self, delegateQueue: OperationQueue()) let request = URLRequest(url: url, timeoutInterval: 10) webSocketTask = session?.webSocketTask(with: request) webSocketTask?.resume() receiveMessage() } private func reconnect() { guard let url = webSocketTask?.originalRequest?.url else { return } let delay = min(baseDelay * pow(2.0, Double(reconnectAttempt)), maxReconnectDelay) print("Reconectando em \\(delay) segundos... (Tentativa \\(reconnectAttempt + 1))") DispatchQueue.global().asyncAfter(deadline: .now() + delay) { [weak self] in self?.connect(url: url) self?.reconnectAttempt += 1 } } private func receiveMessage() { webSocketTask?.receive { [weak self] result in switch result { case .success(let message): switch message { case .string(let text): self?.onMessageReceived?(text) case .data(let data): if let text = String(data: data, encoding: .utf8) { self?.onMessageReceived?(text) } @unknown default: break } self?.reconnectAttempt = 0 // Redefine o contador ao receber com sucesso self?.receiveMessage() // Continua ouvindo case .failure(let error): print("Erro ao receber: \\(error.localizedDescription)") self?.disconnect() self?.reconnect() } } } func send(text: String) { ```

Blogs

Book Recommendations