如何在iOS中结合后台会话配置正确使用Apollo GraphQL?
正确结合后台会话配置使用Apollo GraphQL(适配Apollo iOS 0.8)
你已经走在正确的方向上了!结合你给出的代码片段,我来帮你补全并梳理如何针对你的技术栈(Apollo iOS 0.8、Xcode 9.3、Swift 4.1、iOS 11)正确配置Apollo客户端,完美适配后台会话需求:
完整的客户端初始化代码
先把你未完成的代码补全,同时加入实用的最佳实践:
import Apollo // 建议将Apollo客户端封装为单例,确保全局复用 class ApolloClientManager { static let shared = ApolloClientManager() let client: ApolloClient private init() { // 初始化会话配置,可根据后台需求自定义 let sessionConfig = URLSessionConfiguration.default sessionConfig.timeoutIntervalForRequest = 30 // 设置请求超时时间 sessionConfig.requestCachePolicy = .reloadIgnoringLocalCacheData // 根据需求调整缓存策略 // 添加认证请求头(从keychain获取token) if let accessToken = keychain.accessToken { sessionConfig.httpAdditionalHeaders = [ "Authorization": "Bearer \(accessToken)", "Content-Type": "application/json" // 通常GraphQL请求需要这个头 ] } // 初始化GraphQL端点URL guard let graphqlEndpoint = URL(string: "https://sample-server-url/graphql") else { fatalError("Invalid GraphQL endpoint URL") } // 创建网络传输层,传入自定义会话配置 let networkTransport = HTTPNetworkTransport(url: graphqlEndpoint, configuration: sessionConfig) // (可选)配置本地缓存,0.8版本默认使用内存缓存 let normalizedCache = InMemoryNormalizedCache() let apolloStore = ApolloStore(cache: normalizedCache) // 初始化Apollo客户端 self.client = ApolloClient(networkTransport: networkTransport, store: apolloStore) } // 当token更新/过期刷新后,调用此方法更新请求头 func updateAuthorizationToken(_ newToken: String?) { guard let transport = client.networkTransport as? HTTPNetworkTransport else { return } if let token = newToken { transport.httpAdditionalHeaders = [ "Authorization": "Bearer \(token)", "Content-Type": "application/json" ] } else { // 移除认证头(比如用户登出时) transport.httpAdditionalHeaders?.removeValue(forKey: "Authorization") } } } // 使用示例 let apollo = ApolloClientManager.shared.client
关键配置说明
- 会话配置自定义:你可以基于
URLSessionConfiguration.default调整超时时间、缓存策略、代理设置等,完全匹配后台的会话要求。比如如果后台要求更长的超时时间,直接修改timeoutIntervalForRequest即可。 - 认证头动态管理:通过单例类的
updateAuthorizationToken方法,你可以在token刷新或用户登出/登录时,实时更新Apollo客户端的请求头,无需重新创建客户端实例。 - 单例化客户端:全局复用同一个Apollo客户端实例是最佳实践,这样能保证查询缓存、会话状态的一致性,避免重复创建资源。
- 本地缓存配置:0.8版本默认提供内存缓存,如果你需要持久化缓存(比如离线时访问历史数据),可以替换
InMemoryNormalizedCache为PersistenceNormalizedCache(需要额外配置存储路径)。
常见场景处理
如果你的后台有token过期自动刷新机制,建议在Apollo的请求拦截器(0.8版本可以通过自定义HTTPNetworkTransport的requestModifier)中处理:
// 在初始化networkTransport时添加请求修改器 let networkTransport = HTTPNetworkTransport(url: graphqlEndpoint, configuration: sessionConfig) { request in // 这里可以在发送请求前检查token是否过期,若过期则先刷新token再继续 // 注意:0.8版本的requestModifier是同步的,若需要异步刷新token,可能需要自定义网络传输层 }
内容的提问来源于stack exchange,提问作者Max Desiatov
相关产品推荐
相关产品推荐

