Firebase onMessageReceived не вызывается, когда приложение находится в фоновом режиме

Я использую Firebase для нашей службы обмена сообщениями в нашем приложении для Android. Я изучил Firebase совсем немного, и я понимаю, что будет ли приложение работать на переднем плане или теперь изменит тип данных, полученных в методе onMessageReceived.

То, что я пытаюсь выполнить, - это проанализировать входящие данные из Remotemessage и сделать что-то другое с ним в зависимости от пользовательского тега. IE, если в карте данных содержится поле под названием "My_Custom_Tag", я хочу полностью переопределить стандартное сообщение firebase, которое появляется и записывает пользовательский.

Проблема в том, что при запуске приложения в фоновом режиме запускается любой код, который я помещаю в onMessageReceived никогда. Он отлично работает, когда приложение работает на переднем плане, но ничего не обнаруживает и не получает, если приложение находится в фоновом режиме.

Вот пример кода ниже:

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    super.onMessageReceived(remoteMessage);

    Map<String, String> aMap = remoteMessage.getData();
    //Custom object here for easier parsing
    PushNotificationsPojo pojo = this.convertResponseToPojo(aMap);

    if(pojo == null){
        passToFirebase(remoteMessage);
        return;
    }

    if(pojo.getData().getCustomTag().equals(PushNotificationsPojo.ID_TAG_CHAT_MESSAGE)) {
        createCustomNotification1(pojo);

    } else if (pojo.getData().getCustomTag().equals(PushNotificationsPojo.ID_TAG_SOME_OTHER_MESSAGE)){
        createCustomNotification2(pojo);

    } else if (pojo.getData().getCustomTag().equals(PushNotificationsPojo.ID_TAG_STUFF_AND_WHATNOT)) {
        createCustomNotification3(pojo);

    } else {
        passToFirebase(remoteMessage);
    }
}

Мой вопрос: как мне перейти на редактирование MyFirebaseMessagingService, чтобы я мог проверять входящие данные, определять информацию о тегах и решать либо передать их на firebase, чтобы он мог использовать стандартную обработку, либо не передавать ее в firebase и написать собственное собственное уведомление о просмотре, пока мое приложение работает в фоновом режиме?

Спасибо всем!

PS, любой шанс Firebase-Dungeon-Master Frank van Puffelen подумать?

Ответ 1

Удалите полезную нагрузку уведомлений из ваших сообщений FCM, чтобы доставить полезную нагрузку данных методу onMessageReceived.

Прочитайте это и это внимательно.

Когда ваше приложение работает в фоновом режиме, данные загружаются в метод onMessageReceived только в том случае, если нет уведомлений. (Отметьте слова)

В случае, когда существуют обе полезные нагрузки, система автоматически обрабатывает часть уведомлений (системный трей), и ваше приложение получает полезную нагрузку данных в дополнениях намерения средства запуска (после нажатия пользователем уведомления).

Чтобы успешно обслуживать обе платформы, Android и iOS, вам, возможно, придется отправлять разные сообщения FCM в соответствии с клиентской ОС.

Ответ 2

Guyz Слушайте внимательно, я прошел через множество ссылок и, наконец, нашел решение здесь.

  • Когда приложение является фоном для методаMessageReceived, вызовите

Эта полезная нагрузка будет работать...

{
  "data":{
    "title": "hello",
    "body": "this is body"
  },
  "to": "c5iuJ7iDnoc:APA91bG6j2c5tiQ3rVR9tBdrCTfDQYxkPwLuNFWzRuGHrBpWiOajR-DKef9EZEEVKA-kUBfXVcqHT-mClYfad06R_rBjhRZFKVdBL7_joXE5hFEwR45Qk8wgQdia2b-LmjI1IheFGZS8"
}

Эта полезная нагрузка не будет работать...

{
  "notification":{
    "title": "hello",
    "body": "this is body"
  },
  "to": "c5iuJ7iDnoc:APA91bG6j2c5tiQ3rVR9tBdrCTfDQYxkPwLuNFWzRuGHrBpWiOajR-DKef9EZEEVKA-kUBfXVcqHT-mClYfad06R_rBjhRZFKVdBL7_joXE5hFEwR45Qk8wgQdia2b-LmjI1IheFGZS8"
}

Потому что когда нагрузка содержит "уведомление" onMessageReceived, не будет вызывать

Ответ 3

В этом сообщении ответ Koot может быть вашим решением. Он сказал "У меня была такая же проблема: проще использовать" сообщение данных "вместо" уведомления ". Сообщение данных всегда загружает класс onMessageReceived."

Мое решение по его совету

{
  "condition": "'reader' in topics",

  "data": {
    "title":"Please Check",
    "message": "This is a Firebase Cloud Messaging Topic Message 5!"
   }
}

Ответ 4

Понятно, что вы уже знаете поведение Android, что при использовании как notification, так и data полезной нагрузки система Android поймает то, что в notification и data полезная нагрузка включена в намерение, когда она постукивает.

AFAIK, это единственный способ, по которому он идет (как указано в @ArthurThompson здесь), и если вы действительно хотите убедиться, что onMessageReceived() всегда вы должны использовать только полезную нагрузку data (как указано @DiegoGiorgini здесь)  Тем не менее, я огляделся, может быть, есть другой способ.

Я сам не пробовал, но вы считали проверку, какие уведомления находятся в строке состояния, тогда, если ваше уведомление существует (не совсем уверен, если вы может фактически определить, какой из них является уведомлением для вашего приложения, хотя), вызовите методы, которые вы обычно вызываете внутри onMessageReceived().

Один из подходов, который вы также можете сделать, - обнаружить, что устройство (ы), на которое вы будете отправлять сообщение, - это устройство Android на вашем сервере приложений, а затем отправить только полезную нагрузку data.