2015-03-04 10 views
7

Mam dziwny problem z NSURLSession na delegate method didFinishDownloadingToURL.NSURLSession didFinishDownloadingToURL tymczasowo pobrany plik nie został znaleziony

Pierwszą rzeczą, jaką robię, to sprawdzić, czy istnieje plik tymczasowy Pobrano:

- (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 
    } 
    ... 
} 

To działa normalnie, gdy aplikacja jest w planie i pobierania wykończeń. Ale gdy aplikacja działa w tle i jest wymuszona przez system operacyjny, zwraca false.

Czy ktoś ma pojęcie o tym, co może się wydarzyć? Wiem, że istnieje limit czasu na wykonanie tej delegowanej metody, gdy aplikacja jest wybudzana przez system operacyjny, ponieważ nie ma sensu, aby plik tymczasowy tam nie istniał. Nie mogę nawet skopiować go do innej lokalizacji ... Czy to ma sens być ze względu na rozmiar pliku? Pobierany jest plik o wielkości +1 -130 MB.

Dzięki.

+0

Mam ten sam problem. Zgłoszony raport błędu http://openradar.appspot.com/radar?id=4943165404479488 – Biga

+0

Spróbuj mimo to otworzyć adres URL. Wywołanie fileExistsAtPath może cię okłamać z powodu jakiegoś dziwactwa związanego z piaskownicą aplikacji. – dgatwood

+0

mają podobny problem. lokalizacja wskazuje na plik, który nie istnieje. Nie zdarza się to często. Trochę denerwujące. Zastanawiam się, czy ten błąd powoduje zły stan baterii, ponieważ plik ten zostanie pobrany ponownie. A jeśli lokalizacja jest znowu zła, to ściągnij ponownie ... itd. –

Odpowiedz

1

Rozwiązałem ten sam problem, instalując aplikację po odinstalowaniu aplikacji. Wygląda na to, że NSURLSession pozostawia szczątki w systemie, gdy wymuszone wyłączenie ma miejsce podczas pracy w sieci.

+0

Uruchamiam test jednostek na projekcie ramowym (nie aplikacji) na symulatorze, więc nie wiesz, jak wypróbować swoje rozwiązanie. ** ** unieważnia ** sesję w obu 'setUp()' i 'tearDown()' ... –

+0

Otrzymuję to jako lokalizację /var/mobile/Library/Caches/com.apple.nsurlsessiond/Downloads /com.xxxxxxx/CFNetwo rkDownload_uFBpqp.tm p Widzę to samo zachowanie w ios 10.3.2. Jedynym sposobem, aby to naprawić, jest ponowne uruchomienie urządzenia. –

-2

Z Apple Docs:

(location jest ..) „Plik URL do pliku tymczasowego, ponieważ plik jest tymczasowa, należy albo otworzyć plik do odczytu lub przenieść go do stałej lokalizacji w. katalogu kontenera piaskownicy aplikacji przed zwróceniem tej metody delegowania

Jeśli otworzysz plik do odczytu, powinieneś wykonać rzeczywisty odczyt w innym wątku, aby uniknąć blokowania kolejki delegatów. "

+1

W podanym przykładzie plik jest dostępny "przed powrotem z tej metody delegatów" - problem polega na tym, że go tam nie ma. Dokumenty Apple są dokładne w normalnych okolicznościach, ale nie w przypadku opisanym powyżej. – Joseph

Powiązane problemy