it-roy-ru.com

Получить заголовки ответа HTTP из WKWebview

Мне нужно прочитать HTTP-заголовки ответа из запроса WKWebview. Мне нужно выполнить настройки на основе определенных пользовательских заголовков, отправленных сервером. Невозможно добавить эту информацию в данные ответа.

Я не смог найти ни записи в документации, ни в предыдущих вопросах здесь. Есть ли способ сделать это?

8
badger_cl

Похоже, вы можете получить доступ к ответу из метода WKNavigationDelegatewebView:decidePolicyFor:decisionHandler: .

Установите некоторый объект как WKWebView's navigationDelegate и добавьте этот метод:

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

    decisionHandler(WKNavigationResponsePolicyAllow);
}
12
NobodyNada

Swift 3.1 версия ответа NobodyNada:

Без применения силы

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)
}
6
Andreas

Из метода делегата вы можете получить (WKNavigationResponse*)navigationResponse. А из объекта navigationResponse вы можете получить сам ответ:

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

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

}
1
Alex