Android Сообщение GCM не вызывает onMessageReceived, когда приложение находится на переднем плане - PullRequest
0 голосов
/ 08 января 2020

Согласно документации :

Если вы хотите, чтобы фоновые приложения получали уведомления или сообщения с данными, вам нужно написать код для обработки обратного вызова 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)
    }
}

Ответы [ 2 ]

0 голосов
/ 09 января 2020

Спасибо всем за попытку помочь. Мы обнаружили, что это не проблема с нашим кодом, все было так, как и должно быть. Стороннее решение для чата не будет отправлять уведомление pu sh, если пользователь подключен к чату (через sdk) и приложение находится на переднем плане. Поэтому мы должны использовать другой метод для внесения изменений в пользовательский интерфейс.

Опять же, спасибо всем за попытку помочь!

0 голосов
/ 08 января 2020

Имя класса, которое расширяет FirebaseMessagingService, и имя службы, которое вы определяете в своем манифесте. xml отличается. Попробуйте это:

<service
    android:name = ".ChatMessagingService"
    android:stopWithTask="false">
    <intent-filter>
         <action android:name="com.google.firebase.MESSAGING_EVENT" />
    </intent-filter>
</service>
...