7

Ich versuche, im Hintergrund wie POST, GET zu machen, genauer in der didReceiveRemoteNotification-Methode, weil sie beginnen zu arbeiten, wie eine Push-Benachrichtigung ankommen. Mein Problem ist, dass alle Alamofire.request nie im Hintergrundmodus aufgerufen werden, bis ich die App öffne. Ich habe jetztHintergrund Anfrage nicht ausführen Alamofire Swift

Ich habe versucht, eine Sitzung zu öffnen, aber es wird nicht die Anfrage funktionieren.

Dies ist, was ich im Hintergrund (Mobiltelefon im Hintergrund) ausführen wollen

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

Aber es wird nicht funktionieren, selbst wenn ich Code unter diese Anfrage erfordern es funktioniert, aber die Rückkehr des Antrags oder sogar Die Anfrage wird nicht gestellt.

Antwort

14

Während Methode sagt "Hintergrundkonfiguration", was es tatsächlich bedeutet, dass die Netzwerksitzung to allow for interruptions and continuation von Upload/Download konfiguriert ist. Was Sie stattdessen tun müssen, ist die Ausführungszeit der Anwendung zu verlängern, so dass es für einige Zeit auch im Hintergrund funktioniert.

Es gibt beginBackgroundTaskWithExpirationHandler:, die speziell dafür entwickelt wurde. Wenn Sie es verwenden, erhalten Sie wenige Minuten mehr, um alles auszuführen, was Sie benötigen (nach diesem Limit wird Ihre Anwendung beendet, egal was passiert, jetzt wird Ihre Anwendung sofort beendet).

Sie können folgende Methoden schreiben:

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

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

Wenn Sie es verwenden möchten, müssen Sie nur einfach beginnen/die Aufgabe beenden, wenn Start/den Download Anruf beendet:

// 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) 

Hoffe, es hilft !

Edit 1:

Wenn das Problem ist, dass Ihre Download-Methode nie aufgerufen wird, dann bedeutet es, Sie werden nicht korrekte Daten in Benachrichtigung Nutzlast Senden:

Für eine Push-Benachrichtigung einen Download auszulösen die Nutzlast muss den Content-Verfügbarkeit Schlüssel mit seinem Wert auf 1 enthalten. Wenn dieser Schlüssel vorhanden ist, weckt das System die App in den Hintergrund (oder startet es in den Hintergrund) und ruft die App Delegaten Anwendung: didReceiveRemoteNotification: fetchCompletionHandler: Methode. Ihre Implementierung dieser Methode sollte die relevanten Inhalte herunterladen und in Ihre App integrieren. https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html

+0

Hallo, danke für die Antwort, aber mein Problem ist ein Alamofire Sitzungen assoziieren oder was ich brauche die Anfragen verursachen diese Funktionen ausführen, die Sie den Code ausführen zu schreiben, aber ist die Anfrage whos nie wieder oder vielleicht sogar anrufen bis ich die App öffne. Danke nochmal. –

+0

Siehe meine aktualisierte Antwort - wenn das Problem ist, dass Sie Ihre Methode überhaupt nicht aufgerufen werden, sollte oben helfen :) –

+0

Ich wusste über den Inhalt-verfügbar Ich habe es bereits Ursache ist eine stille Benachrichtigung, also zum Beispiel, wenn ich ein Push-Benachrichtigung, die didReceiveRemoteNotification aktivieren und dann möchte ich eine Anfrage mit Alamofire, mein Hauptproblem ist, dass der Code in didReceiveRemoteNotification funktioniert, aber der Anruf oder die Anfrage nichts tun, wenn das iPhone inaktiv ist/Hintergrund (nicht geöffnet) dann wann Ich öffne die App, die läuft wie es sein soll. –