html页面资源的WKWebView DecisionPolicyForNavigationAction

问题描述

我需要监视来自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.