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

如何通过URLSession请求获取Cookie?iOS模拟器中Cookie为空问题

解决HTTPCookieStorage.shared.cookies为空的问题

我来帮你排查这个Cookie不存储的问题,从你的代码和场景来看,有几个关键细节需要调整:

1. 不要混淆自定义Session和Shared Session的Cookie存储

你创建了自己的mySession,但在回调里却去读取URLSession.shared的Cookie——这两个Session是独立的,自定义Session的Cookie不会自动同步到Shared Session的存储里。你应该直接访问共享Cookie容器或者自定义Session配置里的存储:

let task = mySession.dataTask(with: request) { (data, response, error) in
    if let httpResponse = response as? HTTPURLResponse {
        let fields = httpResponse.allHeaderFields as! [String : String]
        // 直接访问共享Cookie存储
        let cookies1 = HTTPCookieStorage.shared.cookies
        print(cookies1)
    }
}
task.resume()

2. 先确认服务器是否真的返回了Cookie

即使请求成功,服务器可能没有在响应头里设置Set-Cookie字段,这是Cookie存储的前提。先打印响应头确认:

if let httpResponse = response as? HTTPURLResponse {
    let fields = httpResponse.allHeaderFields as! [String : String]
    print("Response Headers: \(fields)") // 检查是否包含Set-Cookie字段
    let cookies1 = HTTPCookieStorage.shared.cookies
    print(cookies1)
}

如果没有Set-Cookie,那问题出在服务器端;如果有,再继续排查客户端逻辑。

3. 显式绑定共享Cookie存储到自定义Session

默认情况下URLSessionConfiguration.default会使用共享存储,但显式指定可以避免潜在的配置问题:

let configuration = URLSessionConfiguration.default
configuration.httpCookieAcceptPolicy = .always
configuration.httpCookieStorage = HTTPCookieStorage.shared // 显式关联共享容器
let mySession = URLSession(configuration: configuration, delegate: self, delegateQueue: nil)

4. 手动解析并存储Cookie(兜底方案)

如果自动存储失效,你可以通过代理方法手动解析响应头里的Cookie并添加到存储:
先实现URLSessionDataDelegate的代理方法:

func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive response: URLResponse, completionHandler: @escaping (URLSession.ResponseDisposition) -> Void) {
    guard let httpResponse = response as? HTTPURLResponse,
          let requestUrl = dataTask.currentRequest?.url else {
        completionHandler(.allow)
        return
    }
    
    // 从响应头解析Cookie
    let cookies = HTTPCookie.cookies(
        withResponseHeaderFields: httpResponse.allHeaderFields as! [String: String],
        for: requestUrl
    )
    // 添加到共享存储
    HTTPCookieStorage.shared.setCookies(cookies, for: requestUrl, mainDocumentURL: nil)
    print("手动添加的Cookie: \(cookies)")
    
    completionHandler(.allow)
}

5. 模拟器私有IP的ATS配置检查

你的服务器地址是私有IP(10.10.224.30),虽然请求能成功,但ATS配置可能间接影响Cookie存储。确保Info.plist里允许访问该IP:

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>10.10.224.30</key>
        <dict>
            <key>NSIncludesSubdomains</key>
            <true/>
            <key>NSTemporaryExceptionMinimumTLSVersion</key>
            <string>TLSv1.2</string>
        </dict>
    </dict>
</dict>

按这个顺序排查,应该能解决Cookie为空的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:38:34