tworzę sesję tła przy użyciu tego kodu ...NSURLSessionDownloadTask stragany w tle, nieskory do odzyskania w planie
let configuration = URLSessionConfiguration.background(withIdentifier: UUID().uuidString)
configuration.sessionSendsLaunchEvents = true
configuration.isDiscretionary = false
self.session = Foundation.URLSession(configuration: configuration, delegate: self, delegateQueue: nil)
... i zadania pobrać za pomocą tego kodu:
let downloadTask = self.session.downloadTask(with: request as URLRequest)
downloadTask.resume()
My obiekty żądania wyglądają następująco:
let request = NSMutableURLRequest(url: someURL)
request.httpMethod = "POST"
request.addValue("application/json", forHTTPHeaderField: "Content-Type")
do {
try request.httpBody = JSONSerialization.data(withJSONObject: someDictionary, options: JSONSerialization.WritingOptions())
} catch let error as NSError {
// logging calls
}
Zasobami będącymi w trakcie pobierania są pliki ~ 20MB zip.
Mogę uruchamiać cztery jednoczesne pobrania na pierwszym planie bez problemu. Wszystkie oczekiwane metody delegatów są wywoływane, a transfery zakończone z normalną szybkością.
Problem, który widzę, polega na tym, że jeśli rozpocznę pobieranie na pierwszym planie, a następnie naciskam przycisk strony głównej, pliki do pobrania czasami będą zwlekane. Próbowałem utrzymać urządzenie w stanie czuwania, a sieć obracała się przez godzinę, a transfery nadal nie zostały zakończone w tle. Dodatkowo, po przywróceniu aplikacji na pierwszy plan, transfery nie rozpoczynają się od razu. Jeśli pozwolę aplikacji siedzieć na pierwszym planie przez około 4 minuty, obudzą się i zaczną znowu pracować. Powracają do wartości procentowej ukończonej w momencie, gdy aplikacja trafi w tło i będą przesyłane z normalną prędkością aż do zakończenia. W żadnym momencie nie ma błędów, a transfer jest ostatecznie udany. Po prostu "znika" w tle i bardzo powoli powraca, gdy aplikacja wraca na pierwszy plan.
Testuję na telefonie iPhone 6 z systemem iOS 10. Nie mam połączenia z Xcode ani zewnętrznego źródła zasilania i uruchamiam aplikację na zimno. Mogę odtworzyć problem zarówno w sieci Wi-Fi, jak i połączeń komórkowych. Usunąłem aplikację i wielokrotnie ją ponownie wczytałem.
Mam problem ze śledzeniem tego, ponieważ około 20% czasu działa poprawnie. Nie znalazłem żadnego konkretnego zbioru zmiennych, które spowodowałyby ciągłą pracę lub niepowodzenie. Wydaje się, że dzieje się to częściej, gdy pojawia się wiele pobrań i w tej sytuacji wszystkie pobrane pliki mają działanie opisane powyżej.
Wszelkie wskazówki będą mile widziane!
Matt
Czy próbowałeś innej konfiguracji sesji? Nie w tle – iWheelBuy