iOS12 WKWebView獲取cookie 及使用WKWebViewJavascriptBridge
阿新 • • 發佈:2018-11-06
最近用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];
希望能對有需要的小夥伴有所幫助,有寫的不對的地方,歡迎指出修正。