Apollo iOS: 适用于 Swift 应用的强大 GraphQL 客户端
Apollo iOS 是一款现代、类型安全的库,用于在 Apple 平台(iOS、macOS、tvOS 和 watchOS)上使用 GraphQL API。由 Apollo GraphQL 公司开发,它为开发者提供了执行查询、变更和订阅的便捷工具,能够根据您的 GraphQL 模式自动生成严格类型化的 Swift 代码。
该库非常适合构建需要灵活数据处理、缓存和高性能的现代移动和桌面应用。Apollo iOS 省去了手动解析 JSON 的麻烦,并在编译阶段提供完整的类型安全。
主要功能
- 自动代码生成 — 基于 .graphql 文件和服务器模式,生成类型化的数据模型、查询和变更。
- 规范化缓存 — 内置缓存可在数据变化时自动更新 UI,避免对象重复。
- 支持 WebSocket 订阅 — 为聊天、通知和其他动态数据提供实时更新。
- 与 SwiftUI 和 Combine 集成 — 原生异步 Publisher 和 ObservableObject,支持响应式编程。
- 多线程 — 所有网络请求在后台执行,主线程保持空闲以处理 UI。
- 支持文件上传 — 通过 multipart 请求处理图片和文档的发送。
通过 Swift Package Manager 安装
通过 Xcode 或 Package.swift 将 Apollo iOS 添加到您的项目:
// Package.swiftdependencies: [ .package(url: "https://github.com/apollographql/apollo-ios.git", from: "1.0.0")]示例:配置客户端并执行查询
创建一个客户端实例并执行简单的 GraphQL 查询以获取用户列表:
import Apollo
// 1. 创建客户端let url = URL(string: "https://api.example.com/graphql")!let store = ApolloStore()let client = ApolloClient(url: url, store: store)
// 2. 定义查询(文件 Users.graphql)// query GetUsers { users { id name email } }
// 3. 执行查询client.fetch(query: GetUsersQuery()) { result in switch result { case .success(let graphQLResult): if let users = graphQLResult.data?.users { for user in users { print("\\(user.name) — \\(user.email)") } } case .failure(let error): print("错误: \\(error.localizedDescription)") }}使用变更(修改数据)
创建新用户的变更示例:
// mutation CreateUser($name: String!, $email: String!) {// createUser(name: $name, email: $email) { id name email }// }
let mutation = CreateUserMutation(name: "伊万·彼得罗夫", email: "ivan@example.com")
client.perform(mutation: mutation) { result in switch result { case .success(let graphQLResult): if let newUser = graphQLResult.data?.createUser { print("已创建用户: \\(newUser.id)") } case .failure(let error): print("创建错误: \\(error)") }}订阅(实时更新)
要获取实时数据,请使用订阅。需要 WebSocket 传输:
import ApolloWebSocket
let webSocketTransport = WebSocketTransport( request: URLRequest(url: URL(string: "wss://api.example.com/graphql")!))let store = ApolloStore()let client = ApolloClient(networkTransport: webSocketTransport, store: store)
// subscription OnUserAdded { userAdded { id name } }let subscription =