SwiftHTML & CSSSolidityDesenvolvimento de JogosSolana/Rust
27.11.2024

Aula 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

  1. Declaração da Classe: Definimos uma classe WebSocketClient que gerencia a conexão WebSocket.
  2. Inicialização: O inicializador da classe recebe uma URL que aponta para o servidor WebSocket.
  3. Conexão: A função connect() cria uma sessão com um URLSession e estabelece uma conexão WebSocket.
  4. Recebendo Mensagens: As mensagens são recebidas através do método receiveMessage(), que lida com mensagens recebidas e escuta mais recursivamente.
  5. Tratando Mensagens: O método handleMessage(_:) processa as mensagens recebidas com base em seu tipo (dados ou texto).
  6. 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.

Video

Did you like this article? Rate it from 1 to 5:

Thank you for voting!