2015-02-06 36 views
5

Używam [NSURLSessionConfiguration defaultSessionConfiguration] do konfiguracji sesji URL.NSURLSession z nieprawidłowymi danymi wznowienia

Zatrzymuję zadanie, wywołując cancelByProducingResumeData:, aby utworzyć dane wznowienia i zapisać je na dysku. Gdy chcę ponownie uruchomić zadanie, zadzwonię pod numer downloadTaskWithResumeData:. Działa dobrze, dopóki nie uruchomię ponownie aplikacji.

Zabijam aplikację po wstrzymaniu zadania. Następnie ponownie uruchomię aplikację i zadzwonię pod numer downloadTaskWithResumeData. Zauważyłem, że dane wznowienia były nieprawidłowe.

I analizować dane wznowienia język NSDictionary i uzyskać NSURLSessionResumeInfoLocalPath, który jest

"/private/var/mobile/Containers/Data/Application/5DD071C3-9D5E-4D76-9F74-57B6C92445CB/tmp/CFNetworkDownload_IUI6kg.tmp". Próbuję uzyskać dostęp do tego pliku, ale nie istnieje.

Moje pytanie brzmi: jak kontynuować zadanie pobierania za pomocą danych wznowienia po ponownym uruchomieniu aplikacji.

Dzięki.

+0

Dzięki @Mark, dobre pytanie - upvoted. Czy możesz mi powiedzieć, jak zapisujesz dane na dysk, jeśli użytkownik opuści aplikację? – NSPratik

Odpowiedz

1

Za każdym razem, gdy ponownie uruchomisz swoją aplikację, wszystko pod tmp zostanie wyczyszczone. Wystąpił ten sam problem, mimo że próbowałem skopiować cały plik * .tmp i wkleić go za każdym razem, gdy aplikacja uruchomi się ponownie, wystąpi błąd

Moja rada jest taka, że ​​sprawdzisz, czy plik * .tmp jest dostępny, pobierz ponownie od początku, jeśli nie,

+0

@LittleBobyTables, bardzo dziękuję za edytowanie moich odpowiedzi, aby było o wiele ładniej. Mark, kończę przy użyciu [ASIHTTPRequest] (https://github.com/pokeb/asi-http-request), aby osiągnąć to, co Ty i ja mieliśmy na myśli. –

+0

Dziękuję za radę. Czy mogę odbudować resumeData i zastąpić ścieżkę pliku * .tmp? – Mark

1

Napotkałem ten problem. Zauważyłem, że ścieżka do piaskownicy zmieni się po ponownym uruchomieniu aplikacji w iOS8. Ale resumeData rejestruje starą ścieżkę do piaskownicy, która pozwala zadanie pobierania nie może znaleźć resumeData. Więc zaktualizować ścieżkę sandbox nagrany w piaskownicy przez klucz „NSURLSessionResumeInfoLocalPath”, to działa:

NSDictionary *dic = [NSDictionary dictionaryWithContentsOfFile:resumeDataPath]; 
NSString *resumeDataFileName = [dic[@"NSURLSessionResumeInfoLocalPath"] lastPathComponent]; 
NSString *newTempPath = NSTemporaryDirectory(); 
NSString *newResumeDataPath = [newTempPath stringByAppendingPathComponent:resumeDataFileName]; 
[dic setValue:newResumeDataPath forKey:@"NSURLSessionResumeInfoLocalPath"]; 
[dic writeToFile:resumeDataPath atomically:YES];