J'ai écrit une application Android très simple pour tester les notifications push de Firebase et je reçois une notification deux fois.
c'est le service manifeste:
<service
Android:name="com.google.firebase.messaging.FirebaseMessagingService">
<intent-filter>
<action Android:name="com.google.firebase.MESSAGING_EVENT"/>
</intent-filter>
</service>
<service
Android:name="com.google.firebase.iid.FirebaseInstanceIdService">
<intent-filter>
<action Android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
</intent-filter>
</service>
c'est le titre de l'application:
compile 'com.google.Android.gms:play-services:9.0.0'
compile 'com.google.firebase:firebase-core:9.0.0'
compile 'com.google.firebase:firebase-messaging:9.0.0'
}
apply plugin: 'com.google.gms.google-services'
et voici le niveau de projet:
classpath 'com.google.gms:google-services:3.0.0'
On dirait que vous utilisez com.google.Android.gms:play-services:9.0.0
(qui inclut play-services-gcm) et com.google.firebase:firebase-messaging:9.0.0
FCM de firebase-massaging enregistre automatiquement un jeton ID d'instance (ID de périphérique). Ainsi, si vous avez une logique qui enregistre un jeton dans votre application, il est probable que vous vous enregistrez deux fois. Cela pourrait expliquer que vous receviez plusieurs notifications. Plus généralement, vous ne devez pas utiliser FCM et GCM dans la même application pour cette raison. Donc, si vous envisagez d’utiliser FCM, vous devez supprimer GCM de votre application.
En outre, play-services inclut toutes les API play-services-x, telles que play-services-gcm et play-services-drive, etc. Utilisez donc toujours les bibliothèques divisées telles que play-services-x plutôt que play-services.
Pour moi, c’était un sdk de troisième partie qui utilisait GCM alors que notre application utilisait FCM. L'enregistrement auprès des deux services vous donnera deux notifications.
(J'appelais également super.onMessageReceived(remoteMessage)
dans FirebaseMessagingService, ce qui a entraîné l'apparition d'une troisième notification:
La réponse acceptée n'a pas fonctionné pour moi. Voici ce qui a fonctionné:
J'ai utilisé data-messages
au lieu de display-messages
afin que, même si l'application est au premier plan ou en arrière-plan, la seule notification apparaisse.
Remplacer
{
"to": "/topics/journal",
"notification": {
"title" : "title",
"text": "data!",
"icon": "ic_notification"
}
}
Avec
{
"to": "/topics/dev_journal",
"data": {
"text":"text",
"title":"",
"line1":"Journal",
"line2":"刊物"
}
}
Référence: Comment gérer les notifications lorsque l'application est en arrière-plan dans firebase
J'avais le même problème lorsque l'application était en arrière-plan ou fermée (et envoyant à la fois des notifications et des données). Causé par la demande d'anciennes autorisations GCM dans AndroidManifest.xml
Jetez un oeil à https://stackoverflow.com/a/44435980/1533285
utiliser dans le fichier de génération compile 'com.google.firebase: firebase-core: 10.2.1', compile 'com.google.firebase: firebase-messaging: 10.2.1' et utilise handleIntent () dans reciver.