webentwicklung-frage-antwort-db.com.de

application: didReceiveRemoteNotification: fetchCompletionHandler nicht aufgerufen

Anscheinend wird die Funktion application:didReceiveRemoteNotification:fetchCompletionHandler nicht aufgerufen, wenn die App zwangsweise beendet wurde. Ich hatte den Eindruck, dass die Funktion unabhängig von dem Status der App aufgerufen wird. Es scheint jedoch, dass sie nur aufgerufen wird, wenn die App bereits im Hintergrund ausgeführt wird. Gibt es eine Möglichkeit, eine App im Hintergrund zu aktivieren, wenn sie nicht bereits mit dem neuen Hintergrundmodus für iOS 7-Remote-Benachrichtigung ausgeführt wird?

22
Wes Cossick

application:didReceiveRemoteNotification:fetchCompletionHandler: wird auch dann aufgerufen, wenn die App angehalten ist, überhaupt nicht ausgeführt wird, im Hintergrund läuft oder aktiv ist. Erwähnenswert ist auch, dass die Methode nur iOS 7 ist. Hier ist die Apple-Dokumentation .

HOWEVER Wenn die App zwangsweise geschlossen wurde (d. H. Durch Töten mit dem App-Umschalter), wird die App nicht gestartet. (siehe SO Antwort ) EDIT: Ich habe dies unter iOS 7.1 erneut überprüft, um zu sehen, ob sie das Problem behoben haben, aber es bleibt immer noch der Fall, dass die App wird manuell beendet, die App wird NICHT geweckt und application:didReceiveRemoteNotification:fetchCompletionHandler: wird nicht aufgerufen

Beim Empfang des Push wird die App nur "wenn nötig" aufgeweckt, um die application:didReceiveRemoteNotification:fetchCompletionHandler:-Methode aufzurufen (dh Sie müssen das Kennzeichen "content-available") innerhalb der Push-Benachrichtigungs-Payload setzen. Siehe SO answer ). Die Methode wird erneut genannt, wenn der Benutzer die App durch Tippen auf die Benachrichtigung öffnet.

BEARBEITEN: Ich habe dies nicht für iOS 8 geprüft. Hat noch jemand?

50
nvrtd frst
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary
*)launchOptions {

    //Remote Notification Info
    NSDictionary * remoteNotifiInfo = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey];

    //Accept Push notification when app is not open
    if (remoteNotifiInfo) {
       [self application:application didReceiveRemoteNotification: remoteNotifiInfo];
    }

    return YES;
}
23
kid

Wenn Ihre App erzwungen wurde, wird diese Methode nicht aufgerufen. Stattdessen wird wie üblich (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions aufgerufen.

Wenn die App durch Tippen auf "Öffnen" in einem Benachrichtigungs-Popup geöffnet wurde, befindet sich die Benachrichtigung in launchOptions.

Holen Sie sich das Push-Benachrichtigungswörterbuch wie folgt:

NSDictionary * pushNotificationUserInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];

if (pushNotificationUserInfo)
{
  // call your handler here
}
3
scrrr

Die App sollte auch gestartet werden, wenn sie nicht läuft. Die Apple-Dokumentation sagt:

Wenn dieser Wert vorhanden ist und eine Push-Benachrichtigung auf einem Gerät eingeht, sendet das System die Benachrichtigung an Ihre App ( Starten Sie sie bei Bedarf ), und geben Sie ihr ein paar Momente, um die Benachrichtigung zu verarbeiten, bevor sie dem Benutzer etwas anzeigt . (iOS App-Programmierhandbuch)

Wenn eine Push-Benachrichtigung eintrifft, zeigt das System dem Benutzer die Benachrichtigung an und startet die App im Hintergrund (falls erforderlich) , damit sie diese Methode aufrufen kann . (UIApplicationDelegate-Protokollreferenz)

Im Gegensatz zur application: didReceiveRemoteNotification: Methode, die nur aufgerufen wird, wenn Wenn Ihre App ausgeführt wird, ruft das System diese Methode unabhängig vom Status Ihrer App auf. Ob Ihre App ist ausgesetzt oder läuft nicht , das System wird aufgeweckt oder startet Ihre App und legt Vor dem Aufruf der Methode in den Hintergrundstatus . (UIApplicationDelegate-Protokollreferenz)

Beim Testen mit "content-available": 1 wird die App jedoch nie gestartet, wenn sie nicht ausgeführt wird. Wenn die App ausgesetzt ist, funktioniert sie.

Hast du eine Lösung gefunden, Wes?

3
Emiel

Wie von Apple dokumentiert, funktioniert die neue Multitasking-API (Abrufen und Fernbenachrichtigung) nur, wenn sich die App im Status suspend/background/foreground befindet.

  • Im Zustand background/foreground wird dann application:didReceiveRemoteNotification:fetchCompletionHandler ausgelöst.

  • Im Zustand Suspended wird dann -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions ausgelöst.

  • Im Not Running - Zustand (Ihrem Fall) wird application:didReceiveRemoteNotification:fetchCompletionHandler niemals ausgelöst. 

Weitere Informationen zu den App-Status finden Sie in der Apple-Dokumentation .

2
Nandha

Zu wessen Besorgnis in Swift 2.0 habe ich mein Problem gelöst, so ist dies für den Hintergrund

if let remoteNotification = launchOptions?[UIApplicationLaunchOptionsRemoteNotificationKey] as? NSDictionary {

    pushNotificationAction(remoteNotification as [NSObject : AnyObject])
}
1
Luai Kalkatawi

Wenn Sie das Herunterfahren einer App erzwingen, wird sie im Hintergrund (auf keine Weise) bis zum nächsten Start aktiviert. Wenn Sie das Beenden einer App erzwingen, sagen Sie dem Betriebssystem, dass diese App überhaupt nicht ausgeführt werden soll, selbst wenn ein Hintergrundereignis sie normalerweise geweckt hätte.

Dies sollte während des Testens beachtet werden, da Sie die Anwendung zwangsweise beenden müssen, um zu prüfen, ob sie über die Push-Benachrichtigung gestartet wird, wenn die Anwendung nicht ausgeführt wird. Tatsächlich ist Ihre Anwendung von Force Quit der Grund dafür, dass warum nicht gestartet wird.

1
Dave Addey

Ich habe vor kurzem das gleiche Problem gefunden und fand heraus, dass Apple ihre Dokumentation aktualisiert hat und sagt:

Das System startet Ihre App jedoch nicht automatisch, wenn der Benutzer die Anwendung erzwungen hat. In diesem Fall muss der Benutzer Ihre App neu starten oder das Gerät neu starten, bevor das System versucht, die App automatisch erneut zu starten.

Anwendung (_: didReceiveRemoteNotification: fetchCompletionHandler :)

Ich denke, es gibt keine Möglichkeit, etwas zu tun, wenn die App mit Gewalt beendet wird?

0
HunTer DRF