7

Próbuję wykonywać połączenia w tle, takie jak POST, GET, aby być bardziej precyzyjnym w metodzie didReceiveRemoteNotification, ponieważ zaczynają działać, gdy nadejdzie powiadomienie push. Mój problem polega na tym, że wszystkie żądania Alamofire nigdy nie są wywoływane w trybie tła, dopóki nie otworzę aplikacji. Mam terazŻądanie w tle nie wykonuje Alamofire Swift

Próbowałem otworzyć sesję, ale nie sprawi, że żądanie działa.

To jest to, co chcę, aby uruchomić w tle (telefon w tle)

Alamofire.Manager(configuration: configuration).request(.GET, url, parameters: nil) 
         .responseJSON { (_, _, JSON, _) in 
          //println(JSON) 
           println(JSON) 
       REST OF THE CODE 

Ale to nie będzie działać, nawet jeśli dodać kod poniżej nich wnioskować, że działa, ale zwrot wniosku lub nawet prośba nie została złożona.

Odpowiedz

14

Podczas gdy metoda mówi "konfiguracja tła", oznacza to, że sesja sieciowa jest skonfigurowana jako to allow for interruptions and continuation wysyłania/pobierania. Zamiast tego należy wydłużyć czas wykonywania aplikacji, aby działał przez jakiś czas, nawet w tle.

Jest to specjalnie zaprojektowany do tego celu beginBackgroundTaskWithExpirationHandler:. Kiedy go użyjesz, dostaniesz jeszcze kilka minut na wykonanie wszystkiego, czego potrzebujesz (po tym limicie twoja aplikacja zostanie rozwiązana bez względu na to, teraz twoja aplikacja zostanie natychmiast usunięta).

można napisać następujące metody:

func beginBackgroundTask() -> UIBackgroundTaskIdentifier { 
    return UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler({}) 
} 

func endBackgroundTask(taskID: UIBackgroundTaskIdentifier) { 
    UIApplication.sharedApplication().endBackgroundTask(taskID) 
} 

Gdy chcesz go używać, wystarczy prosty rozpocząć/zakończyć zadanie podczas uruchamiania/zakończeniu połączenia pobierania:

// Start task 
let task = self.beginBackgroundTask() 

// Do whatever you need, like download of the images 
self.someBackgroundTask() 

... 

// End task once everything you need to do is done 
self.endBackgroundTask(task) 

nadzieję, że to pomaga !

Edit 1:

Jeśli problem jest to, że metoda pobierania nigdy nie nazywa, to znaczy, że nie wysyłasz odpowiednie dane powiadomień ładowności:

Dla powiadomienia Push wyzwolić pobrania operacja, ładunek z powiadomieniem o numerze musi zawierać dostępny klucz z wartością ustawioną na 1. Gdy ten klucz jest obecny, system budzi aplikację w tle (lub uruchamia ją w tle) i wywołuje aplikację delegataAplikacja: didReceiveRemoteNotification: fetchCompletionHandler: metoda. Twoja implementacja tej metody powinna pobrać odpowiednią treść i zintegrować ją z aplikacją. https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

+0

Witam, dzięki za odpowiedź, ale mój problem jest skojarzyć sesje Alamofire lub co muszę uruchomić wnioski powodować te funkcje, że piszesz uruchomić kod, ale jest kogo żądania nigdy nie wrócić, a może nawet nazwać dopóki nie otworzę aplikacji. Jeszcze raz dziękuję. –

+0

Zobacz moją zaktualizowaną odpowiedź - jeśli problem polega na tym, że nie otrzymujesz w ogóle wywołania metody, powyższe powinno pomóc :) –

+0

Wiedziałem o zawartości dostępnej, którą już mam, ponieważ jest to ciche powiadomienie, na przykład jeśli otrzymam powiadomienie push, aktywacja didReceiveRemoteNotification, a następnie chcę złożyć żądanie z alamofire, moim głównym problemem jest to, że kod w didReceiveRemoteNotification działa, ale połączenie lub żądanie nie powodują niczego, gdy iphone jest nieaktywny/tła (nie otwarte), a następnie, gdy Otwieram aplikację, którą uruchamia, tak jak powinna. –

Powiązane problemy