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
Это сработало для меня, спасибо