Po przeczytaniu dokumentacji Apple o pobieraniu w tle z nowym apletem iOS7 (NSURLSession), jestem nieco rozczarowany. Byłem pewien, że Apple zarządzał pauza/wznowienie nad dostępności sieci w tle (lub zapewnić odpowiednią opcję, aby to zrobić), ale nie ...Pobieranie tła NSURLSession - wznowienie przez awarię sieci
Więc czytanie dokumentacji, to co mamy:
When any task completes, the NSURLSession object calls the delegate’s URLSession:task:didCompleteWithError: method with either an error object, or nil if the task completed successfully. If the task is a resumable download task, the NSError object’s userInfo dictionary contains a value for the NSURLSessionDownloadTaskResumeData key. Your app should use reachability APIs to determine when to retry, and should then call downloadTaskWithResumeData: or downloadTaskWithResumeData:completionHandler: to create a new download task to continue that download. Go to step 3 (creating and resuming task objects).
dotychczas rozumiem rozwiązanie, ale moje pytanie brzmi: Jaka architektura jest najlepszy do obsługi utratę sieci i wznowić pobieranie w tle?
Po mojej stronie używam osiągalności i za każdym razem, gdy sieć jest dostępna, wznawiam wszystkie zadania (odwołuję się do NSArray podczas tworzenia) i zawieszam je, gdy sieć zostanie utracona. Działa to dobrze na pierwszym planie, ale na tle Potrzebuję pomocy w następujących punktach:
Jeśli moja aplikacja nie ma połączenia w planie, jeśli pójdę do tła bez łączności wszystkie moje zadania pozostaje zawieszony i nie będzie wrócił, jeśli sieć jest dostępna ...
Utrata sieci w tle, zatrzymanie wszystkich pobrań/zadań. Scenariusz:
- W planie, ja rozpocząć pobieranie moich zadań
- idę do tła i po 10s przełączyć się na „tryb aireplan”
- Wszystkie moje zadania dostaje błąd. Tak więc w metodzie URLSession: task: didCompleteWithError: Wznawiam je za pomocą downloadTaskWithResumeData lub jeśli nie mogę (ponieważ niektóre nie mają wystarczającej ilości danych do wznowienia), tworzę nowe zadanie bez wznawiania go (z wyjątkiem sytuacji, gdy sieć powraca w tym czasie).
- Następnie kładę wifi się
- Ponieważ jestem nadal w tle nie może wywołać „resume”, gdy sieć jest z powrotem bez konieczności uruchamiania aplikacji ...
Jak mogę rozwiązać te punkty ? Czy coś przeoczyłem?
Dzielę się rozczarowaniem. Wspomniałeś, że czekasz na odpowiedź od Apple na ten temat. Czy słyszałeś od nich? Jaka jest rozdzielczość? – gavdotnet
Mam dużo wymiany z Apple, ale nie było produktywne, zalecenie jest użycie flagi dyskrecjonalnej, która powinna zająć się tymi przypadkami (ale bez gwarancji wyników w czasie). Ten tryb nie był moim celem, ale nie skupiałem się na tym, ale mój test się nie powiódł. Jeśli przetestowałeś tę część, która nadal byłaby interesująca dla uzyskania informacji. – Gros