WebSocket em Swift: criando aplicações em 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

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                

Blogs

Book Recommendations