Aplicación de depuración cuando se inicia mediante notificación push

135

Actualmente estoy desarrollando una aplicación que recibe notificaciones push. Todo esto funciona 100% a través de una página PHP. Hay varios tipos diferentes de notificaciones push que mi aplicación puede recibir. El PHP maneja esto y envía diferentes paquetes de información a mi aplicación que se reciben todos muy bien.

Sin embargo, cuando los usuarios "ven" la notificación y se inicia mi aplicación, obviamente quiero tomar una acción diferente a la que haría si el usuario acaba de iniciar la aplicación manualmente, y además, diferentes acciones dependiendo del tipo de notificación push. Tengo esto funcionando bien ... estructuralmente.

Se supone que uno de mis tipos de inserción abre una UIView que realiza varias conexiones a varios servidores diferentes y negocia datos de un lado a otro. Esta UIView funciona bien cuando, por ejemplo, se activa desde el menú principal; sin embargo, cuando mi notificación de inserción activa esta UIView, las conexiones de socket no están actuando como se esperaba.

Ahora mi pregunta no es acerca de los enchufes, sino más aún: ¿cómo se depura ese problema? Por lo que puedo decir (soy relativamente nuevo) cuando la aplicación se inició desde una notificación automática, no hay forma de vincular esa ejecución al depurador / consola / etc ... Me está costando mucho tratar de depurar el código usando UIAlertViews, ya que hay muchas líneas de comunicación entre los distintos servidores.

Cualquier consejo que tengas para mí sería muy apreciado.

Dutchie432
fuente

Respuestas:

147

En XCode <4.0 (para XCode> = 4, consulte la respuesta de delirus a continuación), ahora puede configurar Xcode para adjuntar el depurador a la aplicación después de iniciarlo, en lugar de iniciar la aplicación a través del depurador. Esto le permite depurar cosas que varían según el estado de inicio de su aplicación, como esquemas de URL, tableros de cartón y notificaciones push.

  1. En Xcode, busque en la barra Fuente y debajo de los Objetivos habrá Ejecutables.
  2. Abra el inspector de su aplicación en ejecutables.
  3. Haga clic en la pestaña de la pestaña Depuración en el inspector.
  4. Desmarque "Iniciar ejecutable después de iniciar el depurador"
  5. Marque la casilla "Esperar el próximo lanzamiento / notificación push"

Ahora, cuando haga clic en depurar desde Xcode en lugar de iniciar la aplicación, aparecerá una ventana que le indicará que está esperando que se inicie la aplicación. Luego inicia la aplicación normalmente en el teléfono y Xcode se adjunta a ella

Louis Gerbarg
fuente
37
Sé que esto puede no ser apropiado, pero te amo. :)
Dutchie432
17
Cuando se inicia de esta manera, el stdin, stdout, stderr de su aplicación no se enruta a la consola de GDB, sino que se señala dónde se encuentra en el inicio normal de una aplicación. Puede ver NSLog () s en la consola del sistema del dispositivo mirando el dispositivo en el organizador.
Louis Gerbarg el
1
Me enseñaste algunos puntos muy valiosos aquí. GRACIAS. Pasé los últimos 2 días tratando de depurar algo que pude arreglar dentro de los 20 minutos posteriores a su publicación.
Dutchie432
1
@stigi trabaja en el simulador para mí para probar esquemas de URL. Estoy usando xcode 4.5 si eso importa
dreyln
1
@dreyln mi comentario fue de 2009 :) mucho ha cambiado desde entonces. Pero gracias por el aviso!
Stigi
124

Para Xcode 4 tienes que:

  1. Edite su esquema activo a través del menú desplegable "Esquemas". ( + <)
  2. Que elija su producto: 'Ejecutar MyApp.app' a la izquierda.
  3. Seleccione la pestaña 'Información' a la derecha.
  4. Y finalmente elija la opción "Esperar a que se inicie MyApp.app".

Más aquí en la sección "Personalizar ejecutables en el editor de esquemas".

EDITAR:
en caso de que pierda registros en GDB, vea el comentario de Louis Gerbarg a su respuesta.

matm
fuente
1
Estoy con Xcode 4.2 para Lion y, aunque la aplicación se inicia correctamente desde el esquema de URL y la ejecución del depurador no se detiene, la consola no muestra nada. ¿Me estoy perdiendo de algo?
LoDani
@LoDani igual aquí, ¿alguna vez descubriste por qué?
davis
3
@LoDani, Davis G .: ¿Viste el comentario de Louis sobre la respuesta aceptada? stackoverflow.com/questions/1239000/… Cuando se inicia de esta manera, stdin / out / err no se redirige a la consola.
Ivan Vučica
¡Gracias, me salvaste el día! Tratando de corregir un error que solo ocurre cuando mi aplicación es iniciada por un controlador de URL.
Eliot
@delirus - Gracias por actualizar esto para XCode 4.
Dutchie432
112

Para XCode 10, 9, 8, 7 y 6:

  1. Seleccione el Esquema en la barra de herramientas (justo a la izquierda del dispositivo con el que está depurando)
  2. Elija Editar esquema
  3. Seleccione Ejecutar en el panel izquierdo
  4. Para la opción Iniciar , seleccione Esperar a que se ejecute el ejecutable
  5. Cierre el editor de esquemas y ejecute su proyecto XCode

Ahora puede depurar al iniciar desde una notificación, una URL personalizada o tocando el icono de la aplicación.

bgolson
fuente
9
Esta respuesta me causó muchos problemas, aunque en general me encaminó por el camino correcto. El paso 3 es un poco engañoso. Tienes que hacerlo, por supuesto; seleccione Ejecutar en el panel izquierdo. Pero también debería haber un paso 5 con una redacción conceptual muy similar: haga clic en el botón Ejecutar de xcode, antes de esperar los resultados ... Como al principio no funcionó para mí, pedí consejo a otros compañeros de trabajo ... me preguntaron yo si hice lo de Ejecutar, a lo que respondí que sí, pensando en la opción no. 3 ... Realmente debería haber un paso 5 para esto ...
Florin Odagiu
@FlorinOdagiu Buena llamada. Se agregó el paso 5. ¡Gracias!
bgolson
En caso de que Xcode restaure una pestaña de esquema diferente, la opción Iniciar se encuentra debajo de la pestaña Información.
Nate Whittaker
3
No obtengo ningún resultado en la ventana del depurador cuando inicio la aplicación manualmente.
dvdblk
3

No estoy trabajando con notificaciones push, así que no sé el funcionamiento exacto de las notificaciones push. Sin embargo, trataría de imitar la recepción de una notificación push dejando que el método principal de su programa pretenda que se haya publicado una notificación si es posible, o llamando a la aplicación: didFinishLaunchingWithOptions: UIApplicationDelegate desde dentro del método applicationDidFinishLaunching: método.

HTH - Saludos, Daan

drvdijk
fuente
También es una buena idea, ¡pero imitar siempre es el segundo mejor para depurar lo real! ¡Feliz codificación!
Dutchie432
3

En Xcode 6:

  1. conectar iPhone a Macbook con USB
  2. inicie la aplicación en el iPhone tocando el icono
  3. En el menú de Xcode, Debug> Attach to Process> Escoja su Aplicación
Ali Saeed
fuente
1
No podrá depurar la ruta crítica de inicio con este enfoque.
Zorayr
2

Para XCode 11 y 10, puede hacer lo siguiente:

  1. Seleccione la opción Esquema.
  2. Elija Editar esquema.

  3. Seleccione la opción Ejecutar desde el panel izquierdo

  4. En la parte de inicio, seleccione esperar a que se ejecute el ejecutable , luego cierre el cuadro de diálogo.

  5. Construye y ejecuta el proyecto. Ahora puede iniciar la aplicación tocando el ícono de la aplicación o tocando el mensaje de notificación.

Ramy Rizkalla
fuente