¿Cómo detectar cuándo un UIWebView ha terminado de cargarse por completo?

Estoy tratando de crear un filter para una UIWebView y me cuesta encontrar cuándo UIWebView ha terminado de cargarse. He usado los siguientes dos methods

– webView:shouldStartLoadWithRequest:navigationType: – webViewDidFinishLoad: 

pero el problema es que estos se llamarán varias veces cuando una página tenga frameworks y contenido adicional para cargar.

Lo que necesito es saber cuándo la vista se ha cargado por completo y no hay más contenido que search. Luego, cuando el contenido se haya cargado, puedo verificar la URL de la página con una list de URLs aprobadas.

¿Algunas ideas?

Utilice el método de protocolo webViewDidFinishLoad y webView's isLoading property

  - (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"); } 

Versión Swift 3:

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

Intente usar:

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

no olvide configurar su delegado de UIWebView

o agregar statement,

 NSRange range = [[url absoluteString] rangeOfString:@"https://www.google.com"]; if (range.location != NSNotFound) {} 

Espero ayudarte.

Es cierto que la pregunta original fue publicada hace muchos años. Recientemente tuve que encontrar una solución confiable para este problema.

Esta es la solución que funcionó para mí:

  1. Reemplazado UIWebView con WKWebWiew.
  2. Se agregó el código 'evaluateJavaScript' mientras se maneja el método de delegado 'didFinishNavigation'.

El código completo es:

  - (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); } }]; }