5

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

+0

Czy próbowałeś innej konfiguracji sesji? Nie w tle – iWheelBuy

Odpowiedz

0

Zachowanie opisujesz brzmi jak błąd w iOS, ale kilka rzeczy chciałbym spróbować to:

  • Spróbuj ustawić uznaniowe na TAK. Ogranicza to szybkość relaunchów w tle.
  • Upewnij się, że przypadkiem nie tworzysz nowej sesji w tle o tym samym identyfikatorze, co istniejąca (z wyjątkiem sytuacji, gdy właśnie uruchomiłeś ponownie obsługę zdarzeń i tylko po wywołaniu procedury obsługi zakończenia) podczas jednego uruchomienia.
  • Upewnij się, że nie tworzysz podklas żadnej z zaangażowanych klas - szczególnie NSURL lub NSURLRequest.
  • Spróbuj ustawić wartość parametru UseUtendedBackgroundIdleMode na wartość YES.
  • Spróbuj dodać aktywne pobieranie tła w UIBackgroundModes.

Żadne z tych dwóch ostatnich nie powinno pomóc, a jeśli tak, zgłoś błąd.

Ponadto, IIRC, Twoja aplikacja może zostać ukarana, jeśli zostanie uruchomiona ponownie zbyt wiele razy w tle, więc jeśli robisz kupkę krótkich żądań w zadaniu tła, prawdopodobnie nie powinieneś. A jeśli Twoja aplikacja ulegnie awarii, gdy uruchomi się ponownie w tle, może to być bardzo złe.

Na koniec upewnij się, że przechodzisz do ekranu głównego. Jeśli wymusisz zamknięcie aplikacji (dwukrotne dotknięcie, przeciągnięcie), żądania w tle zostaną zakończone. I to jest oczekiwane zachowanie.

Jeśli żadna z tych wskazówek nie pomoże, prosimy o zgłoszenie błędu na stronie bugreporter.apple.com, ponieważ to, co opisujesz, nie jest oczekiwanym zachowaniem.