5

Ho scritto un'app Android molto semplice per testare la notifica push di Firebase e ottengo una notifica due volte.Firebase invia notifica push due volte

questo è il servizio manifesta:

<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> 

questo è il Gradle app:

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' 

e qui è il Gradle livello di progetto:

classpath 'com.google.gms:google-services:3.0.0' 
+0

Potrebbe fornirci un codice porzione in cui viene gestita la messaggistica ?. L'errore potrebbe essere da quella parte. –

+0

@isnotmenow questo è tutto il codice relativo a firebase tranne google-services.json –

+0

ci dovrebbe essere un servizio di classe di ricezione nel tuo codice android, qualcosa come MyFirebaseMessagingService.java. –

risposta

6

Sembra che tu sei utilizzando com.google.android.gms:play-services:9.0.0 (che include play-services-gcm) e com.google.firebase:firebase-messaging:9.0.0

FCM da firebase-massaging registra automaticamente un token ID di istanza (ID dispositivo), quindi se si dispone di una logica che registra un token nella propria app è probabile che ci si stia registrando due volte. Questo potrebbe comportare la ricezione di più notifiche. Più in generale, tuttavia, non è necessario utilizzare FCM e GCM nella stessa app esattamente per questo motivo. Quindi, se stai per utilizzare FCM, devi rimuovere GCM dalla tua app.

Inoltre, l'utilizzo dei servizi di gioco include tutte le API di giochi-servizi-x come i servizi di gioco-gcm e play-services-drive, ecc. Quindi usa sempre le librerie di split come play-services-x invece che solo play- Servizi.

+0

Se il dispositivo è registrato due volte in un'app di produzione. Si prega di suggerire una soluzione per questo? – Nitin

+0

Devi anche assicurarti di pulire la tua build per rimuovere tutte le classi relative a GCM Questo ha funzionato per me https://stackoverflow.com/questions/48785262/receiving-the-fcm-notifications-multiple-times-on-nougat/49177709 # 49177709 – amitfr

1

La risposta accettata non ha funzionato per me. Di seguito è stato illustrato il funzionamento:

Ho utilizzato data-messages anziché display-messages in modo che, anche se l'app è in primo piano o sullo sfondo, verrà visualizzata l'unica notifica singola.

Sostituire

{ 
     "to": "/topics/journal", 
     "notification": { 
     "title" : "title", 
     "text": "data!", 
     "icon": "ic_notification" 
     } 
} 

Con

{ 
    "to": "/topics/dev_journal", 
    "data": { 
     "text":"text", 
     "title":"", 
     "line1":"Journal", 
     "line2":"刊物" 
    } 
} 

Riferimento: How to handle notification when app in background in firebase

2

Per me è stato uno SDK 3 ° partito che stava usando GCM mentre la nostra applicazione stava usando FCM. La registrazione con entrambi i servizi ti darà due notifiche.

(Anche io chiamavo super.onMessageReceived(remoteMessage) nel mio FirebaseMessagingService causando una terza notifica di apparire: p

+0

sembra che un terzo sdk di partito usi GCM e non so chi: D come trovarlo? –

+0

Usa logica. La maggior parte delle librerie non ha bisogno di GCM. Grandi servizi (a pagamento) con pannelli di amministrazione o con la chat integrata. Cose come Parse, Intercom, servizi di pagamento ecc. Potrebbero usarlo. –

+0

Inoltre: verifica questa domanda: http://stackoverflow.com/questions/21645071/using-gradle-to-find-dependency-tree –

0

ho avuto lo stesso problema quando l'applicazione è in background o chiuso (e l'invio sia di notifica e dati) causato da richiedente. le vecchie concessioni GCM in AndroidManifest.xml

Date un'occhiata a https://stackoverflow.com/a/44435980/1533285

0

uso nella costruzione di compilazione del file Gradle 'com.google.firebase: Firebase-core: 10.2.1', compilano 'com.google.firebase: firebase-messaging: 10.2.1 'e utilizzare handleIntent() nel ricevitore.