¿Cuáles son algunos métodos para depurar Javascript dentro de un UIWebView?


136

Estoy tratando de entender por qué algo con Javascript no funciona dentro de un UIWebView. Que yo sepa, no hay forma de establecer un punto de interrupción dentro de XCode para un archivo js. No hay problema, volveré a 2004 y usaré estadistas de alerta, ¡oh, espera, parece que tampoco funcionan dentro de un UIWebView!

Lo único que se me ocurre es exportar mis archivos HTML y JS a mi escritorio y luego simplemente hacer mi depuración dentro de Safari. Y eso funciona! Pero, por supuesto, el error con el que estoy peleando en UIWebView no ocurre en Safari.

¿Hay alguna otra forma de depurar dentro de un UIWebView, o algún truco que pueda usar para usar el método de alerta de la vieja escuela?

Respuestas:


277

Si está usando iOS> = 6 y tiene un león de montaña (10.8) o Safari> = 6, puede simplemente:

  1. Abra la aplicación en el simulador (o su dispositivo en XCode> = 4.5.x).
  2. Abra Safari (vaya Preferences -> Advancedy asegúrese de que "Mostrar menú de desarrollo en la barra de menú" esté activado.
  3. Desde la barra de menú (de Safari) seleccione Develop -> iPhone Simulator -> [your webview page].

Eso es !


66
Esto solo funciona si está ejecutando la aplicación en un simulador. Si debe utilizar un dispositivo iOS para la depuración, consulte este enfoque mobiarch.wordpress.com/2013/04/06/…
RajV

77
@RajV Puede depurar UIWebViews en un dispositivo físico, pero solo los que coloca directamente con XCode en su dispositivo, no los de la tienda de aplicaciones.
alecail

1
Es bastante obvio, pero esto puede ser útil. He probado esto en iOS7 Simulator con OSX 10.9 Mavericks y Safari 7, funcionando de maravilla. Gracias por esto.
Moe

1
@refaelos Gracias !! Es posible que funcione con mi dispositivo físico si uso el perfil provisional de desarrollo.
umang2203

11
No estoy seguro sobre el simulador, pero para que esto funcione en un dispositivo, hay una opción que debe habilitar en la configuración. Settings> Safari> Advanced> Web Inspector<- activar esta
Hodson

31

Esta consulta encabeza Google, por lo que vale la pena vincularla al RemoteInspector oculto en iOS5 , con mucho, la mejor forma encontrada hasta ahora para depurar sus UIWebViews, solo compilación condicional antes de enviar a Apple.


3
Todavía funciona, úsalo así: ¡ [NSClassFromString(@"WebView") performSelector:@selector(_enableRemoteInspector)];Recuerda eliminar la llamada cuando compiles para liberar!
Rpitting

1
Es una gran técnica. Sin embargo, tenga en cuenta que el depurador parece funcionar solo en safari. Lo probé desde otros navegadores (Chrome, por ejemplo) y no mostró nada.
Sagi Mann

3
Solía ​​usar esto antes, pero aparentemente no funciona ahora desde que apareció Mountain Lion (posible solución aquí): iwebinspector.com/help.html#ml
Omer

9

alert () ciertamente funciona para mí.

Sin embargo, también puede hacer muchas otras cosas, como crear su propia alerta DHTML que aparece en una capa. Esto puede ser bueno porque puedes hacer múltiples alertas a un solo div, sin detener tu aplicación. También debe poder escribirle un seguimiento de la pila (el seguimiento de la pila está en el objeto de excepción, y siempre puede lanzar sus propias excepciones).

Alternativamente, si se ejecuta en el simulador, su "alert ()" personalizada podría llamar al objetivo C y mostrar la cadena en la ventana de la consola del simulador de iPhone:

document.location.href = "http://debugger/" + 
   encodeURIComponent(outputString);   

y en el lado objetivo C:

//--------------------------------------------------------------------
- (BOOL)webView:(UIWebView*)webView 
       shouldStartLoadWithRequest: (NSURLRequest*)req 
       navigationType:(UIWebViewNavigationType)navigationType {
    if ([[[req URL] host] isEqualToString:@"debugger"]){
        // do stuff with [[req URL] path] 
       }
}

Dicho esto, tengo una aplicación que es pesada en el material UiWebView / javascript, y tiendo a hacer la mayoría de los desarrolladores de javascript en Chrome (simulando lo que es necesario desde el entorno del iPhone)


¿Qué quieres decir con "alert ()" que sin duda me funciona? Hacer una llamada a Objective-C es creativo, ¡me sorprende no haber pensado en eso antes ya que ya lo he hecho un poco! Gracias. :)
bpapa

Sí, alert () funciona bien. Tal vez no lo hizo en una versión anterior? Pero acabo de intentarlo y obtengo una ventana emergente que se ve casi idéntica a una realizada con UIAlertView en el lado objC.
robar

8

Me da la manera impresionante para depurar UIWebView O SFSafariViewController .

Espero que sea de ayuda.

Paso 1: 
 Abre Safari VC en tu Mac (jajaja No pongas cara, si lo digo en tu Macbook solo sigue mis pasos)



Paso 2: ve a las preferencias de Safari y haz clic en Avanzar. Obtendrá esta configuración en la pantalla de su MacBook.

ingrese la descripción de la imagen aquí

Ahora habilite el menú Mostrar para desarrollar en la barra de menú. Ahora todo su trabajo está hecho. ¿Estás pensando que estoy bromeando: P: P ningún hombre ... 



Paso 3: Ejecute su aplicación en Dispositivo o Simulador. (No piense simplemente ejecute) Y vaya a su aplicación donde está abriendo su Webview o SFSafariViewController. Hasta ahora no entendiste lo sé. Sé genial y mira mi próximo paso.

Paso 4: Abra Safari en su MacBook y haga clic en la opción Desarrollar en la barra de menú. ¿Recibió algo que su MacBook, iPad / iPhone muestra correctamente?

ingrese la descripción de la imagen aquí



Paso 5: Hecho. haga clic en su dispositivo y haga clic en URL. Aparecerá una nueva ventana emergente como esta. ingrese la descripción de la imagen aquí




Paso 6: ¿qué estás buscando ahora? Aquí están todos los pasos.

Ahora depure su página web en esta consola. Sé feliz y disfruta de tu día mientras codificas Con una taza de té o café.

IMP: no olvide habilitar la siguiente imagen ingrese la descripción de la imagen aquí 









6

Todavía no he probado esto, pero mira este Weinre

Se ve muy prometedor.


weinre es genial, pero tenga en cuenta que no viene con un depurador JS paso a paso; es solo un "inspector web". (No me di cuenta de esto hasta que tuve muchos problemas para configurarlo en mi iPhone).
Dan Fabulich,

Weinre parece haber dejado de funcionar desde Lion: ya no puedo obtener conexiones, posiblemente un problema con el sandboxing.
Rpitting

Parece que Adobe tiene un acuerdo con Weinre ahora y ofrece una aplicación llamada Adobe Shadow que lo implementa. Funciona bastante bien
Adrian Harris Crowne

Instalé weinre a través de npm (administrador de paquetes node.js) y me está funcionando en Mountain Lion. npm install -g weinre
wprl

2
Las respuestas de solo enlace son más adecuadas como comentario.
Joris Meys

4

Esta es una vieja pregunta. Pero todavía me gustaría compartir mis dos centavos.

He estado usando jsconsole.com para la depuración remota. Es fácil. Solo incluya una etiqueta de script y use registros de consola para depurar imprimiendo. Esto también se puede usar para depurar en un dispositivo real.


3

Antigua pregunta, pero creo que encontré la mejor solución, en mi caso necesita depurar uiwebview, pero no tenía acceso a la aplicación IOS y solo al contenido html y tuve que ver algunos registros JS, agregué el siguiente código cargar el light firebug JS y mostrarlo automáticamente:

llamándolo desde JS

var script = document.createElement('script');
script.type = 'text/javascript';
script.src = 'https://getfirebug.com/firebug-lite-debug.js';
document.head.appendChild(script);

o cargarlo desde html

<script type="text/javascript" src="https://getfirebug.com/firebug-lite-debug.js"></script>

-1

Puede configurar un sistema como el utilizado en PhoneGap para enviar mensajes desde JavaScript a Objective-C e iniciar sesión desde allí. En pocas palabras, están configurando document.location con un esquema personalizado y bloqueando ese esquema en la devolución de llamada delegada.

Puede aprovechar el hecho de que un UIWebView es la mayoría de los delegados para un WebView. WebKit está técnicamente indocumentado para iPhone, pero en su mayoría es el mismo que se especifica en los encabezados de escritorio de WebKit, posiblemente incluyendo el objeto WebScript. Lo uso para la depuración, pero asegúrese de eliminar este código antes de enviarlo a Apple.

Para obtener un WebView desde un UIWebView, implemente un método delegado como -(void) webView:(id)inWebView didFinishLoadForFrame:(id)inWebFrameen una subclase de UIWebView. Llama a super si usas esa.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.