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

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

Я пытаюсь проанализировать входящие данные из Remotemessage и сделать что-то другое в зависимости от пользовательского тега. То есть, если на карте данных есть поле с именем "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, есть ли шанс, что Frank van Puffelen задумался?

4 ответа

Решение

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

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

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

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

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

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

  1. Когда приложение является фоновым, метод onMessageReceived должен вызывать

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

{
  "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 не будет вызывать

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

мое решение согласно его совету

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

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

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

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

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

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

Другие вопросы по тегам