我需要从 WKWebview
的请求中读取响应的HTTP头信息。我需要根据服务器发送的某些自定义头信息执行自定义操作。不可能将此信息添加到响应数据中。
我在文档中和之前的问题中都找不到任何条目。是否有任何方法可以做到这一点?
我需要从 WKWebview
的请求中读取响应的HTTP头信息。我需要根据服务器发送的某些自定义头信息执行自定义操作。不可能将此信息添加到响应数据中。
我在文档中和之前的问题中都找不到任何条目。是否有任何方法可以做到这一点?
看起来你可以从 WKNavigationDelegate
方法 webView:decidePolicyFor:decisionHandler:
中访问响应。
将某个对象设置为 WKWebView
的 navigationDelegate
,并添加此方法:
- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler {
NSDictionary *headers = ((NSHTTPURLResponse *)navigationResponse.response).allHeaderFields;
decisionHandler(WKNavigationResponsePolicyAllow);
}
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)
}
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)
}
从委托方法中,您可以检索(WKNavigationResponse*)navigationResponse
。从navigationResponse对象中,您可以获取响应本身:
- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler {
NSHTTPURLResponse * response = (NSHTTPURLResponse *)navigationResponse.response;
}
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
}