从WKWebview获取HTTP响应头

15

我需要从 WKWebview 的请求中读取响应的HTTP头信息。我需要根据服务器发送的某些自定义头信息执行自定义操作。不可能将此信息添加到响应数据中。

我在文档中和之前的问题中都找不到任何条目。是否有任何方法可以做到这一点?

5个回答

19

看起来你可以从 WKNavigationDelegate 方法 webView:decidePolicyFor:decisionHandler: 中访问响应。

将某个对象设置为 WKWebViewnavigationDelegate,并添加此方法:

- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler {
    NSDictionary *headers = ((NSHTTPURLResponse *)navigationResponse.response).allHeaderFields;

    decisionHandler(WKNavigationResponsePolicyAllow);
}

14

NobodyNada的Swift 3.1、4和5版本答案:

不使用强制转换

func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
    if let response = navigationResponse.response as? HTTPURLResponse {
        let headers = response.allHeaderFields
        //do something with headers
    }
    decisionHandler(.allow)
}

使用强制转换:

func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void) {
    let headers = (navigationResponse.response as! HTTPURLResponse).allHeaderFields
    //do something with headers 
    decisionHandler(.allow)
}

3
Swift 4.2 Answers with response.
func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void)
 {
   let response = navigationResponse.response as? HTTPURLResponse
       decisionHandler(.allow)
}

1

从委托方法中,您可以检索(WKNavigationResponse*)navigationResponse。从navigationResponse对象中,您可以获取响应本身:

- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler {

     NSHTTPURLResponse * response = (NSHTTPURLResponse *)navigationResponse.response;

}

0

Swift 5

    func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse) async -> WKNavigationResponsePolicy {
        let URLResponse = navigationResponse.response as? HTTPURLResponse
        URLResponse?.allHeaderFields.forEach({ key, value in
            print("decidePolicyFor key: ", key)
            print("decidePolicyFor value: ", value)
        })

    
        return .allow
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接