如何检测UIWebView完全加载完成?

17
我试图为UIWebView构建一个过滤器,但我很难检测到UIWebView何时完成完全加载。我已经使用了以下两种方法。
– webView:shouldStartLoadWithRequest:navigationType:
– webViewDidFinishLoad:

但问题在于,当页面有框架和额外内容需要加载时,这些代码将被多次调用。

我需要知道视图何时已完全加载,且没有更多内容可获取。然后,在内容加载完成后,我可以将页面的 URL 与已批准的 URL 列表进行比较。

你有什么想法吗?


你可以尝试在 shouldStartLoad 中设置一个标记,在一两秒钟后检查 didFinishLoad 中的标记,然后再调用所有加载完成 ... 如果页面上的所有内容都打算在页面加载时立即加载,则这应该相对稳健。只是一个想法;我处理过的内容都是一次性加载完成的... - David Doyle
我考虑过这个问题,但是在页面加载期间,didFinishLoad会被调用多次。我需要找出最后一次调用何时完成加载。 - ORStudios
在一个didFinishLoad和下一个didStartLoad之间,是否会有超过几秒钟的时间? - David Doyle
5个回答

34

使用UIWebViewDelegate协议方法webViewDidFinishLoadwebView的isLoading属性

 - (void)webViewDidFinishLoad:(UIWebView *)webView
 {
    //Check here if still webview is loding the content
    if (webView.isLoading)
       return;

    //after code when webview finishes
    NSLog(@"Webview loding finished");
 }

1
我几乎可以确定你的方法从不会提前返回。 - Dan Rosenstark
我正在WKWebView webView:(WKWebView *)webView didFinishNavigation方法中使用它。然而,即使在我的图像加载之前,它也无法返回。 :( - user1872384

2

Swift 3 版本:

func webViewDidFinishLoad(_ webView: UIWebView) {
    if webView.isLoading{
        return
    }
    print("Done loading")
}

1

确实,原始问题是很多年前发布的。最近我不得不找到一个可靠的解决方案来解决这个问题。

以下是对我有效的解决方案:

  1. 将UIWebView替换为WKWebWiew。
  2. 在处理“didFinishNavigation”委托方法时添加“evaluateJavaScript”代码。

完整代码如下:

   - (void)webView:(WKWebView *)webView didFinishNavigation:(null_unspecified WKNavigation *)navigation{
    [webView evaluateJavaScript:@"document.body.innerHTML" completionHandler:^(id result, NSError *error) {
        if (result != nil) {
            // Call your method here
        }
        if(error) {
            NSLog(@"evaluateJavaScript error : %@", error.localizedDescription);
        }
    }];
}

除了架构之外,在UIWebViewevaluateJavaScript:completionHandler:stringByEvaluatingJavaScriptFromString:之间有什么区别?您可以使用[webView stringByEvaluatingJavaScriptFromString:@"document.body.innerHTML"];,然后您将获得innerHTML字符串。 - Alejandro Iván

1

Try use:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)requestURL navigationType:(UIWebViewNavigationType)navigationType {
NSURL *url = [requestURL URL];
NSLog(@"##### url = %@",[url absoluteString]); 
return YES;
}

不要忘记设置你的UIWebView代理
或者添加语句,
NSRange range = [[url absoluteString] rangeOfString:@"https://www.google.com"];
if (range.location != NSNotFound)
{}

希望能够帮助你。

0

如果您不是UIWebView的所有者,因此无法访问webViewDidFinishLoad,但您有对UIWebView的引用,则可以使用以下代码

Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { (timer) in

    guard uiWebView.isLoading else {
        return
    }

    timer.invalidate()
    //Add your logic here

}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接