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

iOS切换至后台时重复发送GET请求引发401错误的技术问询

解决Alamofire 9 OAuth1 GET请求重复发送导致401的问题

一、阻止URLSession自动重试GET请求

iOS的URLSession会自动重试幂等请求(如GET),当App切换后台后网络连接中断再恢复时,可能直接复用原始请求(未经过Alamofire的Adapt流程),导致nonce重复。可以通过以下配置阻止自动重试:

  1. 自定义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
  1. 使用该配置创建Alamofire Session:
let session = Session(configuration: configuration, interceptor: yourOAuthInterceptor)
  1. 后台切换时主动取消未完成请求(可选):
    在App的生命周期回调中(如SceneDelegate的sceneDidEnterBackground),取消当前Session的所有未完成任务,回到前台时重新发起请求:
func sceneDidEnterBackground(_ scene: UIScene) {
    session.cancelAllRequests()
}

注:此方法需要你管理请求的状态,以便在前台恢复时重新发起。

二、让401错误进入重试拦截器重新生成nonce

如果无法完全阻止底层重试,确保401错误能触发Alamofire的重试逻辑,重新生成nonce和签名:

  1. 自定义包含401状态码的RetryPolicy:
// 创建重试策略,指定需要重试的状态码(包含401)
let retryPolicy = RetryPolicy(
    statusCodes: [401, 500, 502, 503], // 按需添加其他需要重试的状态码
    retryInterval: 1.0,
    maxRetryCount: 2
)
  1. 结合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)
  1. 确保请求未绕过全局拦截器:
    所有需要OAuth1签名的请求都使用上述Session发起,不要单独创建无拦截器的Session或Request。

三、额外验证点

  • 检查服务器端的nonce有效期:如果nonce有效期过长,可能增加重复概率,建议设置较短的有效期(如5分钟)。
  • 确认Alamofire版本:确保使用的是Alamofire 9的最新版本,避免已知的拦截器或Session配置bug。

内容的提问来源于stack exchange,提问作者Or Rapaport

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 20:05:13