android firebase push-notification firebase-cloud-messaging

android - Firebase onMessageReceived no se llama cuando la aplicación está en segundo plano



push-notification firebase-cloud-messaging (4)

Estoy usando Firebase para nuestro servicio de mensajería en nuestra aplicación de Android. He investigado bastante Firebase y entiendo que si la aplicación se ejecuta en primer plano o ahora cambiará el tipo de datos recibidos en el método onMessageReceived .

Lo que estoy tratando de lograr es analizar los datos entrantes del mensaje remoto y hacer algo diferente según la etiqueta personalizada. Es decir, si el Mapa de datos contiene un campo llamado "My_Custom_Tag", quiero anular completamente el mensaje estándar de Firebase que aparece y escribir uno personalizado.

El problema es que, cuando la aplicación se ejecuta en segundo plano, cualquier código que coloque en onMessageReceived nunca se activa. Funciona bien cuando la aplicación se ejecuta en primer plano, pero no detectará / recibirá nada si la aplicación está en segundo plano.

Aquí hay un código de muestra a continuación:

@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); } }

Mi pregunta es, ¿cómo hago para editar MyFirebaseMessagingService para que pueda verificar los datos entrantes, determinar la información de la etiqueta y decidir pasarla a firebase para que pueda usar el manejo estándar o no pasarla a firebase y escribir mi propia notificación de visualización personalizada todo mientras mi aplicación se ejecuta en segundo plano?

¡Gracias a todos!

PD: ¿hay alguna posibilidad de que el maestro de la mazmorra de Firebase Frank van Puffelen lo piense?


Bastante seguro, ya conoce el comportamiento en Android de que cuando se utiliza la notification y data carga de data , el sistema Android capta lo que hay en la notification y la carga de data se incluye en la intención cuando se toca.

AFAIK, esta es la única forma en que funciona (según lo mencionado por @ArthurThompson here ) y si realmente desea asegurarse de que siempre se llame a onMessageReceived() , solo debe usar data carga útil de data (como se menciona here por @DiegoGiorgini) Sin embargo, he mirado a mi alrededor, tal vez hay otra forma.

No lo he probado yo mismo, pero ¿ha considerado verificar qué notificaciones están en la barra de estado? Entonces, si su notificación existe ( no del todo seguro si puede identificar cuál es realmente una notificación para su aplicación ), llame a los métodos generalmente llamas dentro de onMessageReceived() .

Un enfoque que también puede hacer es detectar si los dispositivos a los que enviará el mensaje es un dispositivo Android en su servidor de aplicaciones, y luego enviar solo una carga de data .


Elimine la carga de notificación de sus mensajes de FCM para que la carga de datos se entregue al método onMessageReceived.

Lea this y this cuidadosamente.

Cuando su aplicación está en segundo plano, la carga de datos se entrega al método onMessageReceived solo si no hay una carga de notificación . ( Marque las palabras )

En caso de que existan ambas cargas útiles, el sistema maneja automáticamente la parte de notificación (bandeja del sistema) y su aplicación obtiene la carga útil de datos en los extras de la intención de la Actividad del iniciador (después de que el usuario toque la notificación).

Para poder servir ambas plataformas con éxito, Android e iOS, es posible que tenga que enviar diferentes mensajes FCM de acuerdo con el sistema operativo del cliente.


En esta post , la respuesta de Koot podría ser su solución. Él dijo: "Tuve el mismo problema. Es más fácil usar el ''mensaje de datos'' en lugar de la ''notificación''. El mensaje de datos siempre carga la clase en MessageReceived".

mi solución es según su consejo

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


Guyz Escucha con atención, revisé muchos enlaces y finalmente encontré la solución aquí.

  1. Cuando la aplicación está en segundo plano, el método de mensaje recibido debe llamar

Esta carga útil funcionará ...

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

Esta carga útil no funcionará ...

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

Porque cuando la carga contiene "notificación" onMessageReceived no llamará