web-dev-qa-db-fra.com

Firebase onMessageReceived non appelé

Service FCM:

public class FCMService extends FirebaseMessagingService {


    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {


        Log.i(Constants.TAG,"onMessageReceived");

        Log.i(Constants.TAG, "From: " + remoteMessage.getFrom());

        if (remoteMessage.getData().size() > 0) {
            Log.d(Constants.TAG, "Message data payload: " + remoteMessage.getData());
        }


        if (remoteMessage.getNotification() != null) {
            Log.d(Constants.TAG, "Message Notification Body: " + remoteMessage.getNotification().getBody());
        }


    }

}

App Gradle:

  compile 'com.google.firebase:firebase-messaging:10.2.6'

Manifeste:

   <service Android:name="communications.FCMService">
            <intent-filter>
                <action Android:name="com.google.firebase.MESSAGING_EVENT" />
            </intent-filter>
    </service>

-J'envoie un message depuis la console FCM et n'arrive pas. La console FCM montre que je suis d'accord lorsque le message est envoyé.

-J'envoie un message du serveur Java et le message n'arrive pas. Le serveur Java me montre que le message est envoyé.

-Pour envoyer les messages que j'utilise générés jeton dans l'appareil Android.

-Avant, j'ai eu une erreur d'importer mal la bibliothèque FCM, cette erreur est résolue. Lorsque cette erreur passée s'est produite chaque fois qu'un message a été envoyé, une exception s'est produite sur Android. Maintenant rien n'est reçu.

-J'ai sur le périphérique Android une connexion Internet et je reçois des messages via GCM (pas FCM) à partir d'une autre application que j'ai implémentée dans le passé.

-App est au premier plan.

Certains se connectent avec le filtre "fcm". Je reçois ce journal lorsque j'envoie un message.

08-14 12:09:25.640 800-4739/? D/PowerManagerService: acquireWakeLockInternal: lock=862109980, flags=0x1, tag="wake:bidsy.app.bidsy/communications.FCMService", ws=null, uid=10354, pid=24073
08-14 12:09:25.640 800-4739/? D/PowerManagerNotifier: onWakeLockAcquired: flags=1, tag="wake:bidsy.app.bidsy/communications.FCMService", packageName=bidsy.app.bidsy, ownerUid=10354, ownerPid=24073, workSource=null
08-14 12:09:25.683 24073-24073/bidsy.app.bidsy D/ActivityThread: SVC-Creating service: CreateServiceData{token=Android.os.BinderProxy@1c269013 className=communications.FCMService packageName=bidsy.app.bidsy intent=null}
08-14 12:09:25.683 24073-24073/bidsy.app.bidsy D/ActivityThread: SVC-CREATE_SERVICE handled : 0 / CreateServiceData{token=Android.os.BinderProxy@1c269013 className=communications.FCMService packageName=bidsy.app.bidsy intent=null}
08-14 12:09:25.685 24073-24073/bidsy.app.bidsy D/ActivityThread: SVC-SERVICE_ARGS handled : 0 / ServiceArgsData{token=Android.os.BinderProxy@1c269013 startId=1 args=Intent { act=com.google.firebase.MESSAGING_EVENT pkg=bidsy.app.bidsy cmp=bidsy.app.bidsy/communications.FCMService (has extras) }}
08-14 12:09:25.684 24073-24073/bidsy.app.bidsy D/ActivityThread: SVC-Calling onStartCommand: communications.FCMService@3e035250, flags=0, startId=1
08-14 12:09:25.691 800-1592/? D/PowerManagerService: releaseWakeLockInternal: lock=862109980 [wake:bidsy.app.bidsy/communications.FCMService], flags=0x0, total_time=52ms
08-14 12:09:25.691 800-1592/? D/PowerManagerNotifier: onWakeLockReleased: flags=1, tag="wake:bidsy.app.bidsy/communications.FCMService", packageName=bidsy.app.bidsy, ownerUid=10354, ownerPid=24073, workSource=null
08-14 12:09:25.692 24073-24073/bidsy.app.bidsy D/ActivityThread: SVC-Destroying service: communications.FCMService@3e035250

Il semble que le message arrive au service mais ne le montre pas.

Bien sûr, je n’utilise aucun filtre dans le journal pour vérifier si le message parvient à onMessageReceived

Je trouve la question similaire ici pas répondu, a même journal:

Impossible de recevoir le message de notification Push

Après avoir examiné l’ensemble du journal en détail, j’ai constaté que lors de l’envoi du message, l’erreur Firebase suivante se produit

D / FirebaseMessaging: Unknown intent action: com.google.firebase.MESSAGING_EVENT

La solution à mon problème est ici :

J'ai rencontré un problème lors de l'utilisation de l'ancienne version de FCM, à savoir 10.2.6 Action d'intention inconnue: com.google.firebase.MESSAGING_EVENT

6
user2983041

1. tl; dr

Vos messages, envoyés de quelque part, doivent avoir un data payloadet nocharge utile de notification), sinon ils n'arriveront pas régulièrement dans "onMessageReceived" dans votre MessagingService.

Les messages de notification contiennent un ensemble prédéfini de clés visibles par l'utilisateur. Les messages de données, en revanche, ne contiennent que vos paires clé-valeur personnalisées définies par l'utilisateur. Les messages de notification peuvent contenir une charge de données facultative. 

("Notification messages can contain an optional data payload", cela ne sera envoyé à votre service, si votre demande est au premier plan!)

  • Les messages créés à partir de la console seront toujours des messages de notification!

  • Vous ne pouvez pas envoyer de messages de données en clair, qui arriveront toujours à votre service via firebase-console. Ceci est uniquement possible via REST-API (protocoles FCM) ou Admin SDK .

Une autre chose importante: 

Si vous envoyez des messages de notification avec une charge de données que vous souhaitez gérer, vous devezle gérer non seulement via le service si l'application est au premier plan, mais également la collecte des données de la intention que votre système de lancement a défini). L'activité recevra, qui sera ouverte si l'utilisateur clique sur la notification! La charge de données sera à l'intérieur de l'intention!


2. Types de messages:

Notification Messageset Messages de données.

  1. Les messages de notification contiennent un ensemble prédéfini de clés visibles par l'utilisateur. Les messages de notification ont un notification payload facultatif et seront Remis à la barre d'état système de l'utilisateur. 

    • Si l'application est au premier plan, ils appellent onMessageReceived, si la notification contient des données utiles. 

    • Si l'application est en arrière-plan, la notification sera affichée et la charge de données est donnée dans le but de l'activité de lancement.

    • Si la notification ne contient pas de charge de données optionnelle, la notification s'affiche et l'application est ouverte lorsque l'utilisateur clique dessus.

  2. Les messages de données ne contiennent que vos paires clé-valeur personnalisées définies par l'utilisateur. (expliqué ci-dessous). Et si vous voulez que le message appelle systématiquement onMessageReceived, ils ne doivent pas contenir une charge de notification, mais une charge de données.

De la docs:

L'application client est responsable du traitement des messages de données. Les messages de données Ont uniquement des paires clé-valeur personnalisées. (! encore une fois - uniquement les paires clé-valeur personnalisées)

Vous pouvez en savoir plus sur les types de messages ici: Fcm Types de messages


3. Données utiles

La charge de données est une simple entrée JSON, en plus de votre charge Et peut avoir une paire clé/valeur simple.

Exemple:

  "data": {
        "eventId" : "1",
        "flavors" : "alpha",
        "minFcmVersion" : "3",
        "showFallbackOnLowVersion" : "false"
  }

À l'intérieur de la console, vous pouvez ajouter la charge de données si vous entrez quelque chose en dessous du champ "options étendues":

enter image description here

Les messages créés à partir de la console seront toujours des notifications-messages!

Commencez par envoyer un message Firebase sur le cloud via la console, directement vers votre périphérique (Utilisez le jeton fcm), puis ajoutez une charge utile de données avec des exemples. Vérifiez maintenant si vos services onMessageReceived sont: appelé. (Votre application doit être au premier plan!)

Backend 

Avec l'API REST, vous pouvez envoyer des messages de données contenant uniquement des paires clé-valeur personnalisées et qui arriveront toujours à votre service!

Votre serveur doit composer le message lui-même et ajouter une charge de données. Ceci est en quelque sorte décrit ici: charge de données du protocole HTTP

Vous pouvez également tester un message envoyé de backend _ _ via un des nombreux Générateurs de requêtes http que vous trouvez en ligne. J'aime: hurl.it et 

Post à:

https://fcm.googleapis.com/fcm/send

4. Gradle

au fait: 'com.google.firebase:firebase-messaging:11.0.4' est sorti maintenant. Il y avait un bogue dans les versions inférieures.

5. Liens et bonne lecture

Vous pouvez également lire la documentation ici: Receive Messages Documentation Et une bonne explication sur les types de message en tant que SOF Réponse: SOF - Réponse - Types de message

11
JacksOnF1re

essayez ci-dessous des cas

  1. Vérifiez que votre service Google Play installé sur votre appareil est à jour. Si ce n'est pas le cas, essayez de update
  2. Assurez-vous que le code de votre serveur Java est dans le bon ordre, par exemple

    HttpResponse response = Unirest.post (" https://fcm.googleapis.com/fcm/send ") .Header ("autorisation", "clé = votre_firebase_key") .header ("content-type", "application/json") .header ("cache-control", "no-cache") .header ("postman-token", " 836e187a-c342-ce8a-3a2d-f541a4d8e416 ") .Body (" {\ r\n\"à \":\"votre_appareil_token \",\r\n\"data \": {\ r\n\"message \":\"Vérification de la pushnotification \"\r\n}\r\n\t\r\n} ") .asString ();

    1. Vérifiez votre log dans la classe FCMService
0
Vinayak B