Lição: 150: Interagindo com WebSockets
WebSockets fornecem um canal de comunicação full-duplex através de uma única conexão TCP, permitindo a transferência de dados em tempo real entre clientes e servidores. Nesta aula, vamos explorar como criar um cliente WebSocket em Swift usando a classe URLSessionWebSocketTask
, introduzida no iOS 13.
Configurando uma Conexão WebSocket
Para começar a usar WebSockets em Swift, você precisa criar uma tarefa WebSocket utilizando URLSession
. Abaixo está um exemplo de como estabelecer uma conexão com um servidor WebSocket:
import Foundation
class WebSocketClient {
private var webSocketTask: URLSessionWebSocketTask?
private let url: URL
init(url: URL) {
self.url = url
}
func connect() {
let urlSession = URLSession(configuration: .default)
webSocketTask = urlSession.webSocketTask(with: url)
webSocketTask?.resume()
receiveMessage()
}
func disconnect() {
webSocketTask?.cancel(with: .goingAway, reason: nil)
}
private func receiveMessage() {
webSocketTask?.receive { result in
switch result {
case .success(let message):
self.handleMessage(message)
self.receiveMessage() // Escuta a próxima mensagem
case .failure(let error):
print("Erro ao receber a mensagem: \(error)")
}
}
}
private func handleMessage(_ message: URLSessionWebSocketTask.Message) {
switch message {
case .data(let data):
print("Dados recebidos: \(data)")
case .string(let text):
print("Texto recebido: \(text)")
}
}
func sendMessage(_ text: String) {
let message = URLSessionWebSocketTask.Message.string(text)
webSocketTask?.send(message) { error in
if let error = error {
print("Erro ao enviar mensagem: \(error)")
}
}
}
}
Explicação do Código
- Declaração da Classe: Definimos uma classe
WebSocketClient
que gerencia a conexão WebSocket. - Inicialização: O inicializador da classe recebe uma URL que aponta para o servidor WebSocket.
- Conexão: A função
connect()
cria uma sessão com umURLSession
e estabelece uma conexão WebSocket. - Recebendo Mensagens: As mensagens são recebidas através do método
receiveMessage()
, que lida com mensagens recebidas e escuta mais recursivamente. - Tratando Mensagens: O método
handleMessage(_:)
processa as mensagens recebidas com base em seu tipo (dados ou texto). - Enviando Mensagens: O método
sendMessage(_:)
envia uma mensagem de texto para o servidor WebSocket.
Usando o Cliente WebSocket
Aqui está como você pode usar a classe WebSocketClient
em seu aplicativo:
import Foundation
let webSocketURL = URL(string: "wss://exemplo.com/websocket")!
let webSocketClient = WebSocketClient(url: webSocketURL)
// Conecta ao servidor WebSocket
webSocketClient.connect()
// Envia uma mensagem
webSocketClient.sendMessage("Olá, WebSocket!")
// Desconecta após algum tempo (para fins de demonstração)
DispatchQueue.main.asyncAfter(deadline: .now() + 10) {
webSocketClient.disconnect()
print("Desconectado do servidor WebSocket.")
}
Considerações Importantes
- Tratamento de Erros: Sempre implemente o tratamento de erros ao lidar com operações de rede para gerenciar problemas de forma apropriada.
- Segurança em Threads: Certifique-se de que atualizações da interface do usuário baseadas em mensagens WebSocket ocorram na thread principal.
- Mecanismo de Manutenção: Considere implementar um mecanismo de manutenção para manter a conexão quando o servidor espera mensagens periódicas.
- Usando com SwiftUI: Se você estiver usando SwiftUI, gerencie o ciclo de vida do WebSocket com o estado do modelo de visão e métodos do ciclo de vida.
Conclusão
Nesta aula, aprendemos como criar um cliente WebSocket simples em Swift utilizando URLSessionWebSocketTask
. Ao estabelecer uma conexão, enviar e receber mensagens, você pode integrar funcionalidades de comunicação em tempo real em seus aplicativos de forma eficaz. Experimente essa base e considere implementar recursos mais avançados, como lidar com estados de conexão e diferentes tipos de mensagens.