Ich arbeite mit Firebase und teste das Senden von Benachrichtigungen von meinem Server an meine App, während sich die App im Hintergrund befindet. Die Benachrichtigung wurde erfolgreich gesendet, sie wird sogar im Benachrichtigungscenter des Geräts angezeigt. Wenn die Benachrichtigung jedoch angezeigt wird oder wenn ich darauf klicke, wird die onMessageReceived-Methode in meinem FCMessagingService niemals aufgerufen.
Als ich dies testete, während meine App im Vordergrund stand, wurde die Methode onMessageReceived aufgerufen und alles funktionierte einwandfrei. Das Problem tritt auf, wenn die App im Hintergrund ausgeführt wird.
Ist das beabsichtigtes Verhalten oder gibt es eine Möglichkeit, dies zu beheben?
Hier ist mein FBMessagingService:
import android.util.Log;
import com.google.firebase.messaging.FirebaseMessagingService;
import com.google.firebase.messaging.RemoteMessage;
public class FBMessagingService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
Log.i("PVL", "MESSAGE RECEIVED!!");
if (remoteMessage.getNotification().getBody() != null) {
Log.i("PVL", "RECEIVED MESSAGE: " + remoteMessage.getNotification().getBody());
} else {
Log.i("PVL", "RECEIVED MESSAGE: " + remoteMessage.getData().get("message"));
}
}
}
android
firebase
firebase-cloud-messaging
Cyogenos
quelle
quelle
Antworten:
Dies funktioniert wie beabsichtigt. Benachrichtigungsnachrichten werden nur dann an Ihren onMessageReceived-Rückruf gesendet, wenn sich Ihre App im Vordergrund befindet. Wenn sich Ihre App im Hintergrund befindet oder geschlossen ist, wird im Benachrichtigungscenter eine Benachrichtigungsnachricht angezeigt, und alle Daten aus dieser Nachricht werden an die Absicht übergeben , die gestartet wird, wenn der Benutzer auf die Benachrichtigung tippt.
Sie können eine click_action angeben, um die Absicht anzugeben, die gestartet werden soll, wenn der Benutzer auf die Benachrichtigung tippt. Die Hauptaktivität wird verwendet, wenn keine click_action angegeben ist.
Wenn die Absicht gestartet wird, können Sie die verwenden
um einen Satz abzurufen, der alle Daten enthält, die zusammen mit der Benachrichtigungsnachricht gesendet wurden.
Weitere Informationen zur Benachrichtigung finden Sie in den Dokumenten .
quelle
click_action
festzulegen, wenn ich die Firebase-Benachrichtigungskonsole verwende?Entfernen Sie das
notification
Feld vollständig aus Ihrer Serveranforderung. Nurdata
senden und bearbeiten,onMessageReceived()
sonst wird IhronMessageReceived()
App nicht ausgelöst, wenn sich die App im Hintergrund befindet oder beendet wurde.Vergessen Sie nicht, das
"priority": "high"
Feld in Ihre Benachrichtigungsanfrage aufzunehmen. Laut Dokumentation: Datennachrichten werden mit normaler Priorität gesendet, sodass sie nicht sofort eintreffen. es könnte auch das Problem sein.Folgendes sende ich vom Server
So können Sie Ihre Daten auf
onMessageReceived(RemoteMessage message)
diese Weise empfangen ... Nehmen wir an, ich muss einen Ausweis erhaltenquelle
Diese Methode handleIntent () wurde abgeschrieben, sodass die Bearbeitung einer Benachrichtigung wie folgt erfolgen kann:
Vordergrundstatus: Durch Klicken auf die Benachrichtigung wird die Aktivität der ausstehenden Absicht aufgerufen, die Sie bereitstellen, während Sie eine Benachrichtigung programmgesteuert erstellen, wie sie im Allgemeinen mit der Datennutzlast der Benachrichtigung erstellt wird.
Hintergrund / getöteter Status - Hier erstellt das System selbst eine Benachrichtigung basierend auf der Benachrichtigungsnutzlast. Wenn Sie auf diese Benachrichtigung klicken, gelangen Sie zur Startaktivität der Anwendung, in der Sie problemlos Absichtsdaten in einer Ihrer Lebenszyklusmethoden abrufen können.
quelle
OnMessageReceived
in diesem Fall keine Verwendung dafür !?Ich hatte das gleiche Problem. Es ist einfacher, die 'Datennachricht' anstelle der 'Benachrichtigung' zu verwenden. Die Datennachricht lädt immer die Klasse onMessageReceived.
In dieser Klasse können Sie mit dem Benachrichtigungsbuilder Ihre eigene Benachrichtigung erstellen.
Beispiel:
quelle
Hier finden Sie klarere Konzepte zur Firebase-Nachricht. Ich habe es von ihrem Support-Team gefunden.
Firebase hat drei Nachrichtentypen :
Benachrichtigungsnachrichten : Die Benachrichtigungsnachricht funktioniert im Hintergrund oder im Vordergrund. Wenn sich die App im Hintergrund befindet, werden Benachrichtigungsnachrichten an die Taskleiste gesendet. Wenn sich die App im Vordergrund befindet, werden Nachrichten von
onMessageReceived()
oderdidReceiveRemoteNotification
Rückrufe verarbeitet. Dies sind im Wesentlichen sogenannte Display-Nachrichten.Datennachrichten : Auf der Android-Plattform können Datennachrichten im Hintergrund und im Vordergrund ausgeführt werden. Die Datennachricht wird von onMessageReceived () verarbeitet. Ein plattformspezifischer Hinweis wäre hier: Unter Android kann die Datennutzlast in der Absicht abgerufen werden, die zum Starten Ihrer Aktivität verwendet wird. Um dies zu erläutern,
"click_action":"launch_Activity_1"
können Sie diese AbsichtgetIntent()
nur von abrufenActivity_1
.Nachrichten mit Benachrichtigungs- und Datennutzdaten : Im Hintergrund empfangen Apps die Benachrichtigungsnutzdaten in der Benachrichtigungsleiste und verarbeiten die Datennutzdaten nur, wenn der Benutzer auf die Benachrichtigung tippt. Im Vordergrund empfängt Ihre App ein Nachrichtenobjekt mit beiden verfügbaren Nutzdaten. Zweitens wird der Parameter click_action häufig in Benachrichtigungsnutzdaten und nicht in Datennutzdaten verwendet. Bei Verwendung innerhalb der Datennutzlast wird dieser Parameter als benutzerdefiniertes Schlüssel-Wert-Paar behandelt. Daher müssen Sie eine benutzerdefinierte Logik implementieren, damit er wie beabsichtigt funktioniert.
Außerdem empfehle ich Ihnen, die onMessageReceived-Methode (siehe Datennachricht) zu verwenden, um das Datenpaket zu extrahieren. Nach Ihrer Logik habe ich das Bundle-Objekt überprüft und den erwarteten Dateninhalt nicht gefunden. Hier ist ein Verweis auf einen ähnlichen Fall, der mehr Klarheit bieten könnte.
Auf der Serverseite sollte die Firebase-Benachrichtigung das folgende Format haben :
Die Serverseite sollte "Benachrichtigung" senden. -Objekt . Es fehlt ein "Benachrichtigungs" -Objekt in meinem,
TargetActivity
das keine Nachricht verwendet hatgetIntent()
.Das richtige Nachrichtenformat ist unten angegeben:
Hier finden Sie klarere Konzepte zur Firebase-Nachricht. Ich habe es von ihrem Support-Team gefunden.
Für weitere Informationen besuchen Sie meinen diesen Thread und diesen Thread
quelle
Gemäß der Dokumentation zu Firebase Cloud Messaging. Wenn die Aktivität im Vordergrund steht, wird onMessageReceived aufgerufen. Wenn die Aktivität im Hintergrund oder geschlossen ist, wird im Benachrichtigungscenter eine Benachrichtigungsnachricht für die Aktivität des App-Starters angezeigt. Sie können Ihre benutzerdefinierte Aktivität per Klick auf Benachrichtigung aufrufen, wenn sich Ihre App im Hintergrund befindet, indem Sie die Rest-Service-API für Firebase-Nachrichten wie folgt aufrufen:
URL- https://fcm.googleapis.com/fcm/send
Methodentyp - POST
Körper / Nutzlast:
Und damit können Sie in Ihrer App den folgenden Code in Ihre aufzurufende Aktivität einfügen:
quelle
onMessageReceived
?Die Methode onMessageReceived (RemoteMessage remoteMessage) wird basierend auf den folgenden Fällen aufgerufen.
onMessageReceived (RemoteMessage remoteMessage) wird aufgerufen und zeigt LargeIcon und BigPicture in der Benachrichtigungsleiste an. Wir können den Inhalt von beiden lesen Benachrichtigung und Datenblock
onMessageReceived (RemoteMessage remoteMessage) wird nicht aufgerufen. Die Taskleiste empfängt die Nachricht und liest Text und Titel aus dem Benachrichtigungsblock und zeigt die Standardnachricht und den Standardtitel in der Benachrichtigungsleiste an.
In diesem Fall entfernen Sie Benachrichtigungsblöcke aus json
Lösung zum Aufrufen von onMessageReceived ()
onMessageReceived (RemoteMessage remoteMessage) wird aufgerufen und zeigt LargeIcon und BigPicture in der Benachrichtigungsleiste an. Wir können den Inhalt von beiden lesen Benachrichtigung und Datenblock
Wenn onMessageReceived (RemoteMessage remoteMessage) aufgerufen wird, empfängt die Taskleiste die Nachricht aufgrund von nicht Benachrichtigungsschlüssel nicht in der Antwort enthalten ist. Zeigt LargeIcon und BigPicture in der Benachrichtigungsleiste an
Code
Referenzlink:
https://firebase.google.com/docs/cloud-messaging/android/receive
quelle
Ich habe das gleiche Problem. Wenn die App im Vordergrund steht, wird mein Hintergrunddienst ausgelöst, bei dem ich meine Datenbank basierend auf dem Benachrichtigungstyp aktualisieren kann. Die App tritt jedoch in den Hintergrund - der Standardbenachrichtigungsdienst sorgt dafür, dass die Benachrichtigung dem Benutzer angezeigt wird.
Hier ist meine Lösung, um die App im Hintergrund zu identifizieren und Ihren Hintergrunddienst auszulösen:
In der manifest.xml
Getestet diese Lösung in der neuesten Android 8.0-Version. Vielen Dank
quelle
WakefulBroadcastReceiver
ist seit API-Level 26.1.0 veraltet.Wenn sich die App im Hintergrundmodus befindet oder inaktiv (getötet) ist und Sie auf Benachrichtigung klicken , sollten Sie in LaunchScreen nach der Nutzlast suchen (in meinem Fall ist der Startbildschirm MainActivity.java).
Suchen Sie in MainActivity.java auf onCreate nach Extras :
quelle
Überschreiben Sie die
handleIntent
Methode derFirebaseMessageService
Arbeiten für mich.hier der Code in C # (Xamarin)
und das ist der Code in Java
quelle
Standardmäßig wird die Startaktivität in Ihrer App gestartet, wenn sich Ihre App im Hintergrund befindet und Sie auf die Benachrichtigung klicken. Wenn Ihre Benachrichtigung einen Datenteil enthält, können Sie diese in derselben Aktivität wie folgt ausführen:
quelle
Wenn sich die App im Hintergrund befindet Fire-Base standardmäßig Handhabungsbenachrichtigung Wenn wir jedoch unsere benutzerdefinierte Benachrichtigung wünschen, müssen wir unsere Serverseite ändern, die für das Senden unserer benutzerdefinierten Daten verantwortlich ist (Datennutzlast).
Entfernen Sie die Benachrichtigungsnutzdaten vollständig von Ihrer Serveranforderung. Senden Sie nur Daten und verarbeiten Sie sie in onMessageReceived (). Andernfalls wird Ihre onMessageReceived nicht ausgelöst, wenn sich die App im Hintergrund befindet oder beendet wird.
Jetzt sieht Ihr serverseitiges Codeformat so aus:
HINWEIS : Siehe diese Zeile im obigen Code
"Text": "John Doe hat einen Kontakt in der Gruppe" Kontaktaustausch "in Datennutzdaten freigegeben. Sie sollten den Parameter" Text "anstelle der Parameter" Text "oder" Nachricht "für die Nachrichtenbeschreibung oder was auch immer verwenden möchte Text verwenden.
onMessageReceived ()
quelle
Rufen Sie dies einfach in der onCreate-Methode Ihrer MainActivity auf:
quelle
nach der lösung von t3h exi möchte ich den sauberen code hier posten. Fügen Sie es einfach in MyFirebaseMessagingService ein und alles funktioniert einwandfrei, wenn sich die App im Hintergrundmodus befindet. Sie müssen mindestens com.google.firebase kompilieren: firebase-messaging: 10.2.1
quelle
Versuche dies:
quelle
Der Punkt, der hervorgehoben werden sollte, ist, dass Sie nur Datennachricht - Datenschlüssel verwenden müssen Datennachricht ( , um den onMessageReceived-Handler auch dann aufzurufen, wenn sich die App im Hintergrund befindet. Sie sollten keinen anderen Benachrichtigungsnachrichtenschlüssel in Ihrer Nutzlast haben, da sonst der Handler nicht ausgelöst wird, wenn sich die App im Hintergrund befindet.
Es wird hier erwähnt (aber in der FCM-Dokumentation nicht so hervorgehoben):
https://firebase.google.com/docs/cloud-messaging/concept-options#notifications_and_data_messages
quelle
Das Backend, mit dem ich arbeite, verwendet Benachrichtigungsnachrichten und keine Datennachrichten. Nachdem ich alle Antworten gelesen hatte, versuchte ich, die Extras aus dem Bündel der Absichten abzurufen, die für die gestartete Aktivität gelten. Unabhängig davon, von welchen Schlüsseln ich abrufen wollte
getIntent().getExtras();
, war der Wert immer null.Endlich habe ich jedoch eine Möglichkeit gefunden, Daten mithilfe von Benachrichtigungsnachrichten zu senden und aus der Absicht abzurufen.
Der Schlüssel hier ist das Hinzufügen der Datennutzdaten zur Benachrichtigungsnachricht.
Beispiel:
Nachdem Sie dies getan haben, können Sie Ihre Informationen folgendermaßen abrufen:
intent.getExtras().getString("title")
wird seinmessage_title
und
intent.getExtras().getString("message")
wird seinmessage_body
Referenz
quelle
Wenn Ihr Problem mit der Anzeige von Big Image zusammenhängt, dh wenn Sie eine Push-Benachrichtigung mit einem Bild von der Firebase-Konsole senden und das Bild nur angezeigt wird, wenn die App im Vordergrund steht. Die Lösung für dieses Problem besteht darin, eine Push-Nachricht nur mit Datenfeld zu senden. Etwas wie das:
quelle
Wenn eine Nachricht empfangen wird und sich Ihre App im Hintergrund befindet, wird die Benachrichtigung an die Extras der Hauptaktivität gesendet.
Sie können den zusätzlichen Wert in der Funktion oncreate () oder onresume () der Hauptaktivität überprüfen.
Sie können nach Feldern wie Daten, Tabelle usw. suchen (das in der Benachrichtigung angegebene).
Zum Beispiel habe ich mit Daten als Schlüssel gesendet
quelle
Ich hatte dieses Problem (App möchte beim Klicken auf eine Benachrichtigung nicht geöffnet werden, wenn sich die App im Hintergrund befindet oder geschlossen ist), und das Problem war
click_action
im Benachrichtigungstext ungültig . Versuchen Sie, es zu entfernen oder in etwas Gültiges zu ändern.quelle
Ich hatte das gleiche Problem und beschäftigte mich noch mehr damit. Wenn sich die App im Hintergrund befindet, wird eine Benachrichtigungsnachricht an die Taskleiste gesendet, ABER eine Datennachricht wird an
onMessageReceived()
Siehe https://firebase.google.com/docs/cloud-messaging/downstream#monitor-token-generation_3
und gesendet https://github.com/firebase/quickstart-android/blob/master/messaging/app/src/main/java/com/google/firebase/quickstart/fcm/MyFirebaseMessagingService.java
Um sicherzustellen, dass die von Ihnen gesendete Nachricht in den Dokumenten lautet: " Verwenden Sie Ihren App-Server und die FCM-Server-API: Legen Sie nur den Datenschlüssel fest. Kann entweder reduzierbar oder nicht reduzierbar sein. "
Siehe https://firebase.google.com/ docs / cloud-messaging / concept-options # notifications_and_data_messages
quelle
Es gibt zwei Arten von Nachrichten: Benachrichtigungsnachrichten und Datennachrichten. Wenn Sie nur eine Datennachricht senden, ist dies ohne Benachrichtigungsobjekt in Ihrer Nachrichtenzeichenfolge. Es wird aufgerufen, wenn Ihre App im Hintergrund ist.
quelle
Überprüfen Sie die Antwort von @ Mahesh Kavathiya. Für meinen Fall hat der Servercode nur so:
Sie müssen wechseln zu:
Wenn die App im Hintergrund angezeigt wird, erhält die zusätzliche Standardabsicht für Aktivitäten "Daten".
Viel Glück!
quelle
Überschreiben Sie einfach die OnCreate-Methode von FirebaseMessagingService. Es wird aufgerufen, wenn sich Ihre App im Hintergrund befindet:
quelle
Es gibt zwei Arten von Firebase- Push-Benachrichtigungen:
1- Benachrichtigungsnachricht (Meldung anzeigen) -> - 1.1 Wenn Sie diese Variante auswählen, erstellt das Betriebssystem selbst eine Benachrichtigung, wenn sich die App im Hintergrund befindet, und leitet die Daten in der
intent
. Dann ist es Sache des Kunden, mit diesen Daten umzugehen.- 1.2 Wenn sich die App im Vordergrund befindet, wird die Benachrichtigung, über
callback-function
dieFirebaseMessagingService
sie empfangen wird, im und es ist Sache des Kunden, sie zu bearbeiten.2- Datennachrichten (bis zu 4k Daten) -> Diese Nachrichten werden verwendet, um nur Daten (stillschweigend) an den Client zu senden, und es ist Sache des Clients, diese für beide Fälle Hintergrund / Vordergrund über die Rückruffunktion in zu verarbeiten
FirebaseMessagingService
Dies ist gemäß den offiziellen Dokumenten: https://firebase.google.com/docs/cloud-messaging/concept-options
quelle