2010-10-11 10 views
10

Come posso diagnosticare questo errore?L'applicazione non è stata avviata in tempo

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 

Ecco il mio metodo didFinishLaunching:

#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

Più di un'ora di tempo di configurazione? Mucca sacra! – Chuck

+0

Non sai perché questo è il caso? L'app sicuramente non richiede 1 ora per l'installazione! Funziona abbastanza veloce in realtà, quindi questo problema è preoccupante. –

risposta

28

probabilmente stai facendo un sacco di lavoro messa a punto in applicazione del AppDelegate : didFinishLaunching metodo.

È necessario assicurarsi che questa funzione venga interrotta il prima possibile. Qualsiasi lavoro di installazione che richiede tempo (ad esempio l'accesso alla rete) deve essere eseguito in modo asincrono nell'applicazione. Mentre sta succedendo, puoi mostrare uno spinner per indicare all'utente che l'applicazione sta caricando.

+0

Vedi codice aggiornato. Sto solo usando il codice di Reachability di Apple in didFinishLaunching. –

+0

Non dovresti farlo in didFinishLaunching. Un controllo di raggiungibilità può richiedere molto tempo –

+4

Ecco dove Apple ha inserito il codice di esempio. Dove devo fare un controllo di raggiungibilità? –

5

Per aggiungere così informazioni alla risposta di Philippe Leybaert.
Se l'applicazione impiega molto tempo per l'avvio del thread principale, verrà interrotto in modo da bloccare l'applicazione.

  • Quando si utilizza il simulatore, non andrà in crash.
  • Quando si utilizza l'iphone collegato a xcode , non si arresta in modo anomalo.
  • quando lo si invia per App Store è potrebbe essere accettato se il tester Apple sta usando un iPhone veloce
  • Quando i tuoi utenti su lento come iPhone 3S sarà in crash

Un modo per testare questo issu prima dell'invio è quello di distribuire a testflight o con ad hoc e installarlo sul dispositivo più lento che si desidera supportare.

+0

Vorrei che il nostro dispositivo si fosse schiantato sul dispositivo del tester Apple! In realtà lo stiamo ricevendo in un'app nell'app store e si blocca solo su determinati dispositivi dell'utente. L'ho installato fresco da App Store sui miei dispositivi e funziona perfettamente - lo abbiamo anche installato molte volte da TestFlight sui dispositivi di test anche senza problemi. Non è così chiaro come dici tu. – siburb

+0

@whiskIT grazie per l'informazione. Ha senso se il tester usa un iPhon veloce. Non vedrà il bug e convaliderà la tua app. –

+0

Mentre l'iPhone collegato a Xcode non si arresta, puoi semplicemente premere ** stop ** in Xcode e quindi aprire nuovamente l'app sul tuo iPhone manualmente. Sarà in grado di bloccarsi. Ciò evita il fastidio di passare attraverso la distribuzione Ad Hoc o TestFlight. – Hlung

1

Basta provare a dividere la vostra applicazione: didFinishLaunchingWithOptions: codice di metodo per chiamate di funzione diverse e fare quelle chiamate in background utilizzando i fili altri poi principale e fare in modo che l'applicazione: didFinishLaunchingWithOptions: metodo restituisce il più presto possibile

voi possibile utilizzare

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

Ho risolto il problema utilizzando questo codice!

Problemi correlati