77 votes

Comment envoyer des messages d'appareil à appareil en utilisant Firebase Cloud Messaging ?

Après avoir cherché dans la documentation, je n'ai pas trouvé d'informations sur la manière d'envoyer des messages de périphérique à périphérique à l'aide de la FCM sans utiliser de serveur externe.

Par exemple, si je créais une application de chat, j'aurais besoin d'envoyer des notifications push aux utilisateurs à propos des messages non lus, car ils ne seront pas toujours en ligne, et je ne peux pas avoir un service persistant en arrière-plan qui serait toujours connecté à la base de données en temps réel, car cela demanderait trop de ressources.

Comment puis-je envoyer une notification push à un utilisateur "A" lorsqu'un certain utilisateur "B" lui envoie un message de chat ? Ai-je besoin d'un serveur externe pour cela ou cela peut-il être fait avec les seuls serveurs Firebase ?

3 votes

Je n'ai pas encore utilisé FCM, .... mais j'ai utilisé GCM.... en supposant que FCM est presque comme GCM..... appareil A envoie le message au serveur qui va pousser le message à l'appareil B. Consultez le site firebase.google.com/support/faq/#messaging-difference

1 votes

@j4rey89 Oui, je sais que cela peut être fait en utilisant un serveur externe. Je demande si cela peut être fait sans lui, car cela m'obligerait à maintenir et à payer pour deux serveurs au lieu d'un.

7 votes

@Suyash il est obligatoire d'exécuter votre propre serveur afin d'envoyer des messages FCM entre vos appareils. Si vous vous inquiétez des coûts de fonctionnement du serveur, vous pouvez commencer à déployer sur Openshift Online (PaaS) ou Google AppEngine (PaaS également) qui ont un quota gratuit.

41voto

eikooc Points 1008

UPDATE : Il est désormais possible d'utiliser les fonctions cloud de Firebase comme serveur pour gérer les notifications push. Consultez leur documentation aquí

\============

Selon les documents, vous debe mettre en oeuvre un serveur pour gérer les notifications push dans une communication de dispositif à dispositif.

Avant de pouvoir écrire des applications clientes qui utilisent Firebase Cloud Messaging, vous devez disposer d'un serveur d'applications qui répond aux critères suivants :

...

Vous devrez décider quel(s) protocole(s) de serveur de connexion FCM vous souhaitez utiliser pour permettre à votre serveur d'applications d'interagir avec les serveurs de connexion FCM. Notez que si vous voulez utiliser la messagerie en amont de vos applications clientes, vous devez utiliser XMPP. Pour une discussion plus détaillée à ce sujet, voir Choix d'un protocole de serveur de connexion FCM .

Si vous avez seulement besoin d'envoyer des notifications de base à vos utilisateurs depuis le serveur. Vous pouvez utiliser leur solution sans serveur, Notifications Firebase .

Voir ici une comparaison entre FCM et Firebase Notifications : https://firebase.google.com/support/faq/#messaging-difference

1 votes

Bonne réponse. Connaissez-vous des tutoriels ou des vidéos qui peuvent expliquer comment faire cela ? Merci.

4 votes

0 votes

Pouvez-vous m'aider à comprendre s'il vous plaît. D'après ce que j'ai compris, si j'ai besoin d'envoyer un message direct d'un uset à un autre, je dois utiliser HTTP et envoyer ce message à mon serveur. Le serveur suivant utilisera FCM pour envoyer la notification au destinataire et ainsi le destinataire récupérera les données avec l'ID de l'expéditeur. L'étape suivante, le destinataire se connecte à FCM et avec l'aide de l'ID, récupère toutes les données de la base de données FCM ? Comment faire ?

29voto

brijesh kumar Points 837

Faire une demande HTTP POST avec le lien https://fcm.googleapis.com/fcm/send avec l'en-tête et les données nécessaires m'ont aidé. Dans l'extrait de code ci-dessous Constants.LEGACY_SERVER_KEY est une variable de classe locale, vous pouvez la trouver dans votre Projet Firebase Settings->Cloud Messaging->Legacy Server key . Vous devez passer le jeton d'enregistrement du dispositif, c'est-à-dire. regToken dans l'extrait de code ci-dessous référencé ICI.

Enfin, vous devez okhttp afin de faire fonctionner cet extrait.

public static final MediaType JSON
        = MediaType.parse("application/json; charset=utf-8");
private void sendNotification(final String regToken) {
    new AsyncTask<Void,Void,Void>(){
        @Override
        protected Void doInBackground(Void... params) {
            try {
                OkHttpClient client = new OkHttpClient();
                JSONObject json=new JSONObject();
                JSONObject dataJson=new JSONObject();
                dataJson.put("body","Hi this is sent from device to device");
                dataJson.put("title","dummy title");
                json.put("notification",dataJson);
                json.put("to",regToken);
                RequestBody body = RequestBody.create(JSON, json.toString());
                Request request = new Request.Builder()
                        .header("Authorization","key="+Constants.LEGACY_SERVER_KEY)
                        .url("https://fcm.googleapis.com/fcm/send")
                        .post(body)
                        .build();
                Response response = client.newCall(request).execute();
                String finalResponse = response.body().string();
            }catch (Exception e){
                //Log.d(TAG,e+"");
            }
            return null;
        }
    }.execute();

}

de plus, si vous voulez envoyer un message à un sujet particulier, remplacez regToken en json comme ceci

json.put("to","/topics/foo-bar")

et n'oubliez pas d'ajouter la permission INTERNET dans votre AndroidManifest.xml.

IMPORTANT : - L'utilisation du code ci-dessus signifie que votre clé de serveur réside dans l'application cliente. C'est dangereux car quelqu'un peut s'introduire dans votre application et obtenir la clé du serveur pour envoyer des notifications malveillantes à vos utilisateurs.

0 votes

Bonjour, y a-t-il une possibilité d'envoyer les messages à un canal particulier souscrit ?

10 votes

L'inconvénient est que votre clé de serveur réside dans l'application cliente. C'est dangereux car quelqu'un peut s'introduire dans votre application et obtenir la clé du serveur pour envoyer des notifications malveillantes à vos utilisateurs. C'est pourquoi vous ne devriez jamais faire cela.

0 votes

@kirtan403 Un chiffrement fort de la clé du serveur côté client pourrait empêcher cela

2voto

greywolf82 Points 3730

Oui, il est possible de le faire sans serveur. Vous pouvez créer un groupe d'appareils côté client, puis échanger des messages dans le groupe. Cependant, il y a des limitations :

  1. Vous devez utiliser le même compte Google sur les appareils.
  2. Vous ne pouvez pas envoyer de messages de haute priorité

Référence : Documentation sur Firebase Voir la section "Gestion des groupes d'appareils sur les applications clientes Android".

0 votes

Vous avez toujours besoin d'un serveur pour envoyer un message de groupe

0 votes

Pas du tout. N'importe quel appareil du groupe peut envoyer un message

0 votes

De la docs : Authorization:key=API_KEY Vous avez toujours besoin de la clé du serveur. Cette solution n'est donc pas appropriée pour la production.

2voto

Maxim Firsoff Points 481

1) souscrire un nom de sujet identique, par exemple :

  • ClientA.subcribe("to/topic_users_channel")
  • ClientB.subcribe("to/topic_users_channel")

2) envoyer des messages à l'intérieur de l'application

GoogleFirebase : Comment envoyer des messages thématiques

2 votes

Cela ne nécessiterait-il pas encore l'utilisation de la clé d'autorisation du côté client ? Ce qui la rend peu sûre. De plus, je ne sais même pas si créer un sujet séparé pour chaque utilisateur est une bonne idée.

0 votes

Bonne idée, mais : Les messages thématiques sont optimisés pour le débit plutôt que pour la latence. Pour une livraison rapide et sécurisée à des dispositifs uniques ou à de petits groupes de dispositifs, ciblez les messages sur les jetons d'enregistrement, et non sur les sujets.

0 votes

@Maxim Firsoff- Comment créer un sujet à partir de la console FCM ou d'un autre moyen ?

1voto

Si vous avez le jeton fcm(gcm) de l'appareil auquel vous voulez envoyer la notification. C'est juste une demande de poste pour envoyer la notification.

https://github.com/prashanthd/google-services/blob/master/Android/gcm/gcmsender/src/main/java/gcm/play/Android/samples/com/gcmsender/GcmSender.java

1 votes

Oui, mais cela nécessite toujours notre propre serveur externe, non ? Parce que nous ne devrions pas intégrer la clé API_KEY directement dans nos clients. Ma question était de savoir si cela était possible sans serveur externe, ce qui n'est pas le cas actuellement, comme le suggèrent les autres réponses.

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