Je travaille avec Firebase et teste l'envoi de notifications à mon application depuis mon serveur pendant que l'application est en arrière-plan. La notification est envoyée avec succès, elle apparaît même sur le centre de notification de l'appareil, mais lorsque la notification apparaît ou même si je clique dessus, la méthode onMessageReceived dans mon FCMessagingService n'est jamais appelée.
Lorsque j'ai testé cela alors que mon application était au premier plan, la méthode onMessageReceived a été appelée et tout a bien fonctionné. Le problème se produit lorsque l'application s'exécute en arrière-plan.
Est-ce le comportement voulu ou existe-t-il un moyen de résoudre ce problème?
Voici mon 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
la source
la source
Réponses:
Cela fonctionne comme prévu, les messages de notification sont envoyés à votre rappel onMessageReceived uniquement lorsque votre application est au premier plan. Si votre application est en arrière-plan ou fermée, un message de notification s'affiche dans le centre de notifications et toutes les données de ce message sont transmises à l'intention qui est lancée suite au tapement de l'utilisateur sur la notification.
Vous pouvez spécifier une action click_action pour indiquer l'intention à lancer lorsque la notification est exploitée par l'utilisateur. L'activité principale est utilisée si aucun click_action n'est spécifié.
Lorsque l'intention est lancée, vous pouvez utiliser le
pour récupérer un ensemble qui inclurait toutes les données envoyées avec le message de notification.
Pour plus d'informations sur le message de notification, consultez la documentation .
la source
click_action
lorsque j'utilise la console de notification Firebase?Supprimez
notification
complètement le champ de votre demande de serveur. Envoyez seulementdata
et manipulez-leonMessageReceived()
sinononMessageReceived()
ne sera pas déclenchée lorsque l'application est en arrière-plan ou supprimée.N'oubliez pas d'inclure
"priority": "high"
champ dans votre demande de notification. Selon la documentation: les messages de données sont envoyés avec une priorité normale, donc ils n'arriveront pas instantanément; cela pourrait aussi être le problème.Voici ce que j'envoie depuis le serveur
Ainsi, vous pouvez recevoir vos données
onMessageReceived(RemoteMessage message)
comme ceci .... disons que je dois mela source
cette méthode handleIntent () a été dépréciée, donc la gestion d'une notification peut être effectuée comme suit:
État de premier plan: le clic de la notification ira à l'activité de l'intention en attente que vous fournissez lors de la création d'une notification de manière programmatique, comme elle l'a généralement créé avec la charge utile de données de la notification.
Contexte / État tué - Ici, le système lui-même crée une notification basée sur la charge utile de notification et en cliquant sur cette notification, vous accédez à l'activité de lancement de l'application où vous pouvez facilement récupérer les données d'intention dans n'importe laquelle de vos méthodes de cycle de vie.
la source
OnMessageReceived
dans ce cas!?Voici des concepts plus clairs sur le message Firebase. Je l'ai trouvé auprès de leur équipe d'assistance.
Firebase a trois types de messages :
Messages de notification : le message de notification fonctionne en arrière-plan ou au premier plan. Lorsque l'application est en arrière-plan, les messages de notification sont remis dans la barre d'état système. Si l'application est au premier plan, les messages sont gérés par
onMessageReceived()
oudidReceiveRemoteNotification
rappels. Il s'agit essentiellement de ce que l'on appelle les messages d'affichage.Messages de données : sur la plateforme Android, les messages de données peuvent fonctionner en arrière-plan et au premier plan. Le message de données sera géré par onMessageReceived (). Une note spécifique à la plate-forme serait ici: Sur Android, la charge utile des données peut être récupérée dans l'intention utilisée pour lancer votre activité. Pour élaborer, si vous en avez
"click_action":"launch_Activity_1"
, vous pouvez récupérer cette intentiongetIntent()
uniquement à partir deActivity_1
.Messages avec notification et données utiles : en arrière-plan, les applications reçoivent la charge utile de notification dans la barre de notification et ne gèrent la charge utile de données que lorsque l'utilisateur appuie sur la notification. Au premier plan, votre application reçoit un objet de message avec les deux charges utiles disponibles. Deuxièmement, le paramètre click_action est souvent utilisé dans la charge utile de notification et non dans la charge utile de données. S'il est utilisé dans les données utiles, ce paramètre sera traité comme une paire clé-valeur personnalisée et vous devrez donc implémenter une logique personnalisée pour qu'il fonctionne comme prévu.
En outre, je vous recommande d'utiliser la méthode onMessageReceived (voir Message de données) pour extraire le groupe de données. D'après votre logique, j'ai vérifié l'objet bundle et je n'ai pas trouvé le contenu de données attendu. Voici une référence à un cas similaire qui pourrait apporter plus de clarté.
Du côté serveur, la notification Firebase doit être au format suivant :
Le côté serveur doit envoyer un objet "notification" . Manque d'objet "notification" dans mon
TargetActivity
message qui n'a pas été utiliségetIntent()
.Le format de message correct est donné ci-dessous:
Voici des concepts plus clairs sur le message Firebase. Je l'ai trouvé auprès de leur équipe d'assistance.
Pour plus d'informations visitez mon ce fil et ce fil
la source
J'ai eu le même problème. Il est plus facile d'utiliser le «message de données» au lieu de la «notification». Le message de données charge toujours la classe onMessageReceived.
Dans cette classe, vous pouvez faire votre propre notification avec le générateur de notifications.
Exemple:
la source
Selon la documentation de Firebase Cloud Messaging: si l'activité est au premier plan, onMessageReceived sera appelé. Si l'activité est en arrière-plan ou fermée, un message de notification s'affiche dans le centre de notification pour l'activité du lanceur d'applications. Vous pouvez appeler votre activité personnalisée au clic de la notification si votre application est en arrière-plan en appelant l'api du service de repos pour la messagerie Firebase comme:
URL- https://fcm.googleapis.com/fcm/send
Type de méthode - POST
Corps / Charge utile:
Et avec cela dans votre application, vous pouvez ajouter le code ci-dessous dans votre activité pour être appelé:
la source
onMessageReceived
?Méthode onMessageReceived (RemoteMessage remoteMessage) appelée en fonction des cas suivants.
onMessageReceived (RemoteMessage remoteMessage) appelé, affiche LargeIcon et BigPicture dans la barre de notification. Nous pouvons lire le contenu de la notification et du bloc de données
onMessageReceived (RemoteMessage remoteMessage) non appelé, la barre d'état système recevra le message et lira le corps et le titre du bloc de notification et affichera le message et le titre par défaut dans la barre de notification.
Dans ce cas, supprimer les blocs de notification de json
Solution pour appeler onMessageReceived ()
onMessageReceived (RemoteMessage remoteMessage) appelé, affiche LargeIcon et BigPicture dans la barre de notification. Nous pouvons lire le contenu de la notification et du bloc de données
onMessageReceived (RemoteMessage remoteMessage) appelé, la barre d'état système ne recevra pas le message car la clé de notification ne figure pas dans la réponse. Affiche LargeIcon et BigPicture dans la barre de notification
Code
Lien de référence:
https://firebase.google.com/docs/cloud-messaging/android/receive
la source
J'ai le même problème. Si l'application est au premier plan - elle déclenche mon service d'arrière-plan où je peux mettre à jour ma base de données en fonction du type de notification. Mais, l'application passe en arrière-plan - le service de notification par défaut veillera à afficher la notification à l'utilisateur.
Voici ma solution pour identifier l'application en arrière-plan et déclencher votre service en arrière-plan,
Dans le manifest.xml
Testé cette solution dans la dernière version d'Android 8.0. Merci
la source
WakefulBroadcastReceiver
est obsolète depuis le niveau API 26.1.0.Si l'application est en mode arrière-plan ou inactive (tuée) et que vous cliquez sur Notification , vous devez vérifier la charge utile dans LaunchScreen (dans mon cas, l'écran de lancement est MainActivity.java).
Donc, dans MainActivity.java sur onCreate, vérifiez les extras :
la source
Remplacez la
handleIntent
méthode desFirebaseMessageService
travaux pour moi.ici le code en C # (Xamarin)
et c'est le code en Java
la source
Par défaut, l' activité de lancement dans votre application sera lancée lorsque votre application est en arrière-plan et que vous cliquez sur la notification, si vous avez une partie de données avec votre notification, vous pouvez la gérer dans la même activité comme suit,
la source
Si l'application est en arrière-plan Fire-base par défaut, la notification de gestion Mais si nous voulons notre notification personnalisée, nous devons changer notre côté serveur, qui est responsable de l'envoi de nos données personnalisées (charge utile des données)
Supprimez complètement la charge utile de notification de votre demande de serveur. Envoyez uniquement des données et gérez-les dans onMessageReceived (), sinon votre onMessageReceived ne sera pas déclenché lorsque l'application est en arrière-plan ou supprimée.
maintenant, votre format de code côté serveur ressemble,
REMARQUE : voir cette ligne dans le code ci-dessus
"text": "John Doe a partagé un contact dans le groupe Contact Exchange" dans Data payload, vous devez utiliser le paramètre "text" au lieu des paramètres "body" ou "message" pour la description du message ou tout ce que vous voulez voulez utiliser du texte.
onMessageReceived ()
la source
Appelez simplement ceci dans la méthode onCreate de votre MainActivity:
la source
selon la solution de t3h Exi, je voudrais publier le code propre ici. Il suffit de le mettre dans MyFirebaseMessagingService et tout fonctionne bien si l'application est en mode arrière-plan. Vous devez au moins compiler com.google.firebase: firebase-messaging: 10.2.1
la source
Essaye ça:
la source
J'ai eu ce problème (l'application ne veut pas s'ouvrir lors de la notification, cliquez si l'application est en arrière-plan ou fermée), et le problème n'était pas valide
click_action
dans le corps de notification, essayez de le supprimer ou de le changer en quelque chose de valide.la source
Le point qui mérite d'être souligné est que vous devez utiliser le message de données - clé de données uniquement - pour obtenir le gestionnaire onMessageReceived appelé même lorsque l'application est en arrière-plan. Vous ne devriez pas avoir d'autre clé de message de notification dans votre charge utile, sinon le gestionnaire ne sera pas déclenché si l'application est en arrière-plan.
Il est mentionné (mais pas tellement souligné dans la documentation FCM) ici:
https://firebase.google.com/docs/cloud-messaging/concept-options#notifications_and_data_messages
la source
Le backend avec lequel je travaille utilise des messages de notification et non des messages de données. Donc, après avoir lu toutes les réponses, j'ai essayé de récupérer les extras du bundle de l'intention qui vient de l'activité lancée. Mais peu importe de quelles clés j'ai essayé de récupérer
getIntent().getExtras();
, la valeur était toujours nulle.Cependant, j'ai finalement trouvé un moyen d'envoyer des données à l'aide de messages de notification et de les récupérer à partir de l'intention.
La clé ici est d'ajouter la charge utile de données au message de notification.
Exemple:
Après cela, vous pourrez obtenir vos informations de cette manière:
intent.getExtras().getString("title")
seramessage_title
et
intent.getExtras().getString("message")
seramessage_body
Référence
la source
Si votre problème est lié à l'affichage de Big Image, c'est-à-dire si vous envoyez une notification push avec une image de la console Firebase et qu'elle affiche l'image uniquement si l'application est au premier plan. La solution à ce problème consiste à envoyer un message push avec uniquement un champ de données. Quelque chose comme ça:
la source
Lorsque le message est reçu et que votre application est en arrière-plan, la notification est envoyée à l'intention supplémentaire de l'activité principale.
Vous pouvez vérifier la valeur supplémentaire dans la fonction oncreate () ou onresume () de l'activité principale.
Vous pouvez vérifier les champs comme les données, la table, etc. (celui spécifié dans la notification)
par exemple, j'ai envoyé en utilisant des données comme clé
la source
J'avais le même problème et j'ai creusé un peu plus à ce sujet. Lorsque l'application est en arrière-plan, un message de notification est envoyé dans la barre d'état système, MAIS un message de données est envoyé à
onMessageReceived()
Voir https://firebase.google.com/docs/cloud-messaging/downstream#monitor-token-generation_3
et https://github.com/firebase/quickstart-android/blob/master/messaging/app/src/main/java/com/google/firebase/quickstart/fcm/MyFirebaseMessagingService.java
Pour vous assurer que le message que vous envoyez, les documents indiquent: " Utilisez votre serveur d'application et l'API du serveur FCM: définissez la clé de données uniquement. Peut être pliable ou non pliable " .
Voir https://firebase.google.com/ docs / cloud-messaging / concept-options # notifications_and_data_messages
la source
Il existe deux types de messages: les messages de notification et les messages de données. Si vous envoyez uniquement un message de données, c'est sans objet de notification dans votre chaîne de message. Il serait invoqué lorsque votre application en arrière-plan.
la source
Vérifiez la réponse de @Mahesh Kavathiya. Pour mon cas, dans le code serveur a seulement comme ceci:
Vous devez changer pour:
Ensuite, dans le cas où l'application en arrière-plan, l'intention d'activité par défaut supplémentaire obtiendrait des "données"
Bonne chance!
la source
Remplacez simplement la méthode OnCreate de FirebaseMessagingService. Il est appelé lorsque votre application est en arrière-plan:
la source
Il existe 2 types de notifications push Firebase :
1- Message de notification (Message affiché) -> - 1.1 Si vous choisissez cette variante, le système d'exploitation se créera automatiquement une notification si l'application est en arrière - plan et transmettra les données dans le
intent
. Ensuite, c'est au client de gérer ces données.- 1.2 Si l'application est au premier plan, la notification sera reçue via
callback-function
leFirebaseMessagingService
et c'est au client de la gérer.2- Messages de données (jusqu'à 4k données) -> Ces messages sont utilisés pour envoyer uniquement des données au client (en silence) et c'est au client de les gérer pour les deux cas fond / premier plan via la fonction de rappel dans
FirebaseMessagingService
C'est selon les documents officiels: https://firebase.google.com/docs/cloud-messaging/concept-options
la source