2015-08-09 14 views
9

Ho implementato NSURLSession per scaricare file di dimensioni piuttosto grandi dai nostri server. Ora che lavoro in primo piano o in background e torno all'app, le transazioni stanno funzionando e stanno finendo.Come riprendere il processo di download di NSURLSession dopo l'interruzione forzata dell'app e il riavvio dell'app:

Ma se I forzare l'uscita l'app utilizzando la schermata multitasking e riaprire nuovamente l'app. il processo di download non è sempre finito anche se, come ho capito dalla documentazione, dovrebbe, ecco ciò che la documentazione dello stato:

Se un'applicazione iOS è terminata dal sistema e rilanciato, l'applicazione può utilizzare lo stesso identificativo per creare un nuovo oggetto di configurazione e una sessione e recuperare lo stato dei trasferimenti in corso al momento della chiusura. Questo comportamento si applica solo per la normale chiusura dell'app da parte del sistema. Se l'utente termina l'app dalla schermata multitasking, il sistema annulla tutti i trasferimenti in background della sessione. Inoltre, il sistema non riavvia automaticamente le app che sono state abbandonate forzatamente dall'utente. L'utente deve riavviare esplicitamente l'app prima che i trasferimenti possano iniziare nuovamente.

Significato se rilanciare l'applicazione della transazione prima che la forzare lo spegnimento dovrebbe iniziare di nuovo, o sono? C'è un'operazione aggiuntiva che devo impegnarmi per funzionare?

UPDATE: Mi sono imbattuto in questo progetto: https://github.com/Heikowi/HWIFileDownload#force-quit

che indica:

Forzata

Dopo l'applicazione è stata uccisa da parte dell'utente, download NON continua in background. Su iOS 7 (e successivi) i dati di ripresa vengono restituiti.

Significato c'è un modo per ricevere i dati di ripresa anche se l'applicazione è stata uccisa dall'utente in background. Solo il progetto è scritto in Objective-C e non riesco a capire cosa stanno facendo per ottenere questo. Qualsiasi aiuto sarebbe apprezzato. Grazie in anticipo.

risposta

17

Dopo una forza-qu it:

NSURLSessionTaskDelegate - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error 

il metodo delegato verrà chiamato al riavvio dell'app. Se l'attività di download può essere ripresa, l'oggetto errore conterrà i dati di ripresa:

[error.userInfo objectForKey:NSURLSessionDownloadTaskResumeData].

Utilizzando questi dati è possibile riprendere il processo di download con la creazione di un NSURLSessionDownloadTask con:

(NSURLSessionDownloadTask *)downloadTaskWithResumeData:(NSData*)resumeData. 

Maggiori informazioni su che si possono trovare in Life Cycle of a URL Session with Custom Delegates, passo 13.

+0

In realtà non è troppo tardi, grazie per la tua risposta. Potresti per favore elaborare come dovrei usare questi dati ricevuti per riprendere il download. Come hai detto tu, lo ricevo sul metodo didCompleteWithError. Devo avviare immediatamente un'altra attività utilizzando il downloadTaskWithResumeData dal metodo didCompleteWithError o ho bisogno di salvare l'oggetto resumeData NSData in UserDefaults e utilizzarlo al prossimo avvio dell'applicazione? –

+0

Il didCompleteWithError verrà chiamato non appena si riavvia l'app non quando si forza la chiusura. Quindi puoi semplicemente assegnare i dati a una proprietà e controllare se questi dati esistono quando vuoi avviare il download. –

+0

dal processo di debug vedo che raggiungo questo metodo prima che l'applicazione venga effettivamente uccisa e non quando è stata avviata. –

1

Penso che dopo l'applicazione ha fatto forzare lo spegnimento si dovrebbe ricominciare tutto da capo (.

Se l'utente termina la vostra applicazione, il sistema cancella qualsiasi attività in sospeso.

e

Quando tutte le attività associate a una sessione di fondo sono completi, il sistema rilancia un'applicazione terminato (supponendo che la proprietà sessionSendsLaunchEvents è stata impostata su YES e che l'utente non ha la forza chiudere l'applicazione)

https://developer.apple.com/library/ios/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

+0

vedere la domanda aggiornata. –

0

-> uso URLSession sfondo sessioni di download non si ferma affatto .... non c'è bisogno di codificare in modo esplicito per riprendere il download o qualcosa del genere ..

https://developer.apple.com/reference/foundation/urlsession

controlla la sessione in background in questo link ... se non sei in grado di ottenere lo still ... commentami e vorrei aiutare in dettaglio.

Problemi correlati