Согласно документации :
Если вы хотите, чтобы фоновые приложения получали уведомления или сообщения с данными, вам нужно написать код для обработки обратного вызова onMessageReceived.
Что у меня есть:
- У меня есть служба, расширяющая
FirebaseMessagingService
и переопределяющая onMessageReceived
, как описано в документации (также в манифесте и разрешениях). - Полезная нагрузка сообщения находится на карте
data
, а объект notification
равен нулю (как и ожидалось). - Уведомления, когда приложение работает в фоновом режиме, работают так, как задумано. .
- Сообщения отправляются SendBird (стороннее решение для чата). И все нормально с их стороны и в других наших реализациях клиентов (ios, web и backend)
Проблема в том, что когда приложение находится на переднем плане, обратный вызов onMessageReceived
не называется.
Я что-то упустил? Не должна ли одна и та же служба обрабатывать оба состояния приложения для полученных сообщений? Я не хочу показывать уведомление системной панели, когда приложение уже открыто, но я хочу изменить некоторые элементы пользовательского интерфейса, чтобы указать пользователю, что у него есть новые сообщения в чате.
Вот код:
Служба:
class ChatMessagingService : FirebaseMessagingService() {
override fun onMessageReceived(remoteMessage: RemoteMessage) {
super.onMessageReceived(remoteMessage)
Timber.e("----------- MESSAGE RECEIVED -------------")
displayNotification(remoteMessage)
sendBroadcastToActivity(remoteMessage) //
}
}
в манифесте
<service
android:name=".notifications.ChatMessagingService"
android:exported="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
firebase & gcm version
implementation 'com.google.android.gms:play-services-gcm:17.0.0'
implementation 'com.google.firebase:firebase-core:17.2.1'
implementation 'com.google.firebase:firebase-messaging:20.1.0'
Спасибо всем заранее
edit, этот метод требовался для комментатора, но он даже не дошел до него, поэтому я не думаю, что это проблема.
private fun sendBroadcastToActivity(remoteMessage: RemoteMessage) {
val messageData = Gson().fromJson<SendBirdPNPayload>(remoteMessage.data["sendbird"], SendBirdPNPayload::class.java)
Intent(MESSAGE_RECEIVED_ACTION).also { intent ->
intent.putExtra("message_id", messageData.messageId)
LocalBroadcastManager.getInstance(this).sendBroadcast(intent)
}
}