2010-10-11 10 views
10

¿Cómo puedo diagnosticar este error?No se pudo iniciar la aplicación en el tiempo

Application Specific Information: 
    MyApp failed to launch in time 

    Elapsed total CPU time (seconds): 4913.443 (user 3868.270, system 1045.173), 56% CPU 
    Elapsed application CPU time (seconds): 0.010, 0% CPU 

    Backtrace not available 

    Unknown thread crashed with unknown flavor: 5, state_count: 1 

    Binary Images: 
    0x2fe00000 - 0x2fe26fff dyld armv7 <a11905c8ef7906bf4b8910fc551f9dbb> /usr/lib/dyld 

Aquí es mi didFinishLaunching método:

#pragma mark - 
#pragma mark Application lifecycle 

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {  

     if(getenv("NSZombieEnabled") || getenv("NSAutoreleaseFreedObjectCheckEnabled")) 
     { 
      NSLog(@"NSZombieEnabled/NSAutoreleaseFreedObjectCheckEnabled enabled!"); 
     } 

     // Override point for customization after application launch. 
     [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(reachabilityChanged:) name: kReachabilityChangedNotification object: nil]; 

     //Check for connectivity 
     internetReach = [[Reachability reachabilityForInternetConnection] retain]; 
     [internetReach startNotifer]; 
     [self updateInterfaceWithReachability: internetReach]; 

     [window addSubview:navigationController.view]; 
     [window makeKeyAndVisible]; 

     return YES; 
    } 
+0

¿Más de una hora de tiempo de configuración? ¡Santa vaca! – Chuck

+0

¿No estás seguro de por qué es así? La aplicación definitivamente no toma 1 hora para la configuración! En realidad, funciona bastante rápido, por lo que este problema es preocupante. –

Respuesta

28

Probablemente se esté haciendo un montón de trabajo de configuración en la solicitud de su AppDelegate : didFinishLaunching método.

Debe asegurarse de que esta función finalice lo antes posible. Cualquier trabajo de configuración que requiera tiempo (acceso a la red, por ejemplo) debe realizarse de manera asincrónica en su aplicación. Mientras esto sucede, puede mostrar una ruleta para indicarle al usuario que la aplicación se está cargando.

+0

Ver código actualizado. Solo estoy usando el código de Accesibilidad de Apple en didFinishLaunching. –

+0

No debe hacer eso en didFinishLaunching. Un chequeo de accesibilidad puede tomar mucho tiempo –

+4

Ahí es donde Apple lo puso en su código de ejemplo. ¿Dónde debería hacer un chequeo de accesibilidad? –

5

Con el fin de agregar información a Philippe Leybaert respuesta.
Si la aplicación tarda mucho tiempo en iniciarse, el hilo principal se eliminará, por lo que la aplicación se bloqueará.

  • Cuando se está utilizando el simulador, no se bloqueará.
  • Cuando está usando su iphone conectado a xcode no se bloqueará.
  • Cuando lo envíe a la App Store que podría ser aceptado si el probador de Apple está usando un iPhone rápido
  • Cuando sus usuarios en lento como iPhone 3S se colgará

Una manera de probar esta emisión antes de la entrega es para implementar testflight o con adhoc e instalarlo en el dispositivo más lento que desee admitir.

+0

¡Ojalá la nuestra se hubiera estrellado en el dispositivo del comprobador de Apple! De hecho, estamos obteniendo esto en una aplicación en la tienda de aplicaciones y solo se bloquea en ciertos dispositivos de usuario. Lo he instalado recién en App Store en mis propios dispositivos y funciona perfectamente; también lo hemos instalado muchas veces desde TestFlight en dispositivos de prueba también sin problemas. Por lo tanto, no es tan claro como dices. – siburb

+0

@whiskIT gracias por la información. Tiene sentido si el probador usa un iPhon rápido. Él no verá el error y validará tu aplicación. –

+0

Al usar un iPhone conectado a Xcode no se bloqueará, simplemente puede presionar ** detener ** en Xcode y luego abrir la aplicación en su iPhone manualmente nuevamente. Podrá bloquearse. Esto ahorra la molestia de pasar por la distribución Ad Hoc o TestFlight. – Hlung

1

Simplemente tratar de dividir su aplicación: didFinishLaunchingWithOptions: código del método a diferentes llamadas a funciones y hacer esas llamadas en segundo plano mediante las roscas otro entonces principal y asegurarse de que la aplicación: didFinishLaunchingWithOptions: método devuelve tan pronto como sea posible

se puede usar

dispatch_async(dispatch_get_main_queue(), ^{ 
//put your code 
} 

¡He resuelto el problema usando este código!

Cuestiones relacionadas