Notifications Firebase FCM click_action payload

J’essaie d’ouvrir une activité particulière lorsque l’utilisateur clique sur la notification lorsque l’application est en arrière-plan. À partir de Docs, je dois append que click_action doit être ajouté à la charge utile et un filtre d’intention dans l’application pour le gérer. Mais, comment append click_action dans les notifications Firebase via Firebase Console? Je suis ouvert à tout autre travail autour. Merci d’avance.

Si votre application est en arrière-plan, Firebase ne déclenchera pas onMessageReceived (). Pourquoi…..? Je n’ai aucune idée. Dans cette situation, je ne vois aucun intérêt à implémenter FirebaseMessagingService.

Selon docs, si vous souhaitez traiter l’arrivée du message d’arrière-plan, vous devez envoyer le message “click_action”. Mais ce n’est pas possible si vous envoyez un message depuis la console Firebase, uniquement via l’API Firebase. Cela signifie que vous devrez créer votre propre “console” afin de permettre aux professionnels du marketing de l’utiliser. Donc, cela rend la console Firebase également tout à fait inutile!

Il y a vraiment une bonne idée, prometteuse, derrière ce nouvel outil, mais mal exécutée.

Je suppose que nous devrons attendre de nouvelles versions et améliorations / corrections!

Autant que je sache, à ce stade, il n’est pas possible de définir click_action dans la console.

Bien que ce ne soit pas une réponse ssortingcte à la manière de définir l’action click_action dans la console, vous pouvez utiliser curl comme alternative:

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\"}}" 

C’est un moyen facile de tester le mappage de click_action. Il nécessite un filtre d’intention tel que celui spécifié dans les documents FCM:

     

Vous pouvez gérer toutes vos actions en fonction de votre message dans onMessageReceived () dans votre service qui étend FirebaseMessagingService. Pour ce faire, vous devez envoyer un message contenant exclusivement des données, en utilisant par exemple le client Advanced REST dans Chrome . Ensuite, vous envoyez un message POST sur https://fcm.googleapis.com/fcm/send en utilisant “Raw headers”:

Type de contenu: application / json Autorisation: key = YOUR_PERSONAL_FIREBASE_WEB_API_KEY

Et un message json dans le champ “Charge utile brute”.

Attention, s’il y a le champ “notification” dans votre json, votre message ne sera jamais reçu quand l’application en arrière-plan dans onMessageReceived (), même s’il y a un champ de données! Par exemple, en faisant cela, le message fonctionne uniquement si l’application au premier plan:

 { "condition": " 'Symulti' in topics || 'SymultiLite' in topics", "priority" : "normal", "time_to_live" : 0, "notification" : { "body" : "new Symulti update !", "title" : "new Symulti update !", "icon" : "ic_notif_symulti" }, "data" : { "id" : 1, "text" : "new Symulti update !" } } 

Pour recevoir votre message dans tous les cas dans onMessageReceived (), supprimez simplement le champ “notification” de votre json!

Exemple:

 { "condition": " 'Symulti' in topics || 'SymultiLite' in topics", "priority" : "normal", "time_to_live" : 0,, "data" : { "id" : 1, "text" : "new Symulti update !", "link" : "href://www.symulti.com" } } 

et dans votre FirebaseMessagingService:

 public class MyFirebaseMessagingService extends FirebaseMessagingService { private static final Ssortingng TAG = "MyFirebaseMsgService"; @Override public void onMessageReceived(RemoteMessage remoteMessage) { Ssortingng message = ""; obj = remoteMessage.getData().get("text"); if (obj != null) { try { message = obj.toSsortingng(); } catch (Exception e) { message = ""; e.printStackTrace(); } } Ssortingng link = ""; obj = remoteMessage.getData().get("link"); if (obj != null) { try { link = (Ssortingng) 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 Ssortingng 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(getSsortingng(R.ssortingng.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"); } } } } 

Prendre plaisir !

Cela entre dans la catégorie de solution de contournement, contenant également des informations supplémentaires:

Les notifications étant gérées différemment selon l’état de l’application (avant-plan / arrière-plan / non lancé), j’ai vu la meilleure façon d’implémenter une classe d’assistance où l’activité sélectionnée est lancée en fonction des données personnalisées envoyées dans le message de notification.

  • lorsque l’application est au premier plan, utilisez la classe d’assistance dans onMessageReceived
  • lorsque l’application est en arrière-plan, utilisez la classe auxiliaire pour gérer l’intention dans onNewIntent de l’activité principale (vérifiez les données personnalisées spécifiques)
  • lorsque l’application ne s’exécute pas, utilisez la classe d’assistance pour gérer l’intention dans l’activité onCreate de l’activité principale (appelez getIntent pour l’intention).

De cette façon, vous n’avez pas besoin du filtre click_action ou intent spécifique. En outre, vous écrivez le code une seule fois et pouvez raisonnablement démarrer toute activité.

Les données personnalisées minimales ressemblent donc à ceci:

 Key: run_activity Value: com.mypackage.myactivity 

Et le code pour le traiter:

 if (intent.hasExtra("run_activity")) { handleFirebaseNotificationIntent(intent); } private void handleFirebaseNotificationIntent(Intent intent){ Ssortingng className = intent.getSsortingngExtra("run_activity"); startSelectedActivity(className, intent.getExtras()); } private void startSelectedActivity(Ssortingng className, Bundle extras){ Class cls; try { cls = Class.forName(className); }catch(ClassNotFoundException e){ ... } Intent i = new Intent(context, cls); if (i != null) { i.putExtras(extras); this.startActivity(i); } } 

C’est le code pour les deux derniers cas, startSelectedActivity serait également appelé à partir de onMessageReceived (premier cas).

La limitation est que toutes les données dans les extras d’intention sont des chaînes, vous devrez peut-être gérer cela d’une manière ou d’une autre dans l’activité elle-même. En outre, cela est simplifié, vous ne pouvez probablement pas modifier l’activité / la vue sur une application qui est au premier plan sans avertir votre utilisateur.

Eh bien, cela ressort clairement de docs firebase que votre onMessageReceived ne fonctionnera pas lorsque l’application est en arrière-plan.

Lorsque votre application est en arrière-plan et cliquez sur votre notification, votre lanceur par défaut sera lancé. Pour lancer l’activité souhaitée, vous devez spécifier click_action dans votre charge de notification.

 $noti = array ( 'icon' => 'new', 'title' => 'title', 'body' => 'new msg', 'click_action' => 'your activity name comes here' ); 

Et dans votre fichier android.manifest

Ajoutez le code suivant à l’endroit où vous avez enregistré votre activité

        

Si votre application est en arrière-plan, Firebase ne déclenchera pas onMessageReceived (). onMessageReceived () est appelée lorsque l’application est au premier plan. Lorsque l’application est en arrière-plan, la méthode onMessageReceived () ne sera appelée que si le corps de https://fcm.googleapis.com/fcm/send ne contient que des données payload.Here, je viens de créer une méthode pour créer une notification personnalisée avec l’intention de ur votre activité requirejse. et appelé cette méthode dans onMessageRecevied ().

Dans PostMan:

uri: https://fcm.googleapis.com/fcm/send

header: Autorisation: key = ur key

corps — >>

 { "data" : { "Nick" : "Mario", "Room" : "PoSDenmark", }, "to" : "xxxxxxxxx" } 

dans votre application.

 class MyFirebaseMessagingService extends FirebaseMessagingService { public void onMessageReceived(RemoteMessage remoteMessage) { if (remoteMessage.getData().size() > 0) { sendNotification("ur message body") ; } } private void sendNotification(Ssortingng messageBody) { Intent intent = new Intent(this, Main2Activity.class); intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent, PendingIntent.FLAG_ONE_SHOT); Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) .setSmallIcon(R.drawable.ic_stat_ic_notification) .setContentTitle("FCM Message") .setContentText(messageBody) .setAutoCancel(true) .setSound(defaultSoundUri) .setContentIntent(pendingIntent); NotificationManager notificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); notificationManager.notify(0 /* ID of notification */, notificationBuilder.build()); } } 

Lorsque la charge de données arrive sur le mobile, la méthode onMessageReceived () sera appelée. Dans cette méthode, je viens de faire une notification personnalisée. Cela fonctionnera même si votre application est en arrière-plan ou en avant-plan.

Mettre à jour:

Donc, pour vérifier, il n’est actuellement pas possible de définir le paramètre click_action via la console Firebase.


Donc, j’ai essayé de faire cela dans la console Notifications Firebase sans succès. Comme je n’arrive pas à trouver n’importe où pour placer la valeur de click_action dans la console, ce que j’ai principalement fait pour tester cela, c’est d’append une paire clé / valeur personnalisée dans la Notification (Options avancées> Données personnalisées):

 Key: click_action Value:  

puis essayé d’appeler RemoteMessage.getNotification (). getClickAction () dans onMessageReceived() pour voir s’il récupérait la valeur correcte, mais il renvoie toujours null . Ensuite, j’ai essayé d’appeler RemoteMessage.getData (). Get () et j’ai pu récupérer la valeur ajoutée.

REMARQUE : Je ne suis pas tout à fait certain si cela peut être utilisé comme solution de contournement, ou s’il est contraire aux meilleures pratiques. Je suggère d’utiliser votre propre serveur d’applications, mais votre message est spécifique à la console Firebase.

Le comportement de l’application client et de la notification dépend toujours de la manière dont vous la programmez. Cela dit, je pense que vous pouvez utiliser ce qui précède comme solution de contournement, en utilisant la valeur extraite de la getData() , puis en appelant la notification ceci ou cela. J’espère que ça aide en quelque sorte. À votre santé! :RÉ

Il est maintenant possible de définir click_action dans Firebase Console. Vous accédez simplement à l’option notifications-send message-advanced et vous avez deux champs pour key et value. Dans le premier champ, vous placez click_action et en second lieu, vous mettez du texte qui représente la valeur de cette action. Et vous ajoutez un filtre d’intention dans votre manifeste et lui donnez la même valeur que vous avez écrit dans la console. Et c’est la simulation du vrai click_action.

Je cherche cette Firebase est, le développement de la notification push de messagerie de nuage google fondamental afin que nous puissions utiliser le tutoriel gcm, fonction et implémentation dans firebase, j’utilise funtion de la fonction de notification push gcm pour résoudre ce problème click_action j’utilise la fonction gcm **

‘notificationclick’

** Essayez cette URL de sauvegarde click_action dans la variable URL c’est dans server-worker.js

 var url = ""; messaging.setBackgroundMessageHandler(function(payload) { console.log('[firebase-messaging-sw.js] Received background message ', payload); // Customize notification here url = payload.data.click_action; const notificationTitle = payload.data.title; const notificationOptions = { body: payload.data.body , icon: 'firebase-logo.png' }; return self.registration.showNotification(notificationTitle, notificationOptions); }); //i got this in google cloud messaging push notification self.addEventListener('notificationclick', function (event) { event.notification.close(); var clickResponsePromise = Promise.resolve(); clickResponsePromise = clients.openWindow(url); event.waitUntil(Promise.all([clickResponsePromise, self.analytics.trackEvent('notification-click')])); });