2015-08-09 10 views
9

Ich habe NSURLSession zum Herunterladen ziemlich großer Dateien von unseren Servern implementiert. Jetzt, solange ich im Vordergrund oder Hintergrund arbeite und zurück zur App gehe, funktionieren die Transaktionen und werden beendet.Wie man NSURLSession Download-Prozess nach der App Force-Quit und App-Relaunch fortsetzen:

Aber wenn ich zwingen-beenden die App mit dem Multitasking-Bildschirm und öffnen Sie die App erneut. der Download-Prozess ist nicht abgeschlossen zu werden, obwohl ich von der Dokumentation verstanden, es soll, hier, was der docs Zustand:

Wenn ein iOS-App vom System beendet und neu gestartet, die App die gleichen Bezeichner verwenden kann, um Erstellen Sie ein neues Konfigurationsobjekt und eine neue Sitzung, und rufen Sie den Status der zum Zeitpunkt der Beendigung ausgeführten Übertragungen ab. Dieses Verhalten gilt nur für die normale Beendigung der App durch das System. Wenn der Benutzer die App vom Multitasking-Bildschirm aus beendet, bricht das System alle Hintergrundübertragungen der Sitzung ab. Darüber hinaus startet das System Apps, die vom Benutzer beendet wurden, nicht automatisch neu. Der Benutzer muss die App explizit erneut starten, bevor die Übertragungen erneut beginnen können..

Bedeutung, wenn ich die App die Transaktion vor dem Kraft-quit Relaunch wieder gestartet sollte, oder sind sie? Gibt es eine zusätzliche Operation, die ich ausführen muss, damit dies funktioniert?

UPDATE: ich an diesem Projekt gestolpert: https://github.com/Heikowi/HWIFileDownload#force-quit

Das heißt:

Kraft Quit

Nachdem die App vom Nutzer getötet wurde, Downloads nicht weiter im Hintergrund. Auf iOS 7 (und später) werden die Fortsetzungsdaten zurückgegeben.

Das bedeutet, es gibt eine Möglichkeit zum Empfangen von Fortsetzungsdaten, auch wenn die Anwendung vom Benutzer im Hintergrund beendet wurde. Nur das Projekt ist in Objective-C geschrieben und ich kann nicht verstehen, was sie tun, um dies zu erreichen. Jede Hilfe wäre willkommen. Vielen Dank im Voraus.

Antwort

17

Nach einer Kraft-qu it:

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

Delegate-Methode wird aufgerufen, wenn die App neu gestartet wird. Wenn der Download-Vorgang fortgesetzt werden kann, enthält das Fehlerobjekt die Fortsetzungsdaten:

[error.userInfo objectForKey:NSURLSessionDownloadTaskResumeData].

diese Daten können Sie in den Download-Prozess fortsetzen, indem Sie einen NSURLSessionDownloadTask mit dem Erstellen: in Life Cycle of a URL Session with Custom Delegates, Schritt 13.

+0

Eigentlich ist es noch nicht zu spät, Danke für deine Antwort. Könnten Sie bitte erläutern, wie ich diese empfangenen Daten verwenden soll, um den Download fortzusetzen? Wie Sie sagten, erhalte ich es auf didCompleteWithError-Methode. Soll ich sofort einen anderen Task starten, der downloadTaskWithResumeData von der didCompleteWithError-Methode verwendet, oder muss ich das resumeData NSData-Objekt in den UserDefaults speichern und es das nächste Mal verwenden, wenn die Anwendung ausgeführt wird? –

+0

Der didCompleteWithError wird aufgerufen, sobald Sie die App nicht neu starten, wenn Sie das Beenden erzwingen. Sie können die Daten also einfach einer Eigenschaft zuweisen und überprüfen, ob diese Daten vorhanden sind, wenn Sie den Download starten möchten. –

+0

aus dem Debugging-Prozess sehe ich, dass ich diese Methode erreichen, bevor die Anwendung tatsächlich getötet wird und nicht, wenn es gestartet wird. –

1

Ich denke, dass nach der Anwendung tat Kraft-quit sollten Sie alle wieder von vorn beginnen (.

Wenn der Benutzer Ihre Anwendung beendet, das System alle anstehenden Aufgaben aufhebt.

und

Wenn alle der mit einer Hintergrundsitzung damit verbundenen Aufgaben abgeschlossen sind, relauncht das System eine terminierte App (unter der Annahme, dass die sessionSendsLaunchEvents Eigenschaft auf JA gesetzt wurde und , dass der Benutzer nicht zwingen, beenden Sie die App)

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

+0

siehe aktualisierte Frage. –

0

finden

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

Mehr Infos über das -> Verwendung URLSession Hintergrund Sessions herunterladen gar nicht aufhören .... Sie müssen nicht explizit codieren, um den Download oder etwas wieder aufnehmen ..

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

Überprüfen Sie für Hintergrundsitzung in diesem Link ... wenn Sie nicht in der Lage sind, immer noch ... kommentieren Sie mich und ich würde im Detail helfen.

Verwandte Themen