webentwicklung-frage-antwort-db.com.de

Ermitteln, ob Anwendung: didReceiveRemoteNotification: fetchCompletionHandler: wurde durch Tippen auf eine Benachrichtigung im Benachrichtigungscenter aufgerufen

application: didReceiveRemoteNotification: fetchCompletionHandler:

unterscheidet sich von

application: didReceiveRemoteNotification:

Wie? aus den docs:

Im Gegensatz zur Anwendung: didReceiveRemoteNotification: Methode, die .__ ist. Nur aufgerufen, wenn Ihre App ausgeführt wird, ruft das System diese Methode auf unabhängig vom Zustand Ihrer App. Wenn Ihre App angehalten ist oder nicht Wenn das System ausgeführt wird, wird das System aktiviert oder gestartet, und die App wird in die .__ eingefügt. Hintergrundstatus vor dem Aufruf der Methode. Wenn der Benutzer .__ öffnet. Wenn Ihre App von der vom System angezeigten Benachrichtigung aus aufgerufen wird, ruft das System diese Methode auf erneut, damit Sie wissen, welche Benachrichtigung der Benutzer ausgewählt hat.

Mein Problem ist: Ich möchte wissen, ob die Methode vom Benutzer aufgerufen wurde, indem er im Benachrichtigungscenter auf eine vom System angezeigte Benachrichtigung tippte oder von einer stillen Push-Benachrichtigung, die das Gerät aktiviert. Meines Erachtens gibt es derzeit keine offensichtliche Unterscheidung.

- (BOOL)application: didFinishLaunchingWithOptions:

Das Verfolgen von launchOptions in der obigen Methode ist keine Lösung, da es nur dann aufgerufen wird, wenn die App im Hintergrund angehalten wird oder nicht ausgeführt wird. Wenn es im Hintergrund läuft, wird es nicht aufgerufen.

38
Devfly

Die Apple-Dokumente sind etwas verwirrend

application: didReceiveRemoteNotification: fetchCompletionHandler:  

wird verwendet, wenn Ihre Anwendung den Remote-Benachrichtigungs-Hintergrundmodus unterstützt (z. B. BackgroundFetch). 

application: didReceiveRemoteNotification:  

wird aufgerufen, wenn das Betriebssystem eine RemoteNotification empfängt und die App ausgeführt wird (im Hintergrund/angehalten oder im Vordergrund).
Sie können den UIApplicationState überprüfen, um zu sehen, ob die App vom Benutzer in den Vordergrund gebracht wurde (Tippen auf Benachrichtigung) oder bereits ausgeführt wurde, wenn eine Benachrichtigung eingeht.

- (void) application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
      UIApplicationState state = [application applicationState];
        // user tapped notification while app was in background
    if (state == UIApplicationStateInactive || state == UIApplicationStateBackground) {
         // go to screen relevant to Notification content
    } else {
         // App is in UIApplicationStateActive (running in foreground)
         // perhaps show an UIAlertView
    }
}
41
race_carr

Sie können die UIApplication von applicationState überprüfen, um stille Anrufe von Anrufen zu unterscheiden, die mit der vom Benutzer aktiv verwendeten Anwendung gemacht wurden:

typedef enum : NSInteger {
   UIApplicationStateActive,
   UIApplicationStateInactive,
   UIApplicationStateBackground
} UIApplicationState;

Oder lassen Sie Ihr eigenes Flag für den applicationDidEnterBackground: der delegate gesetzt.

18
Rivera

Der Anwendungsstatus ist nicht zuverlässig, da, wenn Sie das Kontrollcenter oder das Benachrichtigungscenter von Apple über Ihrer App geöffnet haben, die Anwendung didReceiveRemoteNotification: fetchCompletionHandler: aufgerufen wird und der Anwendungsstatus inaktiv ist.

Ich habe das gleiche Problem und versuche, auf einen Klick auf die Benachrichtigung zu reagieren, während sich die App im Hintergrund befindet, und es scheint keine verlässliche Möglichkeit zu geben, dies nur zu erkennen. 

9
overunder

Wenn die application: didReceiveRemoteNotification:fetchCompletionHandler:-Methode als App-Status bezeichnet wird, ist UIApplicationStateInactive, wenn der Benutzer auf "alert" tippt (in diesem Fall möchten Sie eine Benutzeroberfläche vorbereiten) und UIApplicationStateBackground, wenn die App im Hintergrund geweckt wird (in diesem Fall laden Sie nur Daten).

3

Ich bin nicht sicher, ob ich Ihre Frage verstehe.

Möchten Sie zwischen einem stillen Push-Benachrichtigungs-Hintergrundabruf und einer lauten Push-Benachrichtigung unterscheiden? Sie können einfach überprüfen, ob das Push-Benachrichtigungswörterbuch den Schlüssel "content-available" enthält: [[userInfo objectForKey:@"aps"] objectForKey:@"content-available"] Wenn dies der Fall ist, sollte es sich um einen stillen Push handeln. Wenn nicht, war es ein normaler Push.

Möchten Sie wissen, ob diese Hintergrundabrufmethode aufgerufen wird, wenn die Anwendung eine Benachrichtigung erhält und angehalten oder nicht ausgeführt wird? Wenn ja, können Sie Folgendes tun:

  • Laden Sie LumberJacks herunter und importieren Sie sie in Ihre App. Lesen Sie die Anweisungen durch und erfahren Sie, wie Sie es so einrichten, dass Sie Protokolle auf der Festplatte speichern können.
  • Fügen Sie dies in eine beliebige Methode ein, um zu sehen, ob/wann diese Methode aufgerufen wird:

    • DDLogDebug(@"%@ - %@",NSStringFromSelector(_cmd),NSStringFromClass([self class]));

    Dadurch werden die Klasse und die Methode in die Protokolldatei geschrieben.

  • Untersuchen Sie die Protokolldatei, nachdem Sie eine Push-Benachrichtigung an Ihre App gesendet haben, die das Abrufen im Hintergrund ermöglicht, und überprüfen Sie anhand Ihrer Protokolldatei, ob eine der Methoden aufgerufen wird.

Wenn Sie Ihre App für den Hintergrundabruf korrekt eingerichtet haben, wird die Methode application: didReceiveRemoteNotification: fetchCompletionHandler: Auch dann aufgerufen, wenn die App im Hintergrund läuft oder nicht, wenn Sie eine Push-Benachrichtigung erhalten (Silent Push oder nicht).

2
navkast

Im Falle von Swift

func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject]) {

    let state : UIApplicationState = application.applicationState
    if (state == .Inactive || state == .Background) {
        // go to screen relevant to Notification content
    } else {
        // App is in UIApplicationStateActive (running in foreground)
    }
}
2
Ghulam Rasool

Für Swift: Analysieren Sie in application(_:didFinishLaunchingWithOptions:) die Anwendungsoptionen. Wenn sie vorhanden sind, wissen Sie, dass die App durch Antippen gestartet wurde.

  if let remoteNotif = launchOptions?[UIApplicationLaunchOptionsKey.remoteNotification] as? [String: Any] {
        print("Remote notfi is \(remoteNotif)")
        if let notification = remoteNotif["aps"] as? [AnyHashable : Any] {
        /// - parse notification
      }
  }

Ansonsten können Sie mit dem Tippen umgehen und wissen, dass die App geöffnet ist/background/inactiveapplication(_:didReceiveRemoteNotification:fetchCompletionHandler:)

0
Alex Mason

In iOS 10.0 und höher können Sie die Methode verwenden

- (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler;

erkennen, wenn der Benutzer eine vom System angezeigte Warnung im NotificationCenter antippt.

Wenn Sie die obige Methode implementieren

  • - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler; wird bei Erhalt einer Benachrichtigung only genannt
  • - (void)userNotificationCenter:(UNUserNotificationCenter *)center didReceiveNotificationResponse:(UNNotificationResponse *)response withCompletionHandler:(void (^)(void))completionHandler; wird aufgerufen, wenn der Benutzer die Benachrichtigung antippt
0
Giorgio