Firebase отправляет push-уведомление дважды

Я написал очень простое приложение для Android, чтобы протестировать уведомление pushbase, и дважды получаю одно уведомление.

это проявленная услуга:

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

это приложение gradle:

    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'

и вот уровень проекта gradle:

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

Ответ 1

Похоже, вы используете com.google.android.gms:play-services:9.0.0 (который включает в себя play-services-gcm) и com.google.firebase:firebase-messaging:9.0.0

FCM из firebase-massaging автоматически регистрирует токен идентификатора экземпляра (идентификатор устройства), поэтому, если у вас есть логика, которая регистрирует токен в вашем приложении, вероятно, вы регистрируетесь дважды. Это может объяснять получение нескольких уведомлений. В более общем плане, хотя вы не должны использовать FCM и GCM в том же приложении именно по этой причине. Поэтому, если вы собираетесь использовать FCM, вы должны удалить GCM из своего приложения.

Кроме того, использование игровых сервисов включает в себя все API-интерфейсы play-services-x, такие как play-services-gcm и play-services-drive и т.д. Поэтому всегда используйте расщепленные библиотеки, такие как play-services-x, а не только игровые сервисы.

Ответ 2

Для меня это был 3-й партийный sdk, который использовал GCM, в то время как наше приложение использовало FCM. Регистрация с помощью обеих служб даст вам два уведомления.

(Также я вызывал super.onMessageReceived(remoteMessage) в моем FirebaseMessagingService, вызывая появление третьего уведомления: p

Ответ 3

Принятый ответ не помог мне. Ниже приведена работа:

Я использовал data-messages вместо display-messages, так что даже если приложение находится на переднем плане или в фоновом режиме, появится только одно уведомление.

Заменить

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

С

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

Ссылка: Как обрабатывать уведомление приложением в фоновом режиме в firebase

Ответ 4

У меня была такая же проблема, когда приложение находилось в фоновом режиме или закрыто (и отправляло оба уведомления и данные). Вызывается путем запроса старых разрешений GCM в AndroidManifest.xml

Взгляните на fooobar.com/questions/1007478/...

Ответ 5

использовать в сборке gradle file compile 'com.google.firebase: firebase-core: 10.2.1', compile 'com.google.firebase: firebase-messaging: 10.2.1' и использовать handleIntent() в reciver.

Ответ 6

То же самое происходило со мной, я все тщетно перепробовал

Затем я понял, что мы храним все токены fcm устройства Android от начала до конца, не проверяя и не удаляя их.

Я удалил все токены fcm и повторно вошел в свое приложение, которое вставило новый токен в список токенов FCM в моей базе данных сервера.

Это работало нормально, я думаю, что FCM должен сделать недействительными более ранние токены, прежде чем выпускать новые, даже между установками, несколькими apk и несколькими сеансами отладки apk

Попробуйте отправить только 1 токен, также очистите сборку и переустановите приложение

Ответ 7

Я должен был удалить

<receiver android:name="com.google.android.gms.gcm.GcmReceiver" 
android:exported="true" android:permission="com.google.android.c2dm.permission.SEND"> 
  <intent-filter> <action android:name="com.google.android.c2dm.intent.RECEIVE" /> 
  <category android:name="${applicationId}" /> 
  </intent-filter> 
</receiver>

из AndroidManifest.xml

Это сработало для меня, спасибо