You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 03:57:36