将 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 与 WKHTTPCookieStoreNSHTTPCookieStorage 同步。

我尝试通过实现观察者方法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的主要内容,如果未能解决你的问题,请参考以下文章

Swift 4 WKWebView cookie 获取和删除同步问题

iOS WKWebView学习总结

iOS原生与H5交互WKWebView

wkwebview免登录,配置cookie,免登陆

我可以设置 WKWebView 使用的 cookie 吗?

iOS开发WKWebView Cookie的读取与写入,与UIWebView的Cookie共享