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 в соответствии с ОС клиента.
Слушай внимательно, я перебрал много ссылок и наконец нашел решение здесь.
- Когда приложение является фоновым, метод 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
полезная нагрузка.