iOS12 WKWebView获取cookie 及使用WKWebViewJavascriptBridge

最近用WKWebView,使用代理方法获取cookie一直不成功,后面发现是刚刚升级的iOS12的问题,直接上代码

- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler
{
    if (@available(iOS 12.0, *)) {//iOS11也有这种获取方式,但是我使用的时候iOS11系统可以在response里面直接获取到,只有iOS12获取不到
        WKHTTPCookieStore *cookieStore = webView.configuration.websiteDataStore.httpCookieStore;
        [cookieStore getAllCookies:^(NSArray* cookies) {
            [self setCookie:cookies];
        }];
    }else {
        NSHTTPURLResponse *response = (NSHTTPURLResponse *)navigationResponse.response;
        NSArray *cookies =[NSHTTPCookie cookiesWithResponseHeaderFields:[response allHeaderFields] forURL:response.URL];
        [self setCookie:cookies];
    }
    
    decisionHandler(WKNavigationResponsePolicyAllow);
}

-(void)setCookie:(NSArray *)cookies {
    if (cookies.count > 0) {
        for (NSHTTPCookie *cookie in cookies) {
            [[NSHTTPCookieStorage sharedHTTPCookieStorage] setCookie:cookie];
        }
    }
}

swift4写法:

if #available(iOS 11, *) {
        webView.configuration.websiteDataStore.httpCookieStore.getAllCookies({ (cookies) in
            for cookie in cookies {
                //TODO...
            }
        })
    }

这样就可以获取到cookie,而且我在使用AFNetworking的时候,请求头中不设置cookie,后台依然能收到cookie,应该是WKWebView和AFNetworking共享了cookie。

在使用WKWebView进行js交互的时候,用到了WKWebViewJavascriptBridge这个第三方,可以很好地帮助我们处理原生和js交互。但是我在使用了WKWebViewJavascriptBridge之后,发现原生代理方法不能使用了,后来发现只要把WKWebViewJavascriptBridge设置在原生代理之后,并且写下[self.webViewBridge setWebViewDelegate:self];就能正常使用原生代理方法。

self.KWWebView.navigationDelegate = self;
    self.KWWebView.UIDelegate = self;
    
    self.webViewBridge = [WKWebViewJavascriptBridge bridgeForWebView:self.KWWebView];
    [self.webViewBridge setWebViewDelegate:self];

希望能对有需要的小伙伴有所帮助,有写的不对的地方,欢迎指出修正。

猜你喜欢

转载自blog.csdn.net/crypond/article/details/83626400