2015-08-09 26 views
9

Zaimplementowałem NSURLSession do pobierania dość dużych plików z naszych serwerów. Dopóki pracuję na pierwszym planie lub w tle i wracam do aplikacji, transakcje działają i kończą się.Jak wznowić proces pobierania NSURLSession po ponownym uruchomieniu aplikacji i ponownym uruchomieniu aplikacji:

Ale jeśli I wymusić-zamknięcie aplikacji za pomocą ekranu wielozadaniowości i ponownie otworzyć aplikację ponownie. proces pobierania nie jest uzyskiwanie skończył chociaż jak zrozumiałem z docs, trzeba, tutaj co państwo docs:

Jeśli aplikacja iOS zostanie rozwiązana przez system i odnowiona, aplikacja może używać tego samego identyfikatora utwórz nowy obiekt konfiguracyjny i sesję i pobierz status transferów, które były w toku w momencie zakończenia. To zachowanie dotyczy tylko normalnego zakończenia aplikacji przez system. Jeśli użytkownik zakończy aplikację z ekranu wielozadaniowości, system anuluje wszystkie transfery w tle sesji. Ponadto system nie uruchamia ponownie automatycznie aplikacji, które zostały wymuszone przez użytkownika. Użytkownik musi jawnie ponownie uruchomić aplikację, zanim rozpocznie się ponowne wysyłanie.

Czyli gdybym wznowienie aplikację transakcję przed siły rzucić należy ponownie uruchomić, czy oni są? Czy istnieje dodatkowa operacja, którą muszę zatwierdzić, aby to zadziałało?

UPDATE: Natknąłem się na tym projekcie: https://github.com/Heikowi/HWIFileDownload#force-quit

które stwierdza:

Wymuś

Po aplikacja została zabita przez użytkownika, pliki do pobrania nie kontynuować w tle. W przypadku iOS 7 (i późniejszych) wznowienie danych jest przekazywane z powrotem.

Oznacza to, że istnieje sposób na otrzymywanie danych wznowienia, nawet jeśli aplikacja została zabita przez użytkownika w tle. Tylko projekt jest napisany w Objective-C i nie mogę zrozumieć, co robią, aby to osiągnąć. Każda pomoc będzie doceniona. Z góry dzięki.

Odpowiedz

17

Po siłowym qu to:

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

Metoda delegata zostanie wywołana po ponownym uruchomieniu aplikacji. Jeśli zadanie pobierania można wznowić, obiekt błędu będzie zawierał dane wznowienia:

[error.userInfo objectForKey:NSURLSessionDownloadTaskResumeData].

Stosując te dane można wznowić proces pobierania tworząc NSURLSessionDownloadTask z:

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

Więcej informacji o tym można znaleźć w Life Cycle of a URL Session with Custom Delegates, krok 13.

+0

Właściwie to nie jest za późno, Dziękuję za odpowiedź. Czy mógłbyś wyjaśnić, w jaki sposób należy użyć tych otrzymanych danych, aby wznowić pobieranie. Tak jak powiedziałeś, otrzymuję go w metodzie didCompleteWithError. Czy powinienem natychmiast rozpocząć inne zadanie przy użyciu metody downloadTaskWithResumeData z metody didCompleteWithError, czy też muszę zapisać obiekt resumeData NSData w UserDefaults i użyć go przy następnym uruchomieniu aplikacji? –

+0

Program didCompleteWithError zostanie wywołany zaraz po ponownym uruchomieniu aplikacji, a nie po wymuszeniu zamknięcia. Możesz więc przypisać dane do właściwości i sprawdzić, czy te dane istnieją, gdy chcesz rozpocząć pobieranie. –

+0

z procesu debugowania Widzę, że docieram do tej metody, zanim aplikacja zostanie faktycznie zabita, a nie kiedy się zaczęła. –

1

Myślę, że po aplikacji nie siły rzucić należy zacząć wszystko od nowa (.

Jeśli użytkownik kończy swoją aplikację, system anuluje żadnych oczekujących zadań.

i

Podczas wszystkich zadań związanych z sesją tle są kompletne, system wznawia się zakończony aplikację (przy założeniu, że nieruchomość sessionSendsLaunchEvents została ustawiona na YES i że użytkownik nie zmuszać zamknięcie aplikacji)

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

+0

patrz zaktualizowane pytanie. –

0

-> wykorzystanie URLSession tła Sessions pobrania w ogóle się nie kończy .... nie musisz jawnie kodować, aby wznowić pobieranie lub coś ..

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

sprawdź sesję w tle w tym łączu ... jeśli nie możesz uzyskać spokoju ... skomentuj mnie, a ja pomogę w szczegółach.

Powiązane problemy