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

Swift Alamofire嵌套请求出现Error -999问题求助

解决Alamofire请求链中Error -999及Cookie保留问题

嘿,咱们一步步来解决你遇到的Alamofire问题——Error -999错误、跨请求保留Cookie,还有那个可选的第二个请求的处理:

1. 先搞定Error -999的核心原因

Error -999在Alamofire里基本都是会话对象被提前回收导致的。看你的代码,sessionManager是定义在请求闭包内部的局部变量,当第一个请求的闭包执行完,这个会话管理器可能会被ARC自动释放,后续发起第二个请求时就会直接取消并抛出-999错误。

所以第一步,把sessionManager提升为全局变量或者类的属性,确保它的生命周期覆盖所有请求:

// 比如在你的ViewController里,把sessionManager定义为类属性
class YourViewController: UIViewController {
    // 类级别的会话管理器,保证生命周期足够长
    private let sessionManager: Alamofire.SessionManager = {
        let configuration = URLSessionConfiguration.default
        // 默认开启Cookie自动管理,后续请求会自动携带
        configuration.httpCookieAcceptPolicy = .always
        return Alamofire.SessionManager(configuration: configuration)
    }()
    
    // 登录请求方法
    func sendLoginRequest(params: [String: Any]) {
        sessionManager.request(NSLocalizedString("url_login", comment: ""), method: .post, parameters: params).response { response in
            if response.response?.statusCode == 200 {
                // 登录成功后,根据需求发起可选的第二个请求
                self.sendOptionalSecondRequest()
            } else {
                // 处理登录失败逻辑
            }
        }
    }
}

2. 确保Cookie在会话中自动保留

Alamofire的SessionManager默认会通过URLSessionConfiguration自动管理Cookie,只要你用同一个sessionManager发起所有请求,第一个请求获取的Cookie就会被自动保存,并在后续请求中自动携带。如果需要更精细的控制,可以手动配置Cookie存储:

// 初始化sessionManager时手动配置Cookie存储
private let sessionManager: Alamofire.SessionManager = {
    let configuration = URLSessionConfiguration.default
    // 绑定系统默认的Cookie存储容器
    configuration.httpCookieStorage = HTTPCookieStorage.shared
    configuration.httpCookieAcceptPolicy = .always
    return Alamofire.SessionManager(configuration: configuration)
}()

3. 处理可选的第二个请求

因为第二个请求是可选的,你可以在登录成功后加条件判断是否发起,同时要确保用同一个sessionManager,并处理可能的错误:

func sendOptionalSecondRequest() {
    // 这里根据你的业务逻辑判断是否需要发起请求
    guard needToSendSecondRequest() else { return }
    
    sessionManager.request("你的第二个请求URL", method: .get).response { response in
        switch response.result {
        case .success(let data):
            // 处理第二个请求的成功结果
            print("第二个请求成功,返回数据:\(data ?? Data())")
        case .failure(let error):
            if (error as NSError).code == -999 {
                print("第二个请求被取消,大概率是会话管理器被提前释放了,检查下sessionManager的生命周期")
            } else {
                print("第二个请求失败:\(error.localizedDescription)")
            }
        }
    }
}

// 示例:判断是否需要发起第二个请求的逻辑
func needToSendSecondRequest() -> Bool {
    // 比如根据用户配置、业务状态返回true/false
    return true
}

额外排查小Tips

  • 如果还是出现-999,检查是否在发起第二个请求前,sessionManager被意外置为nil或者销毁了
  • 确认第二个请求的URL、参数没有问题,排除网络切换、用户主动取消等其他导致请求取消的因素

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:24:22