44 votes

Ouvrir l'application sur la notification reçue de Firebase (FCM)

Je veux 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 cela ne sert qu'à personnaliser l'activité qui sera lancée en cas de clic 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 firebase messaging et il y a une méthode onMessageReceived() mais elle ne fonctionne que si l'application est au premier plan. Y a-t-il quelque chose qui s'exécute également lorsque l'application est en arrière-plan ? GCM pourrait faire quelque chose comme ce que je veux ici en démarrant directement l'intention d'activité à partir du récepteur de diffusion qui est appelé lorsque la notification est reçue.

1 votes

Si vous relisez la documentation, vous verrez que onMessageReceived n'est appelé en arrière-plan que lorsque la balise de notification n'est pas présente dans votre charge utile.

0 votes

Mais j'ai essayé d'ajouter une intention de lancement et startActivity n'a même pas été appelé.

0 votes

Si vous regardez ici, vous verrez où est appelé onMessageReceived et où est écrit foreground. firebase.google.com/docs/cloud-messaging/

66voto

Diego Giorgini Points 74

Réponse rapide :

Pour ouvrir automatiquement une application par le biais du FCM, vous devez utiliser un fichier de type data-message qui garantit de toujours invoquer le FirebaseMessagingService.onMessageReceived() méthode.

Ensuite, vous pouvez ajouter votre logique dans le .onMessageReceived() pour lancer l'activité préférée.

AVERTISSEMENT : Le lancement d'une interface utilisateur sans aucune interaction avec l'utilisateur est une très très mauvaise pratique pour la plupart des applications ! Veuillez lire le MarkG réponse 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 de conception, surtout de la part d'un élément qui est censé 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 :

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

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

  2. des messages de données :
    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 utile de la notification, il s'applique donc aux messages d'affichage.

Indique l'action associée à un clic de l'utilisateur sur la notification.
Si ce paramètre est défini, 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

0 votes

Merci beaucoup, je vais essayer. Lancer l'application sur une notification n'était qu'un exemple, j'avais juste besoin de pouvoir exécuter un code personnalisé sur une notification.

9 votes

Une dernière chose : la console Web Firebase ne peut envoyer que des messages d'affichage. Pour envoyer des messages de données, vous devez utiliser l'API côté serveur.

0 votes

Que voulez-vous dire par API côté serveur ? Dois-je créer un serveur d'applications séparé comme pour GCM ?

19voto

Kato Points 12210

On dirait que cette section du guide est la clé du puzzle des applications en arrière-plan :

Pour recevoir des messages
Utilisez un service qui s'étend FirebaseMessagingService . Votre service doit passer outre le site onMessageReceived callback, qui est fourni pour la plupart des types sauf pour les exceptions suivantes :

Notifications délivrées lorsque votre application est en arrière-plan.
Dans ce Dans ce cas, la notification est envoyée dans la barre d'état système de l'appareil. A utilisateur appuie sur une notification pour ouvrir le lanceur d'applications par défaut.

Messages comportant à la fois une notification et une charge utile de données.
Dans ce cas, la notification est envoyée dans la barre d'état système de l'appareil, et les données sont livrées dans les extras de l'intention de votre lanceur. Activité.

En fait, lorsque l'application est en arrière-plan, elle n'est pas vraiment réactive ou en cours d'exécution à ce stade. Le message est donc envoyé dans 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 arrière-plan], définissez le paramètre click_action dans les données utiles de la notification et associez-le à une intention. dans l'activité que vous souhaitez lancer. Par exemple, définissez Action-clic a ACTIVITÉ_OUVERTE_1 pour déclencher un filtre d'intention comme le suivant :

<intent-filter>
  <action android:name="OPEN_ACTIVITY_1" />
  <category android:name="android.intent.category.DEFAULT" />
</intent-filter>

0 votes

Je vais réessayer, mais je pense que click_action implique l'activité qui sera exécutée en cliquant sur la notification.

1 votes

J'ai besoin de quelque chose comme un récepteur de message personnalisé où je peux exécuter mon code pour lancer l'application, mais je ne suis pas sûr que cela soit possible avec la FCM.

3 votes

Je viens d'essayer GCM et cela fonctionne pour mon cas d'utilisation sans problèmes, dommage que FCM ne supporte pas cela.

8voto

doraemon Points 4099

Je résume les étapes ici, en espérant qu'elles soient utiles.

ÉTAPE 1

Suivant Guide d'utilisation du FCM . Assurez-vous que tout fonctionne correctement en poussant un message de Console Firebase .

ÉTAPE 2

Changez 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 trouverez que onMessageReceived se déclenche uniquement lorsque votre application est au premier plan. Comme la console Firebase est capable d'envoyer Notification message seulement. Afin d'envoyer Data message nous avons besoin de l'étape 3.

ÉTAPE 3

Instalar Client REST de Google Advanced

Entrez les paramètres ci-dessous :

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 Messagerie en ligne.

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

NOTE

Le démarrage de l'interface utilisateur sans interaction avec l'utilisateur est une mauvaise UX, vous pourriez avoir besoin de remplacer l'activité de démarrage avec le service de démarrage ou quelque chose en arrière-plan. Je n'utilise l'activité qu'à des fins de test, elle sera donc plus visuelle que le service. Merci @2ndgab pour la présentation de l'outil client Google Advanced REST.

0 votes

Il ne fonctionne pas. quand l'application est en arrière-plan, on ne peut pas recevoir de message.

0 votes

Supposons que vous ayez terminé l'étape 2 et échoué à l'étape 3, quelle est la réponse lors de l'envoi d'un message, si ce n'est pas 200, vérifiez les paramètres que vous utilisez.

2voto

Laurence Moroney Points 876

[Android] Si vous utilisez Firebase Notifications (et non Firebase Cloud Messaging), il vous suffit d'inclure Firebase Messaging dans votre build.gradle, puis de lier votre application à un projet sur Firebase Console.

Si votre application est en arrière-plan, tout message envoyé depuis la console vous donnera une notification système qui, si elle est touchée, activera votre application.

Jetez un coup d'œil ici : https://youtu.be/KpTSpVh9SfY?t=10m22s

-2voto

La résolution de ce problème est assez simple en fait. Pas besoin d'intention, il suffit d'installer le fichier '@ionic-native/background-mode'.

Voici une explication complète et un dépôt git pour résoudre ce problème

0 votes

Bien que ce lien puisse répondre à la question, il est préférable d'inclure les parties essentielles de la réponse ici et de fournir le lien pour référence. Les réponses ne comportant qu'un lien peuvent devenir invalides si la page liée change. - De la revue

0 votes

Serait mieux avec le code sous forme de texte au lieu de captures d'écran. Personne ne peut copier/coller vos exemples

0 votes

Vous avez raison. J'ai écrit une réponse plus détaillée maintenant Merci

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X