2013-10-15 1 views
8

Ich verwende parse.com als meine APNs-Provider für einen Test-App Ich baue. Ich habe bestätigt, dass Push-Benachrichtigungen funktionieren, da ich in der Lage war, Warnungen zu erhalten, wenn die App im Vordergrund ist. Außerdem habe ich den remote-notification Wert für die UIBackgroundModes Schlüssel angegeben in meinem plist.Apple-Push-Benachrichtigung in Hintergrund Ausgabe

In meiner app, bin zu will ich einen Benutzer aktuelle Standortdaten zurück zu meiner App-spezifischen parse.com Datenbank zu senden, wenn eine Push-Benachrichtigung empfangen wird. Ich interessiere mich nicht wirklich für die Benachrichtigungs-Nutzlast selbst, da die Benachrichtigung nur ein Mittel ist, um ein kleines Stück Information zu erhalten. Die App sammelt ständig Daten im Hintergrund und speichert sie in einem persistenten NSDictionary.

Ich habe den Standort zu senden Code in der application:didReceiveRemoteNotification: Methode setzen. Wenn meine App im Vordergrund ist, wenn ich eine Benachrichtigung erhalte, wird die Methode aufgerufen. Wenn sich meine App im Hintergrund befindet, wird die Methode nicht aufgerufen.

  • Mache ich etwas falsch?
  • Ist es überhaupt möglich, eine API-Anforderung in application:didReceiveRemoteNotification: auszuführen, wenn die App im Hintergrund ist und der Benutzer mit der Anmeldung nicht interagierte **

EDIT: Das Problem, auch wenn weiterhin besteht I Verwenden Sie application:didReceiveRemoteNotification:fetchCompletionHandler:.

Hinweis: Meine NSDictionary voller Standortdaten ist nicht leer. Außerdem versuche ich nicht, irgendwelche UI-Manipulationen im Hintergrund durchzuführen - ich versuche nur, eine API-Anfrage auszuführen.

Antwort

15

Folgendes überprüfen:

  • Mitteilung Nutzlast umfasst "content-verfügbar"
{"alert":"", 
"badge":"0", 
"content-available":"1", 
"sound":""} 
+0

Das hat funktioniert! Ich hatte das 'content-available'-Flag im AppDelegate aktiviert, aber ich habe dieses Flag in meinen JSON-APNs nicht gedrückt. Danke, Alex! Das behebt das Problem. – ArtSabintsev

+0

Hah, seltsam. Es hat nur einmal funktioniert. Werde hineinschauen und zu dir zurückgehen – ArtSabintsev

+0

Nevermind, hat es funktioniert! Es war nur eine Verzögerung beim Empfangen der Daten von Parse. – ArtSabintsev

0

Die documentation for UIApplicationDelegate -application:didReceiveRemoteNotification ist ziemlich klar, auf dieser Methode:

Wenn die App nicht läuft, wenn eine Push-Benachrichtigung eintrifft, wobei das Verfahren startet die App und stellt die entsprechenden Informationen im Wörterbuch Startoptionen. Die App ruft diese Methode nicht auf, um die Push-Benachrichtigung zu behandeln. Stattdessen Ihre Implementierung der Anwendung: willFinishLaunchingWithOptions: oder Anwendung: didFinishLaunchingWithOptions: Methode muss den Push-Benachrichtigung Nutzdaten erhalten und entsprechend zu reagieren.

Sie benötigen Benachrichtigungen bei beiden Methoden zu handhaben zu können, reagieren, wenn die App im Hintergrund und Vordergrund.

+0

Ich glaube, ich verstand 'nicht als vollständig heruntergefahren, nicht' inactive' oder 'background' Modus running'. Ich probiere es kurz aus und markiere deine Antwort richtig, wenn ich es funktioniere. – ArtSabintsev

+0

Es funktioniert immer noch nicht. Ich versuche nun, die Standortdaten von "application: didFinishLaunchingWithOptions:" und "application: didReceiveRemoteNotification:" zu senden. Wenn sich die Anwendung im Hintergrund befindet (z. B. habe ich die Home-Taste gedrückt), werden keine Daten gesendet, sofern ich nicht mit der Benachrichtigung interagiere. Wenn ich mit der Benachrichtigung interagiere, indem ich darauf klicke, wird die 'application: didReceiveRemoteNotification:' Methode eingegeben. Was mache ich falsch? Verstehe ich grundsätzlich falsch, wie Hintergrundbenachrichtigungen funktionieren sollten? – ArtSabintsev

+0

Ich denke, meine App befindet sich tatsächlich im Status "suspended" und nicht im Status "background". Ich denke, das könnte das Problem verursachen. – ArtSabintsev

0

Sie können versuchen, diese zu verwenden, anstatt

application:didReceiveRemoteNotification 

Methode, da Sie Ihre Push im Hintergrundmodus holen müssen, damit diese Arbeiten würde, wenn die App im Hintergrund-Modus.Möglicherweise müssen Sie jedoch benutzerdefinierte Benachrichtigungen oder UIAlertView hinzufügen, wenn sich die App im Vordergrund befindet, um Ihre Nachricht anzuzeigen. Hoffe es hilft und es ist nicht zu spät.

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler 
{ 

    NSLog(@"Remote Notification Received: %@", userInfo); 

    UILocalNotification *notification = [[UILocalNotification alloc] init]; 
    notification.alertBody = @"message to be displayed"; 
    notification.applicationIconBadgeNumber = 1; 


    [[UIApplication sharedApplication] presentLocalNotificationNow:notification]; 
    completionHandler(UIBackgroundFetchResultNewData); 

} 
0

Alex L's Antwort fast für mich gearbeitet.

So stellen Sie sicher, dass der Wert von content-available 1 (Anzahl), nicht eine Zeichenfolge "1":

{ 
    "alert":"", 
    "content-available":1, 
    "sound":"" 
} 

badge Parameter ist optional.

(Mit Parse Server für APNs)