UIWebView se atasca después de webViewDidStartLoad

Nuestra aplicación de iOS tiene una vista web que está representando páginas desde el file: URL. Cuando el usuario toca un elemento <A> para cambiar de página, aproximadamente el 20% del time, se queda atascado de la siguiente manera:

  1. El usuario toca el enlace <A>
  2. Obtendremos WebView.shouldStartLoadWithRequest callback
  3. Obtenemos la callback WebView.webViewDidStartLoad
  4. nada pasa despues de esto

La pantalla sigue mostrando la página original con el enlace en ella. Podemos romper el logjam de dos maneras:

  1. Gire el dispositivo
  2. Toca la pantalla

En ese momento, la página terminará de cargarse inmediatamente.

Usamos la receta desde aquí:

Javascript console.log () en un iOS UIWebView

para permitirnos una idea de la carga de la página. Colocamos las cosas del lado del javascript en el primer file de script que cargamos en la página, y no imprime su post hasta después de hacer la solución de rotar o tocar.

Entonces, parece que se está atascado en algún punto entre comenzar a cargar la página y comenzar a evaluar las cosas en la página.

Hemos probado una serie de soluciones, ninguna de las cuales ayudó:

  • Establecer location.href en lugar de usar la label
  • Configuración de la location.href de javascript timeout
  • En la callback didStartLoad, se creó una cadena que llamaba setNeedDisplay en la webView una y otra vez

¿Alguna idea de lo que podríamos estar haciendo mal?

Podría usar gdb dentro de XCode para depurar el problema. Creo que los canidatos para posts que podrían tener puntos de quiebre son:

 - (void)webViewDidStartLoad:(UIWebView *)webView - (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error 

También agregaría un descanso en cualquier UIViewController que muestre su UIWebView para:

 - (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration 

Entonces podrías pasar y, con suerte, captar lo que está mal con tu subclass UIWebView.

Si no desea agregar puntos de interrupción, simplemente puede ejecutar su aplicación en el depurador de XCode y presionar el button "pausa de ejecución" sobre la window de la console cuando la aplicación deje de responder mientras se carga.

Botón de ejecución de pausa de GDB

Es difícil saber qué está sucediendo sin que aparezca ningún código, pero apuesto a que Xcode puede ayudarlo a encontrar el problema rápidamente.

¡Buena suerte!

Encontré la solución para este extraño comportamiento, al less en mi caso.

En mi aplicación, he creado una subclass de UIWebView. Sé que la documentation de Apples señala que no debe subclass UIWebView. Pero es "necesario" en mi aplicación.

El problema fue que he sobrescrito scrollViewDidEndDragging: willDecelerate: sin llamar a super.

 - (void) scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { // my code } 

se convierte en

 - (void) scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate { [super scrollViewDidEndDragging:scrollView willDecelerate:decelerate]; // my code } 

Ahora siempre carga el website al tocar en un enlace html.