最近用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];
希望能对有需要的小伙伴有所帮助,有写的不对的地方,欢迎指出修正。