Programação de Rede em Swift: do simples ao complexo
\n\nQuando você abre o Xcode pela primeira vez e vê um projeto vazio, parece que ainda falta muito para chegar à verdadeira magia da comunicação em rede. Mas acredite: programação de rede em Swift não é rocket science, mas sim uma ferramenta tangível que transforma um aplicativo local em parte da internet global. Hoje vamos analisar como fazer seu aplicativo "conversar" com servidores, trocar dados e fazer isso de forma elegante.
\n\nVou mostrar não apenas definições secas, mas cenários reais da vida de um desenvolvedor iOS. Você aprenderá como funciona a comunicação de rede em Swift em baixo nível (sockets) e em alto nível (URLSession). E no final, um bônus: como conectar WebSocket para um chat ao vivo. Vamos lá!
\n\nEntendendo os fundamentos: como as redes funcionam no mundo Swift
\n\nAntes de escrever código, vamos entender os conceitos. A programação de rede em Swift baseia-se nos mesmos princípios de qualquer outra linguagem: arquitetura cliente-servidor, protocolos TCP/UDP, endereços IP e portas. Mas há uma nuance — o ecossistema da Apple oferece seus próprios frameworks que facilitam a vida do desenvolvedor.
\n\nTecnologias-chave para trabalhar com rede em Swift
\n\n- \n
- URLSession — a principal ferramenta para requisições HTTP/HTTPS. Funciona com REST API, download de arquivos, tarefas em segundo plano. \n
- Network.framework — acesso de baixo nível a sockets, TCP/UDP. Surgiu no iOS 12, substituindo o antigo CFNetwork. \n
- WebSocket (URLSessionWebSocketTask) — para comunicação bidirecional em tempo real. \n
- CFStream — uma forma antiga, mas ainda funcional, de trabalhar com fluxos de dados. \n
Pessoalmente, recomendo começar com URLSession — é como dirigir um carro com câmbio automático. E quando quiser algo mais "manual", migre para o Network.framework.
\n\nURLSession: seu melhor amigo na programação de rede em Swift
\n\nVamos começar com a ferramenta mais popular. URLSession Swift é um framework poderoso para enviar e receber dados pela rede. Ele suporta cache, autenticação, downloads em segundo plano e muito mais.
\n\nRequisição GET básica
\n\nImagine que seu aplicativo precisa mostrar uma lista de usuários do servidor. Veja como fazer:
\n\nimport Foundation\n\n// 1. Criamos a URL\nguard let url = URL(string: "https://jsonplaceholder.typicode.com/users") else {\n fatalError("Invalid URL")\n}\n\n// 2. Criamos a tarefa\nlet task = URLSession.shared.dataTask(with: url) { data, response, error in\n // 3. Tratamos erros\n if let error = error {\n print("Erro: \\(error.localizedDescription)")\n return\n }\n \n // 4. Verificamos a resposta do servidor\n guard let httpResponse = response as? HTTPURLResponse,\n (200...299).contains(httpResponse.statusCode) else {\n print("Código de status inválido")\n return\n }\n \n // 5. Trabalhamos com os dados\n if let data = data {\n do {\n let users = try JSONDecoder().decode([User].self, from: data)\n print("Recebidos \\(users.count) usuários")\n } catch {\n print("Erro de parsing: \\(error)")\n }\n }\n}\n\n// 6. Iniciamos a tarefa\ntask.resume()\n\nObserve: task.resume() é obrigatório! Caso contrário, a requisição nunca será executada. Este é um erro comum de iniciantes em programação de rede em Swift.
Requisição POST com corpo
\n\nAgora vamos enviar dados para o servidor:
\n\nfunc createUser(name: String, email: String) {\n guard let url = URL(string: "https://jsonplaceholder.typicode.com/users") else {\n return\n }\n \n var request = URLRequest(url: url)\n request.httpMethod = "POST"\n request.setValue("application/json", forHTTPHeaderField: "Content-Type")\n \n let body