Firebase onMessageReceived pas appelé quand application en arrière-plan
Je travaille avec Firebase et le test de l'envoi de notifications sur mon application à partir de mon serveur, tandis que l'application est en arrière-plan. La notification est envoyée avec succès, il apparaît même sur le centre de notifications de l'appareil, mais lorsque la notification s'affiche ou même si je clique dessus, la onMessageReceived méthode à l'intérieur de mon FCMessagingService n'est jamais appelée.
Quand je l'ai testé ce alors que mon application est au premier plan, le onMessageReceived méthode a été appelée et tout a bien fonctionné. Le problème se produit lorsque l'application est en cours d'exécution en arrière-plan.
Est-ce destiné comportement, ou est-il une manière que je peux 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"));
}
}
}
Qu'entendez-vous le json corps de la notification? Aussi, mon onTokenRefresh code est à l'intérieur de mon FirebaseInstanceID service.
Vous pouvez poster l'échantillon de charge utile de vous les envoyer?
utiliser les istudy.io/android-les notifications push--aide-firebase-fcm
Vous pouvez également consulter ce thread stackoverflow.com/questions/39046270/...
OriginalL'auteur Cyogenos | 2016-05-21
Vous devez vous connecter pour publier un commentaire.
Cela fonctionne comme prévu, les messages de notification sont livrés à votre onMessageReceived rappel que lorsque votre application est au premier plan. Si votre application est en arrière-plan ou fermé alors un message de notification est affichée dans le centre de notification, et tout données à partir de ce message est transmis à l'intention qui est lancé comme un résultat de l'utilisateur en tapant sur la notification.
Vous pouvez spécifier un click_action pour indiquer l'intention qui doit être lancé au moment de la notification est tapé par l'utilisateur. L'activité principale est utilisée si aucun click_action est spécifié.
Lorsque l'intention est lancé, vous pouvez utiliser le
de récupérer un Ensemble qui comprendrait toutes les données envoyées avec le message de notification.
Pour en savoir plus sur message de notification de voir docs.
click_action
quand je suis en utilisant le Firebase Notification de la Console?ok, mais que faire si l'application est tué (pas de premier plan ou d'arrière-plan)?
Vous pouvez le tester par vous-même. Envoyer un message pendant que votre application n'est pas en cours d'exécution. Le message doit toujours être livré à la cible de téléphone.
Mais comment faire pour désactiver l'utilisateur jeter de notification? Parce que si l'utilisateur de les jeter, cela signifie que toutes les données seront sauter... Droit?
Correct! Donc, lors de l'envoi de messages de notification d'Android, les données correspondantes doivent être données qu'est l'amélioration de la notification de l'expérience. Il ne devrait pas être app critique des données, utilisation de messages de données pour les données nécessaires à l'application même si l'utilisateur ignore la notification.
OriginalL'auteur Arthur Thompson
Supprimer
notification
champ complètement de votre demande de serveur. Envoyer seulementdata
et de les traiter dansonMessageReceived()
sinon votreonMessageReceived()
ne sera pas déclenchée lorsque l'application est en arrière-plan ou tués.N'oubliez pas d'inclure
"priority": "high"
champ dans votre demande de notification. Selon la documentation: les données, les messages sont envoyés avec une priorité normale, donc ils ne vont pas arriver instantanément; il peut aussi être le problème.Voici ce que j'envoie à partir du serveur
De sorte que vous pouvez recevoir vos données en
onMessageReceived(RemoteMessage message)
comme ça....disons que j'ai pour obtenir l'idCela a été la solution pour moi de recevoir des messages en arrière-plan!
En Oreo lors de l'application tué, onMessageReceived n'est pas appelé. j'ai juste de la charge utile avec les données. toute mise à jour avez-vous ?
Fonctionne comme un charme!
Vous aime beaucoup pour cette réponse :p
OriginalL'auteur Zohab Ali
cette méthode handleIntent() est dépréciée, donc de gérer une notification peut être fait comme ci-dessous:
De premier plan de l'État: Le fait de cliquer sur la notification d'aller à l'attente de l'Intention de l'activité que vous fournissez lors de la création d'une notification pro-grammaticalement comme c'est généralement créés avec les données de la charge utile de la notification.
Fond/Tués, État - Là, le système crée lui-même une notification en fonction de notification de la charge utile et en cliquant sur la notification vous amène à l'écran de lancement de l'activité de l'application où vous pouvez facilement chercher de l'Intention de données dans l'un de vos méthodes de cycle de vie.
vraiment la solution parfaite!
Je suis de la manipulation de la notification de la logique d'affichage dans handleIntent(Intent intent) , cependant lorsque l'application est en arrière-plan, 2 notifications sont affichées , celui que j'ai créé et d'autres par défaut qui contient l'intégralité du message de notification.
Génial, mais je ne vois pas l'utilité
OnMessageReceived
dans ce cas !?Je vais avoir com.google.firebase:firebase-messagerie:11.6.2 & handleIntent est finale maintenant.Vérifier stackoverflow.com/questions/47308155/...
OriginalL'auteur manas.abrol
J'ai eu le même problème. Il est plus facile d'utiliser le "message de données" à la place de la "notification". Le message de données toujours charger la classe onMessageReceived.
Dans la classe que vous pouvez faire votre propre notification avec le notificationbuilder.
Exemple:
il fonctionne seulement si l'application est au premier plan pas si il est en arrière-plan. u peut m'aider à déclencher cet événement dans les deux cas??
comment est-ce que votre POST à la Firebase serveur ressemble?
Il y a en fait trois cas possibles ici. 1) Application au premier plan. 2) Application en arrière-plan. 3) Application ne s'exécute pas. Comme vous le dites, un "data" message sera reçu dans les deux premiers cas, mais pas dans le troisième cas, lorsque l'application n'est pas en cours d'exécution. Pour répondre à tous les trois cas, vous devez définir la "notification" de champ dans le message. (C'est aussi une bonne idée si vous voulez soutenir iOS comme Android clients)
Même dans l'application n'est pas en cours d'exécution, je stil obtenir un message depuis le serveur sur la fonction onmessagereceived. Je suis d'accord avec vous qu'il est préférable d'utiliser "notification" si vous voulez soutenir ios aussi.
OriginalL'auteur Koot
Comme par Firebase Messagerie en Nuage documentation-Si l'Activité est en premier plan, puis onMessageReceived sera appelée. Si l'Activité est en arrière-plan ou fermée, alors qu'un message de notification est affichée dans le centre de notification pour le lanceur d'applications de l'activité.
Vous pouvez appeler votre personnalisé de l'activité sur le clic de la notification si votre application est en arrière-plan en appelant le service rest api pour firebase de messagerie:
URLhttps://fcm.googleapis.com/fcm/send
Type de méthode POST
Corps/Charge Utile:
Et c'est dans votre application, vous pouvez ajouter le code ci-dessous dans votre activité:
Vérifiez ceci: firebase.google.com/docs/cloud-messaging/...
OriginalL'auteur Ankit Adlakha
Ici, c'est plus clair des concepts à propos de firebase message. Je l'ai trouvé à partir de leur équipe de soutien.
Firebase a trois types de messages:
Les messages de Notification : 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 livrés à 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 l'Affichage des messages.Messages de données: Sur la plate-forme Android, le message de données peut fonctionner en arrière-plan et de premier plan. Le message de données seront traitées par onMessageReceived(). Une plate-forme de note spécifique serait ici: Sur Android, la charge utile de données peuvent être récupérées dans l'Intention de servir à lancer votre activité. D'élaborer, si vous avez
"click_action":"launch_Activity_1"
, vous pouvez récupérer cette intention par le biais degetIntent()
à partir de seulementActivity_1
.Des Messages avec notification et de données à des charges: Quand dans le fond, les applications reçoivent la notification de la charge utile dans la barre de notification, et traite uniquement les données de la charge utile lorsque l'utilisateur appuie sur la notification. Quand au premier plan, votre application reçoit un message d'un objet avec les deux charges utiles disponibles. Deuxièmement, la click_action paramètre est souvent utilisé dans la notification de la charge utile et pas dans les données de la charge utile. Si utilisé à l'intérieur des données de charge utile, ce paramètre devrait être traitée comme une coutume paire clé-valeur et, par conséquent, vous devez mettre en œuvre une logique personnalisée pour qu'il fonctionne comme prévu.
Aussi, je vous recommande d'utiliser onMessageReceived méthode (voir message de Données) pour extraire le forfait de données. À partir de votre logique, j'ai vérifié le faisceau objet et n'ai pas trouvé de données attendu de contenu. Ici est une référence à un cas similaire qui pourrait fournir plus de clarté.
Pour plus d'info visitez mon ce fil et ce fil
OriginalL'auteur Md. Sajedul Karim
Si l'application est en arrière-plan ou en mode inactif(tué), et vous cliquez sur sur Notification, vous devriez vérifier pour la charge utile de LaunchScreen(dans mon cas, l'écran de lancement est MainActivity.java).
Donc dans MainActivity.java sur onCreate vérifier Extras:
Merci, c'est la réponse. @Md.Tarikul l'Islam à l'aide de onMessageReceived() comme mentionné dans la présente question.
OriginalL'auteur Gent Berani
J'ai eu le même problème. Si l'application est en arrière - plan, il déclenche mon service d'arrière-plan où je peux mettre à jour ma base de données basée sur le type de notification.
Mais, l'application passe à l'arrière plan - le défaut de notification de service sera pris en charge pour afficher la notification à l'utilisateur.
Voici ma solution pour identifier l'application en arrière-plan et de déclenchement de votre service d'arrière-plan,
Dans le manifest.xml
Testé cette solution en dernier android version 8.0. Grâce
où utiliser ce code public class FirebaseBackgroundService s'étend WakefulBroadcastReceiver @Nagendra Badiganti
créer une classe de service dans votre colis et vous inscrire dans votre manifest.xml. Assurez-vous que le filtre de vos notifications. Depuis que le service des déclencheurs de toutes les GCM notification.
firebase.google.com/docs/cloud-messaging/android/... je suis en suivant ce lien, j'ai besoin d'ajouter cette classe pour recevoir une notification . juste pour envoyer un message à partir de firebase premier message.. il dit que terminée, mais pas la réception de la notification @Nagendra Badiganti
avez-vous ajouter google-services.json dans votre dossier racine du projet?
OriginalL'auteur Nagendra Badiganti
Remplacer la
handleIntent
Méthode de laFirebaseMessageService
fonctionne pour moi.ici le code dans C# (Xamarin)
et c'est le Code dans Java
Comment puis-je invoquer le handleIntent fonction?
La méthode est appelée lorsque vous recevez le message de Firebase, mais vous ne pouvez pas remplacer parce que la méthode est déclarée final. (Firebase 11.6.0)
Cela fonctionne dans 11.4.2
OriginalL'auteur t3h Exi
Par défaut, le Lanceur D'Activité dans votre application sera lancée lorsque votre application est en arrière-plan et vous cliquez sur la notification, si vous avez des données de la partie avec votre notification, vous pouvez le gérer dans la même activité, comme suit,
getIntent().getExtras() toujours null,avez-vous une autre solution ?Lors de l'application va bacground onMessageReceived méthode appelle pas
OriginalL'auteur Uzair
Si l'application est en arrière-plan de Feu de base par défaut de la manipulation de notification, Mais si nous voulons notre coutume de notification que nous devons changer notre côté serveur, ce qui est responsable d'envoyer nos données personnalisées(données de charge utile)
Supprimer la notification de la charge utile complètement de votre demande de serveur. Envoyer uniquement les Données et de les traiter dans onMessageReceived (), sinon votre onMessageReceived ne sera pas déclenchée lorsque l'application est en arrière-plan ou tués.
maintenant,votre côté serveur format de code ressembler,
NOTE: voir cette ligne dans le code ci-dessus
"texte": "John Doe partagé un contact dans le groupe de Contact de l'Échange"
dans les Données de la charge utile, vous devez utiliser "texte" paramètre au lieu de "corps" ou "message" les paramètres de message description ou ce que vous souhaitez utiliser le texte.
onMessageReceived()
OriginalL'auteur Hiren
Appelez simplement dans votre MainActivity de la Méthode onCreate :
OriginalL'auteur Shekhar
en fonction de la solution de t3h Exi je voudrais afficher le code propre ici. Il suffit de le mettre dans MyFirebaseMessagingService et tout fonctionne bien si l'application est en arrière-plan. Vous avez besoin d'au moins de compiler com.google.firebase:firebase-messagerie:10.2.1
Oui mais c'est pas de ma faute ni aucune raison de donner à -1 !!! Très arrogant. Il fonctionne jusqu'à firebase 11.4.2 google a changé (en fait cette méthode finale). Alors maintenant, vous devez programmer votre propre solution avec la notification.
Je n'ai pas donner un -1 mais un +1 !
Vous enregistrer mon travail 😛
OriginalL'auteur Frank
Essayez ceci:
OriginalL'auteur user3587828
Le point qui mérite d'être mise en évidence est que vous avez à utiliser les données de message données clés seulement - pour obtenir onMessageReceived gestionnaire appelé, même lorsque l'application est en arrière-plan. Vous ne devriez avoir aucun autre message de notification de la clé à votre charge, sinon le gestionnaire de ne pas se déclencher si l'application est en arrière-plan.
Il est mentionné (mais pas tellement mise en valeur dans la composition de la documentation) ici:
https://firebase.google.com/docs/cloud-messaging/concept-options#notifications_and_data_messages
OriginalL'auteur n_y
Le backend, je travaille avec l'aide de les messages de Notification et pas de messages de Données. Donc, après avoir lu toutes les réponses, j'ai essayé de récupérer les extras dans le bundle de l'intention qui vient pour le lancement de l'activité.
Mais pas n'importe quelles touches, j'ai essayé de le récupérer à partir de
getIntent().getExtras();
, la valeur est toujours null.Cependant, j'ai enfin trouvé un moyen d'envoyer des données à l'aide de les messages de Notification et de le récupérer à partir de l'intention.
La clé ici est d'ajouter la des données de charge utile pour le message de Notification.
Exemple:
Après vous faites cela, vous serez en mesure d'obtenir votre info de cette façon:
intent.getExtras().getString("title")
sera
message_title
et
intent.getExtras().getString("message")
sera
message_body
Référence
OriginalL'auteur Vito Valov
Si votre problème est lié à l'affichage d'Images, c'est à dire si vous êtes d'envoi de notifications push avec une image de firebase de la console et il affiche l'image uniquement si l'application au premier plan. La solution de ce problème consiste à envoyer un message push qu'avec les données de terrain. Quelque chose comme ceci:
OriginalL'auteur Arun
J'ai eu ce problème(app ne veux pas l'ouvrir à la notification, cliquez sur si l'application est en arrière-plan ou fermé), et le problème était invalide
click_action
dans la notification du corps, essayez de supprimer ou de le changer pour quelque chose de valable.OriginalL'auteur Octavian Lari
J'ai eu le même problème et fait un peu plus de creuser sur ce. Lorsque l'application est en arrière-plan, un message de notification est envoyé à 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 s'assurer que le message que vous envoyez, les docs disent, "l'Utilisation de votre serveur d'application et de la FCM server API: Définissez la clé de données seulement. Peut être pliable ou non-réductible."
Voir https://firebase.google.com/docs/cloud-messaging/concept-options#notifications_and_data_messages
OriginalL'auteur Eric B.
Il y a deux types de messages: les messages de notification et des messages de données.
Si vous avez seulement envoyer des messages de données, qui est sans objet de notification dans votre chaîne de message. Il serait invoquée lorsque votre application en arrière-plan.
OriginalL'auteur Shongsu
Lorsque le message est reçu et que votre application est en arrière-plan la notification est envoyée pour les extras de l'intention de l'activité principale.
Vous pouvez vérifier la valeur supplémentaire dans le oncreate() ou onresume (), fonction de l'activité principale.
Vous pouvez vérifier les champs de données, table, etc ( celui spécifié dans la notification)
par exemple, j'ai envoyé à l'aide de données comme la clé
OriginalL'auteur Sanjeev S
Il y a 2 types de Firebase push-notifications:
1 - Notification de message(message à l'Écran) ->
-- 1.1 Si vous choisissez cette variante, le système d'exploitation de créer soi-même une notification si l'application est en Fond et va passer les données dans le
intent
. Puis c'est au client de gérer ces données.-- 1.2 Si l'application est en premier plan la notification, il sera reçu par
callback-function
dans leFirebaseMessagingService
et c'est au client de le gérer.2 - les messages de Données(jusqu'à 4k de données) -> Ces messages sont utilisés à l'envoi des données vers le client(en silence) et c'est au client de gérer à la fois les cas d'arrière-plan/premier plan via le rappel fonction dans
FirebaseMessagingService
C'est selon les docs officielles:https://firebase.google.com/docs/cloud-messaging/concept-options
OriginalL'auteur Balflear
De substituer la méthode OnCreate de FirebaseMessagingService. Elle est appelée lorsque votre application est en arrière-plan:
Pouvez-vous m'expliquer ce que vous ne comprenez-vous pas? l'indication de la méthode doit être inséré dans le code qui est partie de la question et répond pleinement à la question. Le code est pour Xamarin, mais vous pouvez simplement convertir en java.
Autant que je sache, La documentation officielle (firebase.google.com/docs/cloud-messaging/android/client) ne parle pas primordial OnCreate dans un service de l'extension de FirebaseMessagingService - si vous avez accès à la documentation qui n'est, peut-être vous pouvez partager un lien? Aussi, à partir de votre réponse, il n'est pas clair comment primordial onCreate résout le problème de la onMessageReceived pas appelé quand la notification est cliqué, par conséquent la demande pour plus d'informations.
La documentation ne mentionne pas la substitution de la méthode OnCreate, mais il fonctionne car je l'utilise dans la production. Le code que vous souhaitez insérer dans le onMessageReceived méthode et qui sert évidemment à faire quelques opérations d'arrière-plan peut être effectuée sur OnCreate.
Dans ce cas, de s'attarder sur le fait que c'est en quelque sorte travaillé pour vous peut s'avérer plus utiles que d'indiquer la solution. Aussi, sans-papiers, le comportement est de nature à arbitrairement arrêter de travailler avec des mises à jour, et que quelqu'un leur utilisation doit être prête à retravailler leur code quand il ne. Cette exclusion de responsabilité doit être mis en place.
OriginalL'auteur Renzo Ciot