将 WKWebView Cookie 同步到 NSHTTPCookieStorage
Posted
技术标签:
【中文标题】将 WKWebView Cookie 同步到 NSHTTPCookieStorage【英文标题】:Sync WKWebView Cookie to NSHTTPCookieStorage 【发布时间】:2018-01-10 06:15:48 【问题描述】:WKWebView
可以在WKHTTPCookieStorage
中管理自己的cookie,与NSHTTPCookieStorage
独立。如何将 cookie 从 WKHTTPCookieStore
同步到 NSHTTPCookieStorage
。
我的目标是将 cookie 与 WKHTTPCookieStore
和 NSHTTPCookieStorage
同步。
我尝试通过实现观察者方法WKHTTPCookieStoreObserver
来同步cookie。
- (void)cookiesDidChangeInCookieStore:(WKHTTPCookieStore *)cookieStore
[cookieStore getAllCookies:^(NSArray<NSHTTPCookie *> *array)
NSHTTPCookieStorage *cookieStorage = [NSHTTPCookieStorage sharedHTTPCookieStorage];
NSArray *nsHttpCookies = cookieStorage.cookies;
//add new Cookie from wkWebView
[array enumerateObjectsUsingBlock:^(NSHTTPCookie *cookie, NSUInteger idx, BOOL *stop)
if(![nsHttpCookies containsObject:cookie])
[cookieStorage setCookie:cookie];
];
//add old Cookie from wkWebView
[nsHttpCookies enumerateObjectsUsingBlock:^(NSHTTPCookie *cookie, NSUInteger idx, BOOL *stop)
if(![array containsObject:cookie])
[cookieStorage deleteCookie:cookie];
];
];
将cookie从WKWebView
同步到NSHTTPCookieStorage
是正确的方法吗?
【问题讨论】:
嘿,您是否尝试使用 WKNavigationDelegate 代替?也许您可以使用 WKNavigationResponse 并从 urlResponse 中提取标头字段。在标头字段中,您应该有一个Cookie
标头作为字符串。然后,您可以将其分解并比较缺少的内容。这只是一个想法
不幸的是,至少在 ios 13 中,观察者方法根本没有被调用... (***.com/q/58397343/2778898)。所以我决定在发起新请求的时候手动实现同步。
【参考方案1】:
正如 Ben 在评论中回答的那样,您需要从响应标头中提取 cookie 并在 HTTPCookieStorage
中手动设置它们。
斯威夫特 4:
func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Swift.Void)
guard
let response = navigationResponse.response as? HTTPURLResponse,
let url = navigationResponse.response.url
else
decisionHandler(.cancel)
return
if let headerFields = response.allHeaderFields as? [String: String]
let cookies = HTTPCookie.cookies(withResponseHeaderFields: headerFields, for: url)
cookies.forEach (cookie) in
HTTPCookieStorage.shared.setCookie(cookie)
decisionHandler(.allow)
目标-C:
NSHTTPURLResponse * resp = (NSHTTPURLResponse*)[navigationResponse response];
NSDictionary *diction = [resp allHeaderFields];
NSArray * cookies = [NSHTTPCookie cookiesWithResponseHeaderFields:diction forURL:[resp URL]];
for (NSHTTPCookie *cookie in cookies)
[[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
return decisionHandler(YES);
【讨论】:
似乎 cookie 不再出现在标题中。您还有其他建议吗?以上是关于将 WKWebView Cookie 同步到 NSHTTPCookieStorage的主要内容,如果未能解决你的问题,请参考以下文章