问题描述
我需要监视来自WKWebKit中加载的给定网页的所有失败请求。为此,我实现了一个带有WKWebView
的简单控制器,并使该控制器符合WKNavigationDelegate
:
- (void)viewDidLoad
{
[super viewDidLoad];
webView.navigationDelegate = self;
NSURL *url = [NSURL URLWithString: @"https://google.com"];
NSURLRequest *request = [NSURLRequest requestWithURL:URL];
[webView loadRequest:request];
}
- (void)webView:(WKWebView *)webView
decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse
decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler {
NSLog(@"webView.decidePolicyForNavigationResponse %@",navigationResponse.response);
decisionHandler(WKNavigationResponsePolicyAllow);
}
- (void)webView:(WKWebView *)webView
decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction
decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
NSLog(@"webView.decidePolicyForNavigationAction %@",navigationAction.request);
decisionHandler(WKNavigationActionPolicyAllow);
}
我也尝试实现自定义NSURLProtocol扩展,但可以看到仅初始请求,就像navigationDelegate一样:
[NSURLProtocol registerClass:[TrackingNSURLProtocol class]];
我可以在输出中看到对google.com
网页的主要请求,但是即使在页面加载时由同一WKWebView执行并下载了子请求,该页面启动的子请求也不会被跟踪(css ,js,图片等)。
是否可以使用WKWebView(或通常使用iOS)实现这种跟踪?
解决方法
根据“失败”的含义,您可能更喜欢用名称中的fail
来实现这些方法:
func webView(WKWebView,didFail: WKNavigation!,withError: Error)
Called when an error occurs during navigation.
func webView(WKWebView,didFailProvisionalNavigation: WKNavigation!,withError: Error)
Called when an error occurs while the web view is loading content.