web-dev-qa-db-fra.com

Application ouverte sur la notification firebase reçue (FCM)

Je souhaite ouvrir l'application automatiquement lorsque la notification est reçue. Est-ce possible avec Firebase et les nouvelles notifications FCM?

Je sais que je peux définir click_action, mais ce n'est que pour personnaliser l'activité qui va démarrer lorsque vous cliquez sur la notification. J'ai besoin de quelque chose qui démarre automatiquement lorsque la notification est reçue.

J'ai essayé l'exemple de démarrage rapide de la messagerie firebase et il existe une méthode onMessageReceived (), mais cela ne fonctionne que si l'application est au premier plan. Y a-t-il quelque chose qui s'exécutera pendant que l'application est également en arrière-plan? GCM pourrait faire quelque chose comme ce que je veux ici en démarrant directement l’intention d’activité du récepteur de diffusion appelée lorsque la notification est reçue.

30
stevyhacker

Réponse rapide:

Pour ouvrir automatiquement une application via FCM, vous devez utiliser un data-message, Qui garantit de toujours invoquer la méthode FirebaseMessagingService.onMessageReceived().

Ensuite, vous pouvez ajouter votre logique dans la méthode .onMessageReceived() pour démarrer l'activité préférée.

ATTENTION: lancer une interface utilisateur sans interaction de l'utilisateur est une très très mauvaise pratique pour la plupart des applications! Veuillez lire le MarkG répondre ici: Comment démarrer une activité à partir d'un service?

[...] Interrompre ce que l'utilisateur est en train de faire est considéré comme une mauvaise forme, en particulier par quelque chose qui est supposé fonctionner en arrière-plan.
Par conséquent, vous devriez envisager d'utiliser une notification [...] pour lancer l'activité souhaitée lorsque l'utilisateur décide qu'il est temps d'enquêter. [...]

Explication complète:

FCM fonctionne de manière similaire à GCM et peut recevoir deux types de messages:

  1. display-messages:
    charge utile {"notification" : { "body" : "hello world"}}
    Ces messages sont automatiquement affichés lorsque l'application est en arrière-plan et ils appellent FirebaseMessagingService.onMessageReceived() si l'application est déjà présente. premier plan.

  2. data-messages:
    charge utile {"data" : { "key1" : "value1"}}
    Ces messages invoquent toujours FirebaseMessagingService.onMessageReceived(),
    même si l'application est fermée ou en arrière-plan.

click_action Est un paramètre de la charge de notification, il s'applique donc aux messages d'affichage.

Indique l'action associée à un utilisateur, cliquez sur la notification.
Si cette option est définie, une activité avec un filtre d'intention correspondant est lancée lorsque l'utilisateur clique sur la notification .

https://firebase.google.com/docs/cloud-messaging/http-server-ref#notification-payload-support

53
Diego Giorgini

Cela ressemble à cette section du guide est la clé du puzzle des applications avec arrière-plan:

Pour recevoir des messages
Utilisez un service qui s'étend FirebaseMessagingService . Votre service doit remplacer le callback onMessageReceived, qui est fourni pour la plupart des types de message, avec les exceptions suivantes:

Notifications envoyées lorsque votre application est en arrière-plan.
Dans ce cas, la notification est transmise à la barre d'état système du périphérique. Un utilisateur tapant sur une notification ouvre le lanceur d'applications par défaut.

Messages contenant à la fois des notifications et des données utiles
Dans ce cas, la notification est transmise à la barre des tâches système du périphérique et la charge utile de données est livrée dans les extras de l’intention de votre activité de lanceur.

En gros, lorsque l'application est en arrière-plan, elle n'est pas vraiment réactive ou en cours d'exécution. Au lieu de cela, le message est remis à la barre d'état système. Cependant, juste en dessous, la solution est expliquée.

Si vous souhaitez ouvrir votre application et effectuer une action spécifique [en tâche de fond], définissez click_action dans le contenu de la notification et mappez-le à un filtre d'intention dans l'activité que vous souhaitez lancer. Par exemple, définissez click_action sur OPEN_ACTIVITY_1 pour déclencher un filtre d'intention semblable à celui-ci:

<intent-filter>
  <action Android:name="OPEN_ACTIVITY_1" />
  <category Android:name="Android.intent.category.DEFAULT" />
</intent-filter>
16
Kato

Je résume les étapes ici, j'espère que c'est utile

ÉTAPE 1

Suivant Guide de l'utilisateur FCM . Assurez-vous que tout fonctionne correctement en envoyant un message de console Firebase .

ÉTAPE 2

Modifiez votre classe FirebaseMessagingService personnalisée comme suit:

public class MyFirebaseMessagingService extends FirebaseMessagingService {

private static final String TAG = "MyFirebaseMsgService";
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    Log.d(TAG, "From: " + remoteMessage.getFrom());
    startActivity(new Intent(this, SplashActivity.class));
}
}

Maintenant, en utilisant à nouveau les messages Push de la console Firebase, vous constaterez que onMessageReceived ne se déclenche que lorsque votre application est au premier plan. Parce que la console Firebase est capable d’envoyer Notification message Uniquement. Pour envoyer Data message, Nous avons besoin de l’étape 3.

ÉTAPE 3

Installer Google Advanced REST client

Entrée ci-dessous params:

url: https://fcm.googleapis.com/fcm/send
method: POST 
Raw header: 
Content-Type: application/json
Authorization:key=YOUR_SERVER_KEY
Raw payload:
{
   "to" : "YOUR_DEVICE_FCM_TOKEN",
   "data" : {
     "Nick" : "Mario",
     "body" : "great match!",
     "Room" : "PortugalVSDenmark"
   },
 } 

YOUR_SERVER_KEY est disponible dans la console Firebase> volet Paramètres> onglet Cloud Messaging

YOUR_DEVICE_FCM_TOKEN est FirebaseInstanceId.getInstance().getToken() sur onTokenRefresh()

[~ # ~] note [~ # ~]

Démarrer l'interface utilisateur sans interaction de l'utilisateur est une mauvaise UX, vous devrez peut-être remplacer l'activité de démarrage par le service de démarrage ou quelque chose en arrière-plan. J'utilise uniquement l'activité à des fins de test, ce sera donc plus visuel que le service. Merci @ 2ndgab pour avoir introduit l'outil Google Advanced REST client.

8
thanhbinh84

[Android] Si vous utilisez les notifications Firebase (et non Firebase Cloud Messaging), vous devez simplement inclure Firebase Messaging dans votre build.gradle, puis lier votre application à un projet dans Firebase Console.

Si votre application est en arrière-plan, tout message envoyé à partir de la console vous donnera une notification système qui, si vous la touchez, activera votre application.

Jetez un oeil ici: https://youtu.be/KpTSpVh9SfY?t=10m22s

2
Laurence Moroney