2016-05-19 12 views
3

Ich verwende Remote-Benachrichtigung mit Inhalt verfügbar: True-Flag, um die App im Hintergrund auf Silent-Push-Benachrichtigung zu starten und Updates von Remote-API zu verarbeiten oder abzurufen. Der Code wird ordnungsgemäß ausgeführt, wenn sich die App im Vordergrund befindet, oder im angehaltenen Zustand nach dem vorherigen Ausführen.Hintergrundaufgabe auf Remote-Benachrichtigung nach einer kurzen Zeit unterbrochen

Während Tests im Hintergrund, wenn die Anwendung vom System basierend auf eingehenden Silent Push-Benachrichtigungen gestartet wird, wird der Code nur teilweise verarbeitet und die App wird nach ca. 150 ms schnell angehalten. Ich erwartete, dass die App 30 Sekunden Zeit hat, um die eingehende Benachrichtigung und ihre Nutzlast zu verarbeiten. Muss ich die App-Funktionen anpassen oder eine Hintergrundaufgabe anfordern, wenn ich mehr Zeit für die Verarbeitung und/oder das Abrufen neuer Daten benötige?

Bereitstellungsziel iOS 8, Testen unter iOS 9. Xcode 7.3.1, Swift 2.2.1.

Capabilities: Hintergrund Modi, Modi: Remote-Benachrichtigungen

Aktiviert

AppDelegate

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) { 

    if let userInfo = userInfo as? [String: AnyObject] { 

     // Processing of the payload is done in separate Operation class (using Operations framework) 
     // The completion handler is called on the end of the processing/fetching in that operation 
     // But in case of launching the app in the background it never reaches the call of the completion handler 

     let parseNotificationOperation = ParseNotificationOperation(userInfo: userInfo, fetchCompletionHandler: completionHandler) 
     MainService.shared.enqueueApnsOperation(parseNotificationOperation) 
    } 
} 

Antwort

4

Martin Koles,

Sie können von expirationHandlers machen längere Zeit für die Ausführung im Hintergrund zu erhalten. Obwohl die Zeit, die iOS Ihrer App zugewiesen wird, von verschiedenen Faktoren abhängt, die wir nicht kontrollieren können, haben wir festgestellt, dass es im Allgemeinen bis zu 3 Minuten dauert, bis unsere App im Hintergrund ausgeführt wird.

Hier ist, wie man erreichen kann es :)

In erklären Sie AppDelegate,

UIBackgroundTaskIdentifier backgroundTask; 

und wenn Sie APNS innerhalb didReceiveRemoteNotification schreiben diese empfangen,

if (!backgroundTask || backgroundTask == UIBackgroundTaskInvalid) { 
     backgroundTask = [[UIApplication sharedApplication] beginBackgroundTaskWithExpirationHandler:^{ 
       //do all clean up job here gets called few seconds before expiration 
       [[UIApplication sharedApplication] endBackgroundTask:backgroundTask]; 
       backgroundTask = UIBackgroundTaskInvalid; 
     }]; 
    } 

EDIT

Nur rea Lized Sie dies hier Verwendung von schnellen machen ist Code für Sie in schnellen :)

Deklarieren Sie eine Variable in Background AppDelegate,

var backgroundTask : UIBackgroundTaskIdentifier = UIBackgroundTaskInvalid 

und verwenden Sie es in Ihrem didRecieveRemoteNotification wie unten genannt,

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) { 

    if let userInfo = userInfo as? [String: AnyObject] { 
     let parseNotificationOperation = ParseNotificationOperation(userInfo: userInfo, fetchCompletionHandler: completionHandler) 
     MainService.shared.enqueueApnsOperation(parseNotificationOperation) 

     if (backgroundTask == UIBackgroundTaskInvalid) { 
      backgroundTask = UIApplication.sharedApplication().beginBackgroundTaskWithExpirationHandler {() -> Void in 
       self.endTask() 
      } 
     } 
    } 
} 

schreiben schließlich eine Methode, um Ihren Ablauf Handler ungültig zu machen, wenn Sie mit ihm

func endTask(){ 
    //do all your clean up here, this is called few seconds before the task expires. 
    UIApplication.sharedApplication().endBackgroundTask(backgroundTask) 
    backgroundTask = UIBackgroundTaskInvalid; 
} 
:) fertig sind

Das ist es :) Happy Coding Kumpel :)

+0

Funktioniert gut, danke !! –

+0

Immer willkommen Kumpel :) –