web-dev-qa-db-fra.com

Base de données de mise à jour des notifications Push de Firebase

J'essaie d'envoyer des données à mes utilisateurs via le nouveau service de notifications Firebase Push.

J'ajoute des éléments de données personnalisés "valeur-clé" avec "Texte du message" - "dbupdate" pour détecter s'il s'agit d'un message de mise à jour ou d'une notification Push normale que je souhaite montrer à mes utilisateurs. 

Dans mon récepteur, je vérifie s’il ya des données personnalisées et lance la mise à jour, si vrai. Si ce n’est pas le cas, j’affiche une notification normale avec le message texte.

Cela ne fonctionne que lorsque mon application est ouverte. Si l'application est fermée, la notification est quand même affichée, et ma si check ne s'exécute même pas,  

un code:

public class PushMessageService extends FirebaseMessagingService {
    @Override
    public void onMessageReceived(RemoteMessage remoteMessage) {
        super.onMessageReceived(remoteMessage);
        Map<String,String> data = remoteMessage.getData();
        String link = data.get("link");
        String name = data.get("name");
        if (link!=null) {
            Log.d("link",link);
            Log.d("name",name);
            UpdateHelper.Go(this, link, name);
        }
        else {
            NotificationCompat.Builder mBuilder =
                    new NotificationCompat.Builder(this)
                            .setSmallIcon(R.drawable.ic_shop_white_24dp)
                            .setAutoCancel(true)
                    .setContentTitle(remoteMessage.getNotification().getTitle())
                   .setContentText(remoteMessage.getNotification().getBody());
            NotificationManager mNotificationManager =
                    (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
            mNotificationManager.notify(5, mBuilder.build());
        }
    }
}

exemple notficiation ici

Pourquoi est-ce si? Que puis-je faire pour exécuter mon code même lorsque l'application est fermée?

6
Nirel

D'après mon expérience avec Firebase Push: 

Problème: Lors de l'envoi d'une notification Push via la "console Firebase", la notification n'est reçue que lorsque l'application est au premier plan. Si l'application est supprimée ou en arrière-plan, la notification s'affiche uniquement dans Version> = Lollipop avec une icône de notification incorrecte et/ou en ouvrant l'activité de lancement par défaut dans l'application même si vous avez défini une activité différente dans PendingIntent.

Selon la documentation Firebase, un message Push est divisé en 2 parties, elles sont appelées comme suit:Lien vers la documentation ici

  1. notification
  2. données utiles

 enter image description here

Solution:

Il existe deux manières d’envoyer un message "Push". 

1. Console Firebase 

 Console

2. API de messagerie - Image illustrant une demande utilisant Advanced REST Client

 Curl Request

Le message push est reçu dans la méthode onMessageReceived(...). La méthode Firebase onMessageReceived(...) sera pas appelée si l'application est dans background ou est tuée uniquement lorsque le message est envoyé via la console Firebase. 

Si vous envoyez le message via une API, cela fonctionne bien. Le message est remis dans la méthode onMessageReceived(...) si l'application est en arrière-plan, au premier plan ou supprimée. (Attention: Ceci fonctionne très bien dans >=Lollipop - Le comportement pour Android 4.4 ou inférieur est toujours imprévisible.

Mettre à jour: 

Vous pouvez envoyer un message Push à partir de l'API (Firebase l'appelez en aval msg) comme ceci: https://firebase.google.com/docs/cloud-messaging/downstream

Envoi de messages en aval du serveur

Pour adresser ou "cibler" un message en aval, le serveur d'applications définit le jeton d'enregistrement de l'application cliente destinataire. Vous pouvez envoyer des messages de notification avec des champs prédéfinis ou des messages de données personnalisés. voir Notifications et données dans le message charge utile pour plus de détails sur la prise en charge de la charge utile. Les exemples de cette page montrent comment envoyer des messages de données dans les protocoles HTTP et XMPP.

Requête HTTP POST

https://fcm.googleapis.com/fcm/send
Content-Type:application/json
Authorization:key=AIzaSyZ-1u...0GBYzPu7Udno5aA

{ "data": {
    "score": "5x1",
    "time": "15:10"
  },
  "to" : "bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1..."
}
23
Hisham Muneer

Lorsque votre application est au premier plan, les notifications sont transmises à FirebaseMessagingService.onMessageReceived(). Lorsque l'application n'est pas au premier plan, la notification sera traitée par le centre de notification par défaut.

Regarde aussi:

2
Frank van Puffelen

Sous Android , si vous souhaitez mettre à jour quelque chose dans l'application, que celle-ci soit en état de fond, d'arrière-plan/terminé, la meilleure méthode consiste à supprimer la charge de notification et à n'envoyer que la charge de données. 

{ 
 "to" : "ee8....DYarin",
    "data" : {
         "key" : "value"
    }   
}

Dans ce cas, onMessageReceived() sera exécuté. (Sur certains appareils Android comme xiomi, vous devez activer le démarrage automatique pour que votre application puisse traiter les états terminés du Push in).

Dans ce cas, comment allez-vous afficher une notification à l'utilisateur? Vous pouvez transmettre le titre et le corps en tant que balises personnalisées dans la charge de données et générer une notification de manière programmée. Donc, dans Android, tout se passe bien sans charge de notification.


Et si vous avez une charge de notification dans Android, les problèmes sont les suivants:

  • Si l'application est dans le sol, tout va bien, la notification est affichée Et onMessageReceived () est exécuté
  • Si l'application est en arrière-plan/terminée, la notification sera affichée sur votre appareil, mais OnMessageReceived () ne fonctionnera que si vous cliquez sur la notification. Les utilisateurs ont tendance à les effacer souvent. et notre code dans onMessageReceived () ne sera pas exécuté.

De plus, pour activer cette fonctionnalité de clic lors de la notification, la charge de notification doit contenir la clé nommée click_action:

"notification":{
        "title":"Prime",
        "body" : "test",
         "click_action": "my_click_action_name"
}

Et vous devez enregistrer l'action en tant que intent_filter in your activity

 <intent-filter>
                <action Android:name="my_click_action_name" />
                <category Android:name="Android.intent.category.DEFAULT" />
 </intent-filter>

Chaque fois que l'utilisateur clique sur la notification, la méthode onNewIntent() de l'activité correspondante est appelée et la charge utile des données est disponible dans la intent.getExtras() correspondante

1
mustaq