Biblioteca Apollo iOS para trabalhar com GraphQL em Swift
Apollo iOS é uma biblioteca poderosa e flexível para trabalhar com GraphQL no ecossistema Apple. Ela fornece aos desenvolvedores iOS e macOS uma ferramenta conveniente para executar consultas, mutações e assinaturas em servidores GraphQL. Ao contrário da API REST, o GraphQL permite que o cliente solicite apenas os dados necessários, reduzindo o volume de tráfego e acelerando o funcionamento dos aplicativos. O Apollo iOS suporta totalmente o Swift, incluindo recursos modernos da linguagem, como async/await, Combine e SwiftUI.
Principais recursos do Apollo iOS
- Geração de código: Criação automática de modelos de dados type-safe com base no esquema GraphQL.
- Cache: Suporte integrado para cache normalizado para otimizar consultas repetidas.
- Suporte a Swift Concurrency: Integração completa com async/await para operações assíncronas.
- Assinaturas via WebSocket: Implementação de atualizações em tempo real com GraphQL subscriptions.
- Combine e SwiftUI: Possibilidade de uso com frameworks reativos da Apple.
- Multiplataforma: Funciona em iOS, macOS, tvOS e watchOS.
Instalação da biblioteca
Para instalar o Apollo iOS, use o Swift Package Manager. Adicione o pacote no Xcode através do menu File → Add Packages e informe a URL:
https://github.com/apollographql/apollo-ios.gitVersão: última estável (no momento da escrita — 1.15.0).
Configuração do Apollo Client
O primeiro passo é criar uma instância do ApolloClient com a URL do seu servidor GraphQL. Exemplo de configuração básica:
import Apollo
class NetworkService { static let shared = NetworkService() private(set) lazy var apollo: ApolloClient = { let url = URL(string: "https://api.example.com/graphql")! return ApolloClient(url: url) }()}Executando consultas (Queries)
O Apollo iOS gera código com base no esquema GraphQL. Primeiro, defina a consulta em um arquivo .graphql:
query GetUser($id: ID!) { user(id: $id) { id name email posts { title } }}Após a geração do código, execute a consulta:
import Apollo
func fetchUser(id: String) async throws -> GetUserQuery.Data.User? { let query = GetUserQuery(id: id) let result = try await NetworkService.shared.apollo.fetch(query: query) return result.data?.user}Mutações (Mutation)
Para alterar dados, use mutações. Exemplo de criação de um novo post:
mutation CreatePost($title: String!, $content: String!) { createPost(input: { title: $title, content: $content }) { id title createdAt }}Executando a mutação em Swift:
func createPost(title: String, content: String) async throws -> CreatePostMutation.Data.CreatePost? { let mutation = CreatePostMutation(title: title, content: content) let result = try await NetworkService.shared.apollo.perform(mutation: mutation) return result.data?.createPost}Trabalhando com assinaturas (Subscriptions)
Para atualizações em tempo real, use assinaturas. Exemplo de assinatura de novas mensagens:
subscription OnNewMessage { newMessage { id text sender { name } }}Implementação em Swift usando Combine:
import Combine
var cancellables = Set<AnyCancellable>()
func subscribeToMessages() { let subscription = OnNewMessageSubscription() NetworkService.shared.apollo.subscribe(subscription: subscription) .sink { completion in print("Subscription