1. 程式人生 > >iOS12 WKWebView獲取cookie 及使用WKWebViewJavascriptBridge

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];

希望能對有需要的小夥伴有所幫助,有寫的不對的地方,歡迎指出修正。