2014-09-05 10 views
6

Perché il collegamento con una NSURLSession tramite la sua configurazione richiede così tanto tempo da provocare il crash dell'applicazione all'avvio: "impossibile eseguire l'avvio in tempo"?Perché la connessione a uno sfondo iOS NSURLSession impiega troppo tempo ad attendere un blocco, causando il blocco dell'applicazione?

Ho visto crash-crash simili in molte app iOS, tra cui l'app NY Times per iOS e l'app Evernote.

[NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:queue] 

Ecco la traccia dello stack:

Thread 0: 
0 libsystem_kernel.dylib   0x3afb7aa0 semaphore_wait_trap + 8 
1 libdispatch.dylib    0x3af04d3d _dispatch_semaphore_wait_slow + 173 
2 CFNetwork      0x2febd8e3 -[__NSCFBackgroundSessionBridge setupBackgroundSession] + 379 
3 CFNetwork      0x2fef18a1 +[__NSCFSessionBridge bridgeForConfiguration:session:queue:] + 153 
4 CFNetwork      0x2fef6497 -[__NSCFURLSession initWithConfiguration:delegate:delegateQueue:] + 395 
5 CFNetwork      0x2fef6eb7 +[__NSCFURLSession sessionWithConfiguration:delegate:delegateQueue:] + 295 
+0

Anche io sto affrontando lo stesso problema con la traccia dello stack esatta. Non è in grado di scoprire la causa principale. @ Rayyan, sei riuscito a risolvere il problema? – kkumpavat

+0

Ho spostato la chiamata per eseguire in modo asincrono su un thread in background in modo che il sistema operativo non risolva l'applicazione a causa di questo. Tuttavia, la chiamata sessionWithConfiguration si blocca e non ritorna mai. Accade raramente, ma una volta che un dispositivo si trova in cattivo stato, si blocca costantemente su quel dispositivo. @kkumpavat, è questo che stai vedendo anche tu? Sospetto che sia un bug in iOS. – Rayyan

+0

Sì, ho anche il sospetto che si tratti di un bug in iOS. Succede raramente e una volta che iOS si trova in quello stato negativo, l'esecuzione si blocca in "sessionWithConfiguration: delegate: delegateQueue:" ogni volta. Anche lo spostamento della chiamata per l'esecuzione in modo asincrono non aiuta poiché la sessione non viene mai inizializzata e non saremo in grado di eseguire attività di rete. – kkumpavat

risposta

1

Vedi Application Specific Information: Application failed to launch in time (iOS)?.

Fondamentalmente ci sono 2 cose da tenere a mente:

  1. All'avvio, avete solo pochi secondi per completare la procedura di avvio. Qualsiasi codice più lungo dovrebbe essere chiamato in modo asincrono dopo l'avvio dell'app.

  2. Assicurarsi assolutamente che qualsiasi codice UI nei richiami/blocchi/chiusure/ecc. Sia chiamato sul thread principale. Devi costringerlo a farlo.

+0

@ henry-asseily, grazie, questo ha senso e sono d'accordo con le vostre linee guida. Quello che non mi è chiaro è perché sessionWithConfiguration: delegate: delegateQueue: API impiega molto tempo, che deve essere asincrono in modo che non registri l'app all'avvio. La semantica di questa API non suggerisce che possa trattarsi di una chiamata lunga, ma forse mi manca qualcosa. – Rayyan