Firebase onMessageReceived wird nicht aufgerufen, wenn sich die Anwendung im Hintergrund befindet

8

Ich verwende Firebase für unseren Messaging-Dienst in unserer Android App. Ich habe Firebase ziemlich gründlich recherchiert und ich verstehe, dass ob die App, wenn sie im Vordergrund läuft oder jetzt wird, den Typ der Daten ändern wird, die in den onMessageReceived-Methode .

Was ich versuche zu erreichen, besteht darin, die eingehenden Daten von der Remotemessage zu analysieren und je nach benutzerdefiniertem Tag etwas anderes zu tun. IE, wenn die Datenzuordnung ein Feld mit dem Namen "My_Custom_Tag" enthält, möchte ich die Standard-Firebase-Nachricht, die angezeigt wird, vollständig überschreiben und eine benutzerdefinierte Nachricht schreiben.

Das Problem ist, wenn die App im Hintergrund läuft, wird jeder Code, den ich in onMessageReceived nie eingegeben habe, ausgelöst. Es funktioniert problemlos, wenn die App im Vordergrund ausgeführt wird, erkennt jedoch nichts, wenn die App im Hintergrund ausgeführt wird.

Hier ist ein Beispielcode:

%Vor%

Meine Frage ist, wie gehe ich vor, um MyFirebaseMessagingService zu bearbeiten, damit ich die eingehenden Daten prüfen, Tag-Informationen bestimmen und entscheiden kann, sie an fire base weiterzuleiten, damit sie die Standardbehandlung verwenden oder sie nicht an Firebase weiterleiten kann und schreibe meine eigene benutzerdefinierte Display-Benachrichtigung alle während meine App im Hintergrund läuft?

Danke allen!

PS, eine Chance hat der Firebase-Dungeon-Meister Frank van Puffelen einen Gedanken?

    
Silmarilos 28.10.2016, 18:37
quelle

4 Antworten

18

Entfernen Sie die Benachrichtigungsnutzdaten aus Ihren FCM-Nachrichten, damit die Datennutzinformationen an die onMessageReceived-Methode übermittelt werden.

Lesen Sie dies und dies sorgfältig.

Wenn sich Ihre App im Hintergrund befindet, werden die Datennutzdaten nur dann an die onMessageReceived-Methode übermittelt, wenn keine Benachrichtigungsnutzlast vorhanden ist . ( Markieren Sie die Wörter )

Wenn beide Nutzlasten vorhanden sind, behandelt das System automatisch den Benachrichtigungsteil (Systemtray) und Ihre App erhält die Datennutzlast in den Extras der Absicht der Launcher-Aktivität (nachdem der Benutzer auf die Benachrichtigung geklickt hat).

Um beide Plattformen erfolgreich bedienen zu können, Android und iOS, müssen Sie möglicherweise verschiedene FCM-Nachrichten entsprechend dem Betriebssystem des Clients senden.

    
kws 28.10.2016, 19:22
quelle
3

Guyz Hören Sie gut zu, ich habe viele Links durchgelesen und schließlich eine Lösung gefunden.

  1. Wenn app im Hintergrund onMessageReceived-Methode ist, sollte
  2. aufgerufen werden

Diese Nutzlast wird funktionieren ...

%Vor%

Diese Nutzlast wird nicht funktionieren ...

%Vor%

Wenn die Ladung "notification" enthält, ruft onMessageReceived nicht

auf     
sssvrock 16.08.2017 11:59
quelle
2

Antworten Sie in diesem Post von Koot könnte Ihre Lösung sein. Er sagte "Ich hatte das gleiche Problem. Es ist einfacher, die 'Datennachricht' anstelle der 'Benachrichtigung' zu verwenden. Die Datennachricht lädt immer die Klasse onMessageReceived."

meine Lösung ist nach seinem Rat

%Vor%     
Ko Nyan 04.01.2017 18:36
quelle
1

Ziemlich sicher, Sie kennen bereits das Verhalten in Android, dass bei Verwendung von notification und data payload das Android-System die Inhalte von notification abfängt und die data -Nutzlast in der Absicht enthalten ist, wenn sie angezapft wird .

AFAIK, das ist der einzige Weg, dass es geht (wie von @ArthurThompson erwähnt hier ) und wenn Sie wirklich Möchten Sie sicherstellen, dass onMessageReceived() immer aufgerufen wird, müssen Sie nur data payload verwenden (wie von @DiegoGiorgini hier )  Aber ich habe mich umgesehen, vielleicht gibt es einen anderen Weg.

Ich habe es nicht selbst ausprobiert, aber haben Sie überprüft, welche Benachrichtigungen in der Statusleiste angezeigt werden Wenn Ihre Benachrichtigung vorhanden ist ( nicht ganz sicher, ob Sie tatsächlich feststellen können, welche eine Benachrichtigung für Ihre App ist, obwohl ), rufen Sie die Methoden auf, die Sie normalerweise in onMessageReceived() aufrufen.

Sie können auch feststellen, ob die Geräte, an die Sie die Nachricht senden, ein Android-Gerät auf Ihrem App-Server sind und dann nur eine data Nutzlast senden.

    
AL. 28.10.2016 20:28
quelle