首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将WKWebView Cookie同步到NSHTTPCookieStorage

将WKWebView Cookie同步到NSHTTPCookieStorage
EN

Stack Overflow用户
提问于 2018-01-10 14:15:49
回答 1查看 5.8K关注 0票数 3

WKWebView可以在WKHTTPCookieStorage中管理自己的cookie,独立于NSHTTPCookieStorage。如何将cookie从WKHTTPCookieStore同步到NSHTTPCookieStorage

我的目标是将cookies与WKHTTPCookieStoreNSHTTPCookieStorage同步。

我尝试将cookie与实现观察者方法WKHTTPCookieStoreObserver同步。

代码语言:javascript
复制
- (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的正确方法

EN

回答 1

Stack Overflow用户

发布于 2018-04-13 16:22:52

正如Ben在评论中回答的那样,您需要从响应头中提取cookie,并在HTTPCookieStorage中手动设置它们。

Swift 4:

代码语言:javascript
复制
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)
}

Objective-C:

代码语言:javascript
复制
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);
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48181336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档