Apollo iOS集成GraphQL请求报错sessionInvalidated求助
解决iOS Apollo GraphQL请求返回"sessionInvalidated"问题
以下是几个针对性的排查和解决方向:
1. 确认Token格式与有效性
- 检查Token是否过期:解析JWT Token的
exp字段确认有效期,过期需重新获取。 - 验证Bearer格式:确保
"Bearer \(auth)"中Bearer和Token之间有且仅有一个空格,格式错误会导致服务器无法识别授权信息。
2. 改用自定义拦截器注入授权头
直接设置URLSessionConfiguration的httpAdditionalHeaders可能被Apollo默认拦截器逻辑覆盖,更可靠的方式是通过自定义拦截器在请求发送前注入授权头:
class AuthorizationInterceptor: ApolloInterceptor { func interceptAsync<Operation: GraphQLOperation>( chain: RequestChain, request: HTTPRequest<Operation>, response: HTTPResponse<Operation>?, completion: @escaping (Result<GraphQLResult<Operation.Data>, Error>) -> Void ) { let userDefaults = UserDefaults(suiteName: SUITE_NAME) if let authToken = userDefaults?.string(forKey: "authToken"), !authToken.isEmpty { request.addHeader(name: "Authorization", value: "Bearer \(authToken)") } chain.proceedAsync(request: request, response: response, completion: completion) } }
修改ApolloClient初始化代码,将自定义拦截器加入请求链:
private(set) lazy var apolloClient: ApolloClient = { guard let endpointURL = URL(string: ENDPOINT) else { fatalError("Invalid GraphQL endpoint URL") } let store = ApolloStore(cache: InMemoryNormalizedCache()) let client = URLSessionClient() let interceptorProvider = DefaultInterceptorProvider(client: client, store: store) let networkTransport = RequestChainNetworkTransport( interceptorProvider: interceptorProvider, endpointURL: endpointURL, interceptors: [AuthorizationInterceptor()] ) return ApolloClient(networkTransport: networkTransport, store: store) }()
3. 抓包验证实际请求头
使用Charles、Proxyman等工具抓包,确认请求中确实携带了正确的Authorization头。如果抓包发现头未被携带,说明代码注入逻辑存在问题;如果头已携带但仍报错,需排查服务器端的会话验证规则(比如Token受众、签名是否匹配等)。
4. 检查URLSession配置冲突
避免直接修改URLSessionConfiguration.default,创建独立配置实例,防止其他业务逻辑修改默认配置导致授权头丢失:
let configuration = URLSessionConfiguration.ephemeral // 或新建default实例 configuration.httpAdditionalHeaders = authPayloads
内容的提问来源于stack exchange,提问作者Preston Howell
相关产品推荐
相关产品推荐

