Starscream — Biblioteca WebSocket para Swift (iOS/macOS)
Starscream é uma biblioteca leve, mas poderosa, para trabalhar com o protocolo WebSocket nas plataformas Apple. Escrita totalmente em Swift, não possui dependências externas e suporta iOS, macOS, tvOS e watchOS. Se você precisa organizar comunicação bidirecional em tempo real entre um aplicativo móvel e um servidor (chat, notificações, jogos online) — Starscream será uma excelente escolha.
Principais recursos
- Suporte completo ao padrão RFC 6455 (WebSocket Protocol).
- Funciona através de conexão segura
wss://e conexão normalws://. - Reconexão automática em caso de queda de conexão.
- Suporte a frames: texto, dados binários (Data), ping/pong.
- Integração simples via CocoaPods, Swift Package Manager ou Carthage.
- Compatibilidade com Combine (iOS 13+) e Swift Concurrency (async/await).
Instalação via Swift Package Manager (recomendado)
Adicione o pacote no Xcode: File → Add Packages e cole a URL do repositório:
https://github.com/daltoniam/Starscream.gitSelecione a versão (a última estável) e adicione ao seu target.
Exemplo básico de conexão
Vamos criar um cliente WebSocket simples que se conecta ao servidor e exibe as mensagens recebidas.
import Starscream
class WebSocketManager { var socket: WebSocket? func connect() { var request = URLRequest(url: URL(string: "wss://echo.websocket.org")!) request.timeoutInterval = 5 socket = WebSocket(request: request) socket?.delegate = self socket?.connect() }}
extension WebSocketManager: WebSocketDelegate { func didReceive(event: WebSocketEvent, client: WebSocket) { switch event { case .connected(let headers): print("Conectado! Headers: \\(headers)") case .disconnected(let reason, let code): print("Desconectado: \\(reason) (código: \\(code))") case .text(let string): print("Texto recebido: \\(string)") case .binary(let data): print("Dados binários recebidos: \\(data.count) bytes") case .ping(let data): print("Ping: \\(data?.hexString ?? "sem dados")") case .pong(let data): print("Pong: \\(data?.hexString ?? "sem dados")") case .viabilityChanged(let isViable): print("Conexão ativa: \\(isViable)") case .reconnectSuggested(let shouldReconnect): print("Reconexão sugerida: \\(shouldReconnect)") case .cancelled: print("Conexão cancelada") case .error(let error): print("Erro: \\(error?.localizedDescription ?? "erro desconhecido")") } }}Envio de dados
Starscream permite enviar tanto strings de texto quanto dados binários. Exemplo de envio de JSON:
func sendMessage(text: String) { let message: [String: Any] = [ "type": "chat", "content": text, "timestamp": Int(Date().timeIntervalSince1970) ] if let jsonData = try? JSONSerialization.data(withJSONObject: message, options: []), let jsonString = String(data: jsonData, encoding: .utf8) { socket?.write(string: jsonString) }}
// Envio de arquivo binário (exemplo: imagem)func sendImage(data: Data) { socket?.write(data: data)}Trabalhando com Combine (iOS 13+)
Para programação reativa, o Starscream fornece um Publisher:
import Combine
class CombineViewModel: ObservableObject { @Published var lastMessage: String = "" private var socket: WebSocket? private var cancellables = Set<AnyCancellable>() func setup() { var req
```