Bibliothèque Apollo iOS pour travailler avec GraphQL en Swift
Apollo iOS est une bibliothèque puissante et flexible pour travailler avec GraphQL dans l'écosystème Apple. Elle offre aux développeurs iOS et macOS un outil pratique pour exécuter des requêtes, des mutations et des abonnements aux serveurs GraphQL. Contrairement à l'API REST, GraphQL permet au client de demander uniquement les données nécessaires, ce qui réduit le volume de trafic et accélère le fonctionnement des applications. Apollo iOS prend entièrement en charge Swift, y compris les fonctionnalités modernes du langage telles que async/await, Combine et SwiftUI.
Fonctionnalités principales d'Apollo iOS
- Génération de code : Création automatique de modèles de données typés basés sur le schéma GraphQL.
- Mise en cache : Prise en charge intégrée d'un cache normalisé pour optimiser les requêtes répétées.
- Prise en charge de Swift Concurrency : Intégration complète avec async/await pour les opérations asynchrones.
- Abonnements via WebSocket : Implémentation des mises à jour en temps réel avec les subscriptions GraphQL.
- Combine et SwiftUI : Possibilité d'utilisation avec les frameworks réactifs d'Apple.
- Multiplateforme : Fonctionne sur iOS, macOS, tvOS et watchOS.
Installation de la bibliothèque
Pour installer Apollo iOS, utilisez Swift Package Manager. Ajoutez le paquet dans Xcode via le menu File → Add Packages et indiquez l'URL :
https://github.com/apollographql/apollo-ios.gitVersion : dernière stable (au moment de la rédaction — 1.15.0).
Configuration d'Apollo Client
La première étape consiste à créer une instance d'ApolloClient avec l'URL de votre serveur GraphQL. Exemple de configuration de base :
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) }()}Exécution des requêtes (Queries)
Apollo iOS génère du code basé sur le schéma GraphQL. Commencez par définir une requête dans un fichier .graphql :
query GetUser($id: ID!) { user(id: $id) { id name email posts { title } }}Après la génération du code, exécutez la requête :
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}Mutations (Mutation)
Pour modifier des données, utilisez les mutations. Exemple de création d'un nouveau post :
mutation CreatePost($title: String!, $content: String!) { createPost(input: { title: $title, content: $content }) { id title createdAt }}Exécution de la mutation en 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}Travail avec les abonnements (Subscriptions)
Pour les mises à jour en temps réel, utilisez les abonnements. Exemple d'abonnement aux nouveaux messages :
subscription OnNewMessage { newMessage { id text sender { name } }}Implémentation en Swift avec Combine :
import Combine
var cancellables = Set<AnyCancellable>()
func subscribeToMessages() { let subscription = OnNewMessageSubscription() NetworkService.shared.apollo.subscribe(subscription: subscription) .sink { completion in print("Subscription