iOS使用IP直连时的Cookie管理
首先需要了解一下NSURLSessionConfiguration基础, 在初始化NSURLSession时, 需要传入一个NSURLSessionConfiguration对象, 我们认为NSURLSessionConfiguration是一个配置项, 在配置了这个对象以后, 通过它来配置的NSURLSession发出的HTTP/HTTPS请求属性.
常见的HTTP配置例如:
- 缓存策略与缓存
requestCachePolicy,URLCache - 请求/响应超时
timeoutIntervalForRequest/timeoutIntervalForResource - 网络访问策略
networkServiceType和allowsCellularAccess - 网络代理配置
connectionProxyDictionary - Cookie管理策略
HTTPShouldSetCookies,HTTPCookieAcceptPolicy以及HTTPCookieStorage - 公共请求头
HTTPAdditionalHeaders - 支持的NSURLProtocol Hook,
protocolClasses
在使用这个NSURLSession发起request并接受response时, 会根据NSURLSessionConfiguration自动管理Cookie:
- 在请求发出去之前,
NSURLSession会检查request.url.host,并和当前的HTTPCookieStorage中的Cookie.domain进行匹配, 如果匹配成功, 那么会给request增加Cookie的header - 在收到
response时,NSURLSession根据response header中的Set-Cookie获取Cookie, 然后检查request.url.host,两者匹配才会将后台种下的Cookie写入CookieManager中.
有以上的基础, 在使用IP直连时:
- 由于我们会在请求时,将
request.URL.host字段由domain替换成ip地址, 因此NSURLSession在请求发送时检查Cookie时, 就不会给我们增加Cookie header, 因为Cookie中的domain字段是域名, 而我们request.URL.host与Cookie.domain不匹配. - 在
NSURLSession收到response时, 会检测Set-Cookie字段, 然后根据Cookie.domain, path...与request.url.host是否匹配来决定是否写入CookieManager中.
因此在处理Cookie时, 建议在处理Cookie时候, 参考HTTPDNS域名解析场景下如何使用Cookie?构造自己的HTTPDNSCookieManager