Voici mon manifeste
<service android:name=".fcm.PshycoFirebaseMessagingServices">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
<service android:name=".fcm.PshycoFirebaseInstanceIDService">
<intent-filter>
<action android:name="com.google.firebase.INSTANCE_ID_EVENT" />
</intent-filter>
</service>
Lorsque l'application est en arrière-plan et qu'une notification arrive, la notification par défaut arrive et n'exécute pas mon code de onMessageReceived
.
Voici mon onMessageReceived
code. Ceci est invoqué si mon application s'exécute au premier plan, pas lorsqu'elle est en arrière-plan. Comment exécuter ce code lorsque l'application est également en arrière-plan?
// [START receive_message]
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
// TODO(developer): Handle FCM messages here.
// If the application is in the foreground handle both data and notification messages here.
// Also if you intend on generating your own notifications as a result of a received FCM
// message, here is where that should be initiated. See sendNotification method below.
data = remoteMessage.getData();
String title = remoteMessage.getNotification().getTitle();
String message = remoteMessage.getNotification().getBody();
String imageUrl = (String) data.get("image");
String action = (String) data.get("action");
Log.i(TAG, "onMessageReceived: title : "+title);
Log.i(TAG, "onMessageReceived: message : "+message);
Log.i(TAG, "onMessageReceived: imageUrl : "+imageUrl);
Log.i(TAG, "onMessageReceived: action : "+action);
if (imageUrl == null) {
sendNotification(title,message,action);
} else {
new BigPictureNotification(this,title,message,imageUrl,action);
}
}
// [END receive_message]
android
firebase
firebase-cloud-messaging
Parth Patel
la source
la source
Not getting messages here? See why this may be: goo.gl/39bRNJ
. La solution, comme les réponses ci-dessous, peut être trouvée dans la documentation dans Messages avec notification et données utilesRéponses:
1. Pourquoi cela se produit-il?
Il existe deux types de messages dans FCM (Firebase Cloud Messaging):
onMessageReceived()
rappel uniquement lorsque votre application est au premier planonMessageReceived()
rappel même si votre application est au premier plan / en arrière-plan / supprimée2. Comment?
Pour ce faire, vous devez effectuer une
POST
demande à l'URL suivante:En-têtes
Content-Type
, Valeur:application/json
Authorization
, Valeur:key=<your-server-key>
Corps utilisant des sujets
Ou si vous souhaitez l'envoyer vers des appareils spécifiques
3. Comment gérer le message de notification push?
Voici comment vous gérez le message reçu:
la source
Firebase team have not developed a UI to send data-messages to your devices, yet.
Cela a-t-il changé au cours de la dernière année?onMessageReceived
- plan, elle n'est pas appelée et c'est un problème grave dans FCM !!! Veuillez également mettre à jour votre réponse.Pour créer une bibliothèque Firebase pour appeler votre onMessageReceived () dans les cas suivants
vous ne devez pas mettre la «notification» de la clé JSON dans votre demande à l'API Firebase mais utiliser à la place les «données», voir ci-dessous.
Le message suivant n'appellera pas votre onMessageReceived () lorsque votre application est en arrière-plan ou supprimée , et vous ne pouvez pas personnaliser votre notification.
mais à la place, cela fonctionnera
Fondamentalement, le message est envoyé dans l'argument RemoteMessage avec votre objet de données en tant que carte, puis vous pouvez gérer la notification dans onMessageReceived comme dans l'extrait ici
la source
J'ai l'impression que toutes les réponses sont incomplètes, mais toutes ont quelque chose dont vous avez besoin pour traiter une notification contenant des données lorsque votre application est en arrière-plan.
Suivez ces étapes et vous pourrez traiter vos notifications lorsque votre application est en arrière-plan.
1.Ajoutez un filtre d'intention comme celui-ci:
à une activité dont vous souhaitez traiter les données de notification.
Envoyez des notifications au format suivant:
La clé ici est d'ajouter
où .MainActivity est l'activité avec le filtre d'intention que vous avez ajouté à l'étape 1.
Obtenez des informations sur les "données" à partir de la notification dans le onCreate de ".MainActivity":
Et cela devrait être tout ce que vous devez faire. J'espère que cela aide quelqu'un :)
la source
Selon la documentation de Firebase dans l' envoi en aval à l'aide de Firebase , il existe 2 types de charge utile:
Les données
notification
Lorsque vous êtes au premier plan, vous pouvez obtenir les données dans FCM en utilisant onMessageReceived () , vous pouvez obtenir vos données à partir de la charge utile des données .
Lorsque vous êtes en arrière-plan, FCM affichera une notification dans la barre d'état système en fonction des informations de la charge utile de notification . Le titre, le message et l'icône utilisés pour la notification dans la barre d'état système proviennent de la charge utile de notification .
Cette charge utile de notification est utilisée lorsque vous souhaitez afficher automatiquement une notification sur la barre d'état système lorsque votre application est en arrière-plan. Pour obtenir des données de notification lorsque votre application en arrière-plan, vous devez ajouter click_action dans la charge utile de notification .
Mettez ce filtre d'intention sur votre manifeste, dans l'une de vos balises d'activité. Lorsque vous cliquez sur la notification, elle ouvre l'application et passe directement à l'activité que vous définissez dans click_action, dans ce cas "OPEN_ACTIVTY_1". Et à l'intérieur de cette activité, vous pouvez obtenir les données en:
J'utilise FCM pour mon application Android et j'utilise les deux charges utiles. Voici l'exemple JSON que j'utilise:
la source
Selon les documents
Éditer :
Sur la base de ce fil :
Vous ne pouvez pas définir la charge utile click_action à l'aide de la console Firebase. Vous pouvez essayer de tester avec une commande curl ou un serveur http personnalisé
la source
Fonctionne depuis juillet 2019
Android compileSdkVersion 28, buildToolsVersion 28.0.3 et messagerie Firebase: 19.0.1
Après de nombreuses heures de recherche à travers toutes les autres questions et réponses de StackOverflow, et en essayant d'innombrables solutions obsolètes, cette solution a réussi à afficher des notifications dans ces 3 scénarios:
- L'application est au premier plan:
la notification est reçue par la méthode onMessageReceived dans ma classe MyFirebaseMessagingService
- L'application a été supprimée (elle ne fonctionne pas en arrière-plan): la notification est envoyée automatiquement au bac de notification par FCM. Lorsque l'utilisateur touche la notification, l'application est lancée en appelant l'activité qui a android.intent.category.LAUNCHER dans le manifeste. Vous pouvez obtenir la partie données de la notification en utilisant getIntent (). GetExtras () à la méthode onCreate ().
- L'application est en arrière-plan: la notification est envoyée automatiquement au bac de notification par FCM. Lorsque l'utilisateur touche la notification, l'application est mise au premier plan en lançant l'activité qui a android.intent.category.LAUNCHER dans le manifeste. Comme mon application a launchMode = "singleTop" dans cette activité, la méthode onCreate () n'est pas appelée car une activité de la même classe est déjà créée, à la place la méthode onNewIntent () de cette classe est appelée et vous obtenez la partie données de la notification là-bas en utilisant intent.getExtras ().
Étapes: 1- Si vous définissez l'activité principale de votre application comme ceci:
2- Ajoutez ces lignes à la méthode onCreate () de votre classe MainActivity.class
et ces méthodes à la même classe MainActivity.class:
3- Créez la classe MyFirebase comme ceci:
4- Créez une nouvelle classe NotificationActivity.class comme ceci:
}
5- Ajoutez ces lignes à votre manifeste d'application, à l'intérieur de vos tags
6- Ajoutez ces lignes dans votre méthode Application.java onCreate (), ou dans la méthode MainActivity.class onCreate ():
Terminé.
Maintenant, pour que cela fonctionne correctement dans les 3 scénarios mentionnés, vous devez envoyer la notification à partir de la console Web Firebase de la manière suivante:
Dans la section Notification: Titre de notification = Titre à afficher dans la boîte de dialogue de notification (facultatif) Texte de notification = Message à afficher à l'utilisateur (obligatoire) Puis dans la section Cible: Application = votre application Android et dans la section Options supplémentaires: Canal de notification Android = default_channel_id Clé de données personnalisées: valeur de titre: (même texte ici que dans le champ Titre de la section Notification) clé: valeur de corps: (même texte ici que dans le champ Message de la section Notification) clé: valeur click_action: .MainActivity Sound = Désactivé
expire = 4 semaines
Vous pouvez le déboguer dans l'émulateur avec l'API 28 avec Google Play.
Bon codage!
la source
Étant donné que ceux
display-messages
qui sont envoyés depuis Firebase Notification UI ne fonctionne que si votre application est au premier plan. Pourdata-messages
, il est nécessaire de faire un appel POST à FCMPas
Installer l'extension Google Chrome Advanced Rest Client
Ajoutez les en-têtes suivants
Clé : Content-Type, valeur : application / json
Clé : autorisation, valeur : clé = "votre clé de serveur"
Ajouter le corps
Si vous utilisez des sujets:
Si vous utilisez l'ID d'enregistrement:
C'est ça!. Écoutez maintenant le
onMessageReceived
rappel comme d'habitude.la source
Pour capturer le message en arrière-plan, vous devez utiliser un
BroadcastReceiver
et ajoutez ceci à votre manifeste:
la source
n'est pas appelé à chaque fois qu'il est appelé uniquement lorsque l'application est en avant-plan
il existe une méthode de remplacement, cette méthode est appelée à chaque fois, quelle que soit l'application qui est au premier plan, en arrière-plan ou supprimée, mais cette méthode est disponible avec cette version api Firebase
c'est la version que vous devez importer de gradle
c'est la méthode
avec l'api firebase précédente, cette méthode n'était pas là, donc dans ce cas, la base de feu se gère quand l'application est en arrière-plan .... maintenant vous avez cette méthode ce que vous voulez faire ... vous pouvez le faire ici dans cette méthode .. ...
si vous utilisez la version précédente, l'activité par défaut commencera dans ce cas, vous pouvez obtenir les données de la même manière
// fais ce que tu veux ....}
généralement c'est la structure du serveur que nous recevons dans la notification
c'est à u comment vous voulez donner cette clé de données ou vous voulez donner une notification tout ce que vous pouvez donner ....... tout ce que vous donnerez ici avec la même clé u obtiendrez ces données ........ .
il y a peu de cas si vous n'envoyez pas d'action de clic dans ce cas, lorsque vous cliquerez sur la notification, l'activité par défaut s'ouvrira, mais si vous voulez ouvrir votre activité spécifique lorsque l'application est en arrière-plan, vous pouvez appeler votre activité à partir de cette méthode sur handleIntent car cela est appelé à chaque fois
la source
Selon les documents: 17 mai 2017
Donc, vous devez utiliser à la fois la notification de charge utile + les données:
Il n'est pas nécessaire d'utiliser click_action.Vous devez simplement obtenir des exras d'intention sur l' activité LAUNCHER
Le code Java doit être sur la méthode onCreate sur MainActivity:
Vous pouvez tester à la fois la notification de charge utile + les données de la console de notifications Firebase . N'oubliez pas de remplir des champs de données personnalisés dans la section Options avancées
la source
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 traités par
onMessageReceived()
ou lesdidReceiveRemoteNotification
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
click_action
paramètre 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.Aussi, je vous recommande d'utiliser la
onMessageReceived
méthode (voir Message de données) pour extraire le bundle 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é.Pour plus d'informations, visitez mon ce fil
la source
Réponse mise à jour 2017
Voici une réponse claire de la documentation à ce sujet:
la source
Résumé simple comme celui-ci
si votre application est en cours d'exécution;
est des déclencheurs.
si votre application n'est pas en cours d'exécution (supprimée par glissement);
n'est pas déclenché et livré par direclty. Si vous avez une paire clé-valeur spéciale. Ils ne fonctionnent pas car onMessageReceived () ne fonctionne pas.
J'ai trouvé cette voie;
Dans votre activité de lanceur, mettez cette logique,
dans ce bloc if, recherchez vos clés en fonction de l'interface utilisateur de firebase.
Dans cet exemple, ma clé et ma valeur comme ci-dessus; (désolé pour la langue =))
Lorsque mon code fonctionne, j'obtiens "com.rda.note".
avec cette ligne de code, j'ai fermé mon application et ouvert Google Play Market
codage heureux =)
la source
J'ai compris les scénarios,
Lorsque l'application est au premier plan , la méthode onMessageReceived () est appelée à partir de FirebaseService . Ainsi, le pendingIntent défini dans la classe de service sera appelé.
Et lorsque l'application est en arrière - plan , la première activité est appelée.
Maintenant, si vous utilisez une activité splash , vous devez garder à l'esprit que la splashactivity sera appelée, sinon s'il n'y a pas splashActivity, alors quelle que soit la première activité, elle sera appelée.
Ensuite, vous devez vérifier getIntent () de la première activité pour voir s'il contient un ensemble. Si tout va bien, vous verrez que l'ensemble est là avec des valeurs remplies. Si la valeur dans la balise de données envoyée par le serveur ressemble à ceci,
Ensuite, dans la première activité, vous verrez, il y a une intention valide ( getIntent () n'est pas null ), un bundle valide et un bundle interne, il y aura tout le JSON mentionné ci-dessus avec les données comme clé .
Pour ce scénario, le code d'extraction de valeur ressemblera à ceci,
la source
Merci à vous tous pour vos réponses. Mais j'ai résolu cela en envoyant un message de données au lieu d'envoyer une notification . Code serveur
Et attrapé les données dans onMessageReceived
la source
Supprimez complètement la charge utile de notification de votre demande de serveur. Envoyez uniquement des données et gérez-les
onMessageReceived()
, sinon votreonMessageReceived
ne sera pas déclenché lorsque l'application est en arrière-plan ou supprimée.Voici ce que j'envoie du serveur:
Ainsi, vous pouvez recevoir vos données
onMessageReceived(RemoteMessage message)
comme ceci: (disons que je dois obtenir l'identifiant)Et de même, vous pouvez obtenir toutes les données que vous avez envoyées depuis le serveur
onMessageReceived()
.la source
Le moyen facile d'envoyer des messages même si l'application est en arrière-plan et au premier plan comme suit: - Pour envoyer un message à l'aide de l'API, vous pouvez utiliser un outil appelé AdvancedREST Client, c'est une extension chrome et envoyer un message avec les paramètres suivants.
Lien de l'outil client Rest: https://chrome.google.com/webstore/detail/advanced-rest-client/hgmloofddffdnphfgcellkdfbfbjeloo
utilisez cette URL: - https://fcm.googleapis.com/fcm/send Content-Type: application / json Autorisation: clé = votre clé de serveur de ou clé d'authentification (voir ci-dessous réf)
La clé d'autorisation peut être obtenue en visitant la console des développeurs Google et en cliquant sur le bouton Informations d'identification dans le menu de gauche de votre projet. Parmi les clés d'API répertoriées, la clé de serveur sera votre clé d'autorisation.
Et vous devez mettre tokenID du récepteur dans la section «à» de votre demande POST envoyée à l'aide de l'API.
la source
vous voulez travailler surMessageReceived (RemoteMessage remoteMessage) en arrière-plan envoyer uniquement la partie de notification de partie de données ceci:
"AnotherActivity": "True", "à": "ID de périphérique ou jeton de périphérique"
Par cela, onMessageRecivied est l'arrière-plan et le premier plan des appels, pas besoin de gérer la notification en utilisant le plateau de notification sur votre activité de lanceur. Gérez la charge utile des données en utilisant ceci:
la source
Réponse de juin 2018 -
Vous devez vous assurer qu'il n'y a pas de mot-clé "notification" n'importe où dans le message. N'incluez que les «données» et l'application pourra gérer le message dans onMessageReceived, même en arrière-plan ou tué.
Utilisation des fonctions cloud:
Ensuite, dans votre onMessageReceived (), dans votre classe étendant com.google.firebase.messaging.FirebaseMessagingService:
la source
Selon OAUTH 2.0:
Il y aura un problème d'authentification pour ce cas parce que FCM utilise maintenant OAUTH 2
J'ai donc lu la documentation de Firebase et, selon la documentation, une nouvelle façon de publier un message de données est;
En-têtes
Auth
Exemple de corps
Dans l'url, il y a un identifiant de base de données que vous pouvez trouver sur votre console Firebase. (Aller aux projets)
Et maintenant, prenons notre jeton (il ne sera valide que 1 heure):
Tout d'abord dans la console Firebase, ouvrez Paramètres> Comptes de service . Cliquez sur Générer une nouvelle clé privée , stockez en toute sécurité le fichier JSON contenant la clé. J'avais besoin de ce fichier JSON pour autoriser manuellement les demandes de serveur. Je l'ai téléchargé.
Ensuite, je crée un projet node.js et utilise cette fonction pour obtenir mon jeton;
Maintenant, je peux utiliser ce jeton dans ma demande de publication. Ensuite, je poste mon message de données, et il est désormais géré par mes applications sur la fonction MessageMessage.
la source
Depuis 2019, Google Firebase a un grand changement dans leurs API, je veux dire:
'com.google.firebase:firebase-messaging:18.0.0'
dans 18.0.0, ils ont été supprimés
MyFirebaseInstanceIDService
et vous devez obtenir un jeton,MyFirebaseMessagingService
il vous suffit donc d'écrire:et aussi dans votre AndroidManifest.xml, vous devez supprimer:
Il est également recommandé de définir des valeurs par défaut pour personnaliser l'apparence des notifications. Vous pouvez spécifier une icône par défaut personnalisée et une couleur par défaut personnalisée qui sont appliquées lorsque des valeurs équivalentes ne sont pas définies dans la charge utile de notification.
Ajoutez ces lignes à l'intérieur de la balise d'application pour définir l'icône par défaut personnalisée et la couleur personnalisée:
Maintenant, pour gérer les messages de notification dans une application en arrière-plan, vous devez définir une intention dans votre première activité, même s'il s'agit de SplashScreen. Lorsque votre application est en arrière-plan, Android dirige les messages de notification vers la barre d'état système. Un utilisateur tapant sur la notification ouvre le lanceur d'applications par défaut.
par exemple, si votre Json est comme ça:
il vous suffit d'écrire une intention simple pour obtenir ces valeurs:
la source
En plus des réponses ci-dessus, si vous testez des notifications push à l'aide de la console FCM , la clé et l'objet 'données' ne sont pas ajoutés au groupe de notifications push. Vous ne recevrez donc pas de notification push détaillée lorsque l'application est en arrière-plan ou supprimée.
Dans ce cas, vous devez opter pour votre console d'administration principale pour tester le scénario d'arrière-plan de l'application.
Ici, vous aurez ajouté la clé «data» à votre bundle push. ainsi, une poussée détaillée sera affichée comme prévu. J'espère que cela aide peu.
la source
En utilisant ce code, vous pouvez obtenir la notification en arrière-plan / au premier plan et également mettre l'action:
Dans l'application, utilisez ce code:
la source
Il y aura deux types de notifications
Vous devez utiliser les notifications de données pour gérer la notification lorsque l'application est en arrière-plan.
la source
J'ai rencontré le même problème et recompilé la bibliothèque Firebase et l'empêché d'envoyer des notifications lorsque l'application est en arrière-plan
* bibliothèque https://github.com/erdalceylan/com-google-firebase-messaging
*
l'espoir aide. Bonne chance
la source