Necesitamos tu ayuda para difundir nuestros ensayos acerca de las ciencias informáticas.
Solución:
Si su aplicación está en segundo plano, Firebase no activará onMessageReceived(). Por qué…..? No tengo ni idea. En esta situación, no veo ningún sentido en implementar FirebaseMessagingService.
De acuerdo con los documentos, si desea procesar la llegada del mensaje en segundo plano, debe enviar ‘click_action’ con su mensaje. Pero no es posible si envía un mensaje desde la consola de Firebase, solo a través de la API de Firebase. Significa que tendrá que construir su propia “consola” para permitir que la gente de marketing la use. Entonces, ¡esto hace que la consola Firebase también sea bastante inútil!
Hay una idea realmente buena y prometedora detrás de esta nueva herramienta, pero mal ejecutada.
¡Supongo que tendremos que esperar nuevas versiones y mejoras/arreglos!
Por lo que puedo decir, en este momento no es posible configurar click_action en la consola.
Si bien no es una respuesta estricta sobre cómo configurar click_action en la consola, puede usar curl como alternativa:
curl --header "Authorization: key=" --header Content-Type:"application/json" https://fcm.googleapis.com/fcm/send -d ""to":"/topics/news","notification": "title": "Click Action Message","text": "Sample message","click_action":"OPEN_ACTIVITY_1""
Esta es una manera fácil de probar el mapeo click_action. Requiere un filtro de intenciones como el especificado en los documentos de FCM:
Esto también hace uso de temas para establecer la audiencia. Para que esto funcione, deberá suscribirse a un tema llamado “noticias”.
FirebaseMessaging.getInstance().subscribeToTopic("news");
Aunque lleva varias horas ver un tema recién creado en la consola, aún puede enviarle mensajes a través de las API de FCM.
Además, tenga en cuenta que esto solo funcionará si la aplicación está en segundo plano. Si está en primer plano, deberá implementar una extensión de FirebaseMessagingService. En el método onMessageReceived, deberá navegar manualmente hasta su destino click_action:
@Override
public void onMessageReceived(RemoteMessage remoteMessage)
//This will give you the topic string from curl request (/topics/news)
Log.d(TAG, "From: " + remoteMessage.getFrom());
//This will give you the Text property in the curl request(Sample Message):
Log.d(TAG, "Notification Message Body: " + remoteMessage.getNotification().getBody());
//This is where you get your click_action
Log.d(TAG, "Notification Click Action: " + remoteMessage.getNotification().getClickAction());
//put code here to navigate based on click_action
Como dije, en este momento no puedo encontrar una manera de acceder a las propiedades de la carga de notificación a través de la consola, pero pensé que esta solución podría ser útil.
Puede manejar todas sus acciones en función de su mensaje en onMessageReceived() en su servicio que extiende FirebaseMessagingService. Para hacer eso, debe enviar un mensaje que contenga exclusivamente datos, utilizando, por ejemplo, el cliente REST avanzado en Chrome. Luego envía un POST a https://fcm.googleapis.com/fcm/send usando “Encabezados sin procesar”:
Tipo de contenido: application/json Autorización: key=TU_PERSONAL_FIREBASE_WEB_API_KEY
Y un mensaje json en el campo “Carga útil sin procesar”.
Advertencia, si existe el campo “notificación” en su json, su mensaje nunca se recibirá cuando la aplicación esté en segundo plano en onMessageReceived(), ¡incluso si hay un campo de datos! Por ejemplo, al hacer eso, el mensaje funciona solo si la aplicación está en primer plano:
"condition": " 'Symulti' in topics
Para recibir su mensaje en todos los casos en onMessageReceived(), ¡simplemente elimine el campo de “notificación” de su json!
Ejemplo:
"condition": " 'Symulti' in topics
y en su FirebaseMessagingService:
public class MyFirebaseMessagingService extends FirebaseMessagingService
private static final String TAG = "MyFirebaseMsgService";
@Override
public void onMessageReceived(RemoteMessage remoteMessage)
String message = "";
obj = remoteMessage.getData().get("text");
if (obj != null)
try
message = obj.toString();
catch (Exception e)
message = "";
e.printStackTrace();
String link = "";
obj = remoteMessage.getData().get("link");
if (obj != null)
try
link = (String) obj;
catch (Exception e)
link = "";
e.printStackTrace();
Intent intent;
PendingIntent pendingIntent;
if (link.equals("")) // Simply run your activity
intent = new Intent(this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
else // open a link
String url = "";
if (!link.equals(""))
intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(link));
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
PendingIntent.FLAG_ONE_SHOT);
NotificationCompat.Builder notificationBuilder = null;
try
notificationBuilder = new NotificationCompat.Builder(this)
.setSmallIcon(R.drawable.ic_notif_symulti) // don't need to pass icon with your message if it's already in your app !
.setContentTitle(URLDecoder.decode(getString(R.string.app_name), "UTF-8"))
.setContentText(URLDecoder.decode(message, "UTF-8"))
.setAutoCancel(true)
.setSound(RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION))
.setContentIntent(pendingIntent);
catch (UnsupportedEncodingException e)
e.printStackTrace();
if (notificationBuilder != null)
NotificationManager notificationManager =
(NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
notificationManager.notify(id, notificationBuilder.build());
else
Log.d(TAG, "error NotificationManager");
}
Disfrutar !