2009-05-21 10 views
5

Estoy escribiendo una aplicación para iPhone que se puede iniciar a través de una URL personalizada. Por lo tanto, anulo - (BOOL)application:(UIApplication *)application handleOpenURL:(NSURL *)url¿Cómo debo depurar al implementar el mensaje handleOpenURL?

Para probar mis cambios, tengo que ejecutar la aplicación en el simulador, luego salir e iniciar Safari. Luego escribo mi URL personalizada en la barra de direcciones para iniciar la aplicación.

Pero cada vez que inicio, la aplicación se cuelga. Intento averiguar por qué, pero cuando configuro un punto de interrupción y abro la aplicación desde la pantalla de inicio (en lugar de en XCode), parece que no se adjunta.

Incluso traté de poner declaraciones NSLog en el mensaje handleOpenURL, pero no se imprimen en la consola.

Supongo que podría crear UIAlertViews pero ... sí, yikes. ¿Alguna otra forma de conectarse a una sesión de depuración en el simulador?

Respuesta

14

En Xcode 4, se puede editar el esquema de su objetivo y en la sección "Ejecutar", pestaña "Info" , se puede elegir la opción "esperar MyApp.app para poner en marcha" opción:

enter image description here

Esto hará que el depurador que esperar hasta la próxima vez que se inicia la aplicación, y luego se adhieren a ese proceso en lugar de crear una nuevo proceso para ti. Esto le permitirá iniciar su aplicación manualmente desde Safari y usar el depurador.

+0

Esta debería ser la nueva respuesta ahora que Apple ha corregido esto en Xcode 4. ¡Mucho más fácil! – ageektrapped

+1

Esto engancha el depurador, pero NSLog y stdout parecen estar perdidos :( –

7

Abra Console.app (en la carpeta Utilidades). Sus mensajes de registro deberían aparecer allí.

+0

Para ampliar esto, las instrucciones 'NSLog' no aparecerán en la consola XCode estándar si la aplicación no se inició desde XCode (es decir, en el teléfono o dentro del simulador). –

+0

Esto no funcionó para mí, pero al usar la pestaña Consola en la ventana del organizador XCode hice ... –

1

¿Puedes escribir una prueba de unidad que ejercería la funcionalidad de tu AppDelegate?

+0

En realidad, probé de otra manera similar - puse una llamada para manejarOpenURL en el mensaje de inicio de aplicaciónDelInicio, y luego lo lancé como siempre , y pude avanzar. Y hacerlo de esa manera no colisionó con nada, solo se coló por los pasos descritos anteriormente. – bpapa

+0

¿Tu controlador handleOpenURL está confiando en algo que está configurado en applicationDidFinishLaunching? –

+0

Además, en lugar de intentar iniciar sesión en la consola, ¿puede guardar cierta información en un archivo? –

1

No he probado esto, pero ¿qué hay de la adición de una línea de instrucciones punto de interrupción en el código:

#if TARGET_CPU_ARM == 1 
#define breakpoint() __asm__ volatile ("bkpt 0") 
#else // !ARM - assume INTEL. Everything else will break 
#define breakpoint() __asm__ volatile ("int3"); 
#endif 
1

añadir lo siguiente como primera línea en el hadleOpenURL:

[NSThread sleepForTimeInterval: 30,0] y poner el punto de interrupción en la línea siguiente después.

Después de invocar su aplicación, tendrá 30 segundos para ir a XCode y seleccionar desde el menú: Ejecutar/"Adjuntar para procesar" y seleccionar el nombre de su aplicación de la lista. El depurador debe detenerse en su punto de interrupción.

¡No olvide quitar el sleepForTimeInterval cuando haya terminado!

Cuestiones relacionadas