iOS切换至后台时重复发送GET请求引发401错误的技术问询
解决Alamofire 9 OAuth1 GET请求重复发送导致401的问题
一、阻止URLSession自动重试GET请求
iOS的URLSession会自动重试幂等请求(如GET),当App切换后台后网络连接中断再恢复时,可能直接复用原始请求(未经过Alamofire的Adapt流程),导致nonce重复。可以通过以下配置阻止自动重试:
- 自定义URLSessionConfiguration,禁用缓存并添加禁止存储的头:
let configuration = URLSessionConfiguration.default // 忽略所有缓存,避免URLSession复用缓存的请求 configuration.requestCachePolicy = .reloadIgnoringLocalAndRemoteCacheData // 添加Cache-Control头,明确禁止服务器和客户端缓存请求 configuration.httpAdditionalHeaders = [ "Cache-Control": "no-store, no-cache", "Pragma": "no-cache" ] // 缩短请求超时时间,减少底层重试的触发概率 configuration.timeoutIntervalForRequest = 10 configuration.timeoutIntervalForResource = 30
- 使用该配置创建Alamofire Session:
let session = Session(configuration: configuration, interceptor: yourOAuthInterceptor)
- 后台切换时主动取消未完成请求(可选):
在App的生命周期回调中(如SceneDelegate的sceneDidEnterBackground),取消当前Session的所有未完成任务,回到前台时重新发起请求:
func sceneDidEnterBackground(_ scene: UIScene) { session.cancelAllRequests() }
注:此方法需要你管理请求的状态,以便在前台恢复时重新发起。
二、让401错误进入重试拦截器重新生成nonce
如果无法完全阻止底层重试,确保401错误能触发Alamofire的重试逻辑,重新生成nonce和签名:
- 自定义包含401状态码的RetryPolicy:
// 创建重试策略,指定需要重试的状态码(包含401) let retryPolicy = RetryPolicy( statusCodes: [401, 500, 502, 503], // 按需添加其他需要重试的状态码 retryInterval: 1.0, maxRetryCount: 2 )
- 结合OAuth Adaptor创建全局拦截器:
class OAuthAdaptor: RequestAdapter { func adapt(_ urlRequest: URLRequest, for session: Session, completion: @escaping (Result<URLRequest, Error>) -> Void) { var adaptedRequest = urlRequest // 在这里执行OAuth1签名逻辑,生成全新的nonce、timestamp等参数 // 例如:添加Authorization头,包含新的nonce adaptedRequest.setValue(yourOAuthSignature, forHTTPHeaderField: "Authorization") completion(.success(adaptedRequest)) } } let oauthAdaptor = OAuthAdaptor() let interceptor = Interceptor(adapt: oauthAdaptor, retry: retryPolicy) let session = Session(interceptor: interceptor)
- 确保请求未绕过全局拦截器:
所有需要OAuth1签名的请求都使用上述Session发起,不要单独创建无拦截器的Session或Request。
三、额外验证点
- 检查服务器端的nonce有效期:如果nonce有效期过长,可能增加重复概率,建议设置较短的有效期(如5分钟)。
- 确认Alamofire版本:确保使用的是Alamofire 9的最新版本,避免已知的拦截器或Session配置bug。
内容的提问来源于stack exchange,提问作者Or Rapaport
相关产品推荐
相关产品推荐

