如何通过URLSession请求获取Cookie?iOS模拟器中Cookie为空问题
我来帮你排查这个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
相关产品推荐
相关产品推荐

