2012-03-30 22 views
18

Tengo un código que se activa al iniciarse solo después de que la aplicación se haya actualizado o instalado. Quiero depurar este código, pero no puedo pensar en una forma de hacerlo.Depuración de la aplicación iOS en el primer lanzamiento

No puedo iniciar la aplicación con Xcode porque sobrescribiría la aplicación existente y no activaría la actualización.

No puedo adjuntar Xcode al proceso manualmente porque el código que quiero depurar se habrá ejecutado para el momento en que reciba Xcode.

¿Hay alguna forma de sacar esto que me estoy perdiendo?

+0

No puede usar instantáneas o control de versiones para administrar reversiones/reversiones, por lo que no hay preocupaciones con "sobrescribir la aplicación existente". – rwyland

+0

Si no desea que sobrescriba su producto existente en Xcode, siempre puede hacer una copia de la carpeta de proyectos y resolverlo. – John

Respuesta

39

Utilice la opción "Esperar a que MyApp.app lance".

En Xcode, mantenga presionada la tecla Opción y elija Producto-> Ejecutar ... (las elipsis se agregan cuando mantiene presionada la Opción). Aparecerá el editor de esquema, con el esquema Ejecutar seleccionado. Haga clic en la pestaña Información, y en el panel de información resultante verá un grupo de radio con la etiqueta "Iniciar" con dos opciones: "Automáticamente" y "Esperar a que se inicie MyApp.app". Si selecciona la segunda opción, Xcode iniciará el depurador y esperará a que inicie su aplicación manualmente. Puede establecer un punto de interrupción al comienzo del código que desea depurar, y el depurador se detendrá allí.

Restablezca la aplicación a su estado anterior.

Es posible que desee considerar agregar algún código que restablezca la aplicación al estado en que estaba antes de la actualización. Esto puede ser código de depuración que está excluido de la compilación de lanzamiento. Los problemas de depuración que requieren que reinstale la aplicación cada vez que desee ejecutar su depuración pueden tomar un lote de tiempo. Incluso el solo hecho de tener que reiniciar la aplicación en cada ciclo de depuración consume mucho tiempo. A menudo vale la pena dedicar un poco más de tiempo a agregar un botón a tu aplicación que deshaga cualquier cambio que estés haciendo para que puedas volver a hacerlo.

Prueba de la unidad.

Una forma excelente de depurar código que trata con estados de aplicación que son difíciles de recrear es escribir pruebas unitarias. En una prueba, puede crear cualquier estado que desee. Incluso puede crear estados de aplicación que pueden ser imposibles de recrear en su aplicación. Y puede depurar ese código una y otra vez. Al igual que la solución anterior, lleva un poco más de tiempo escribir el código por adelantado, pero ahorrará mucho tiempo en cada iteración de su ciclo de depuración que bien lo vale. Aún mejor, puede agregar la prueba a su proceso de compilación para asegurarse de que la funcionalidad no se rompa más tarde.

+1

¡Gracias por la respuesta exhaustiva! Mi problema fue que, al depurar, Xcode esencialmente empuja una nueva versión de la aplicación al dispositivo, y necesitaba probar el proceso de actualización de una versión arbitraria a la versión actual.Al final, saqué una antigua rama del control de código fuente, la instalé en el dispositivo y luego ejecuté la versión actual de Xcode como de costumbre. Esto me permitió observar el proceso de actualización. –

+0

Además, sobre la primera opción ... Si empiezo a depurar en "modo de espera", ¿puedo actualizar la aplicación a través de la tienda de aplicaciones o safari entre el inicio del depurador y el inicio de la aplicación? –

+0

Similarmente, ¿cómo puedo probar una "segunda ejecución"? Lo que significa que quiero probar lo que sucede después de cerrar la aplicación y abrirla de nuevo ... –

0

También tengo un código que solo ejecuto en actualizaciones, tengo este método debajo del cual uso al final de applicationDidFinishLaunching. Puedo depurar esto también:

- (void) determineWhetherToForceSync { 
    NSString *currentVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];  
    NSString *savedVersionKey = @"savedVersionKey"; 
    NSString *savedVersion = [[NSUserDefaults standardUserDefaults] valueForKey:savedVersionKey]; 
    if (!savedVersion) { 
     //This is a fresh install.... 

    } else { 
     //They have a saved version, so check if it's the same as current version 
     if (![currentVersion isEqualToString:savedVersion]) { //They have done an upgrade    
      //This is an update 

     } //.... else they are starting the app on a second attempt 
    } 

    //Save the current version 
    [[NSUserDefaults standardUserDefaults] setObject:currentVersion forKey:savedVersionKey]; 
} 

volver a probar, eliminar la aplicación y volver a instalar. O cambie su número de versión.

Cuestiones relacionadas