从 WKWebview 检索 HTTP 响应 headers
Retrieve HTTP response headers from WKWebview
我需要从 WKWebview
的请求中读取响应 HTTP headers。我需要根据服务器发送的某些自定义 headers 执行自定义。无法在响应数据中添加此信息。
我在文档中和之前的问题中都找不到任何条目。有什么办法吗?
您可以从委托方法中检索 (WKNavigationResponse*)navigationResponse
。从 navigationResponse 对象中,您可以获得响应本身:
- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler {
NSHTTPURLResponse * response = (NSHTTPURLResponse *)navigationResponse.response;
}
您似乎可以访问来自 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);
}
Swift 3.1、4、5版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)
}
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)
}
我需要从 WKWebview
的请求中读取响应 HTTP headers。我需要根据服务器发送的某些自定义 headers 执行自定义。无法在响应数据中添加此信息。
我在文档中和之前的问题中都找不到任何条目。有什么办法吗?
您可以从委托方法中检索 (WKNavigationResponse*)navigationResponse
。从 navigationResponse 对象中,您可以获得响应本身:
- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler {
NSHTTPURLResponse * response = (NSHTTPURLResponse *)navigationResponse.response;
}
您似乎可以访问来自 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);
}
Swift 3.1、4、5版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)
}
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)
}