2015-03-04 20 views
7

Sto avendo uno strano problema con NSURLSession sul metodo delegato didFinishDownloadingToURL.NSURLSession didFinishDownloadingToURL file scaricato temporaneo non trovato

La prima cosa che sto facendo è controllare se il file scaricato temporanea esiste:

- (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask 
              didFinishDownloadingToURL:(NSURL *)location 
{ 
    if (![[NSFileManager defaultManager] fileExistsAtPath: [location path]]) 
    { 
     NSLog(@"Error. File not found"); 
     return; // is giving error when the app is wake up by the system 
    } 
    ... 
} 

E funziona normalmente quando l'applicazione è in primo piano e di scaricare finiture. Ma quando l'app è in background e viene uccisa forzatamente dal sistema operativo, restituisce false.

Qualcuno ha idea di cosa potrebbe accadere? So che esiste un limite di tempo per l'esecuzione di questo metodo delegato quando l'applicazione è attiva dal sistema operativo, in quanto non ha senso che il file temporaneo non sia presente. Non riesco nemmeno a copiarlo in un'altra posizione ... Ha senso essere a causa della dimensione del file? Sto scaricando un file di + -130 MB.

Grazie.

+0

Ho lo stesso problema. Archiviato un bugreport http://openradar.appspot.com/radar?id=4943165404479488 – Biga

+0

Prova ad aprire comunque l'URL. La chiamata fileExistsAtPath potrebbe mentirti a causa di qualche stranezza relativa alla sandbox dell'app. – dgatwood

+0

hanno problemi simili. la posizione sta puntando al file che non esiste. Non succede spesso. Un po 'fastidioso. Mi chiedo se questo bug causi una cattiva durata della batteria, perché quel file verrà scaricato di nuovo. E se la posizione è di nuovo sbagliata, poi scaricata di nuovo ... ecc. –

risposta

1

Ho risolto lo stesso problema installando l'app dopo l'applicazione di disinstallazione. Sembra che NSURLSession lasci detriti sul sistema quando l'arresto forzato avviene mentre una sessione di rete funziona.

+0

Sto eseguendo un obiettivo Test unitari su un progetto di framework (non app) sul Simulatore, quindi non sono sicuro di come provare la soluzione. Sto ** invalidando ** la sessione sia in 'setUp()' che 'tearDown()' ... –

+0

Sto ricevendo questo come posizione /var/mobile/Library/Caches/com.apple.nsurlsessiond/Downloads /com.xxxxxxx/CFNetwo rkDownload_uFBpqp.tm p Sto vedendo lo stesso comportamento su iOS 10.3.2. L'unico modo per risolverlo attualmente è riavviare il dispositivo –

-2

Dal Apple Docs:

(location è ..) "Un URL per il file temporaneo perché il file è temporaneo, è necessario aprire il file per la lettura o spostarlo in una posizione permanente nella vostra. directory del contenitore sandbox dell'app prima di tornare da questo metodo delegato

Se si sceglie di aprire il file per la lettura, è necessario eseguire la lettura effettiva in un'altra discussione per evitare il blocco della coda dei delegati. "

+1

Nell'esempio fornito, si accede al file "prima di tornare da questo metodo delegato" - il problema è che non è lì. I documenti Apple sono precisi in circostanze normali, ma non nel caso sopra descritto. – Joseph