3
votes

Comment envoyer un message Firebase à un sujet depuis Android

Je souhaite envoyer un message aux sujets FCM depuis mon application Android. L'envoi du message via la console Firebase fonctionne bien, mais une fois qu'un utilisateur exécute une action particulière, je souhaite qu'un message soit envoyé à tous les autres utilisateurs qui se sont abonnés à un sujet particulier.

Dans la documentation, il y a ce code:

// The topic name can be optionally prefixed with "/topics/".
String topic = "highScores";

// See documentation on defining a message payload.
Message message = Message.builder()
.putData("score", "850")
.putData("time", "2:45")
.setTopic(topic)
.build();

// Send a message to the devices subscribed to the provided topic.
String response = FirebaseMessaging.getInstance().send(message);
// Response is a message ID string.
System.out.println("Successfully sent message: " + response);

Je ne sais pas de quelle classe Message appartient. Ce n'est évidemment pas RemoteMessage.


3 commentaires

Il n'y a aucun moyen d'envoyer des messages directement d'un appareil Android à un autre appareil avec Firebase Cloud Message. Vous aurez toujours besoin d'un serveur (ou d'un autre environnement de confiance) pour ce faire. Consultez firebase.google.com/docs/cloud-messaging#how_does_it_work et mon répondez ici: stackoverflow.com/questions/37990140/... . L'exemple que vous avez trouvé semble à première vue pour l'envoi de messages depuis votre application vers votre propre serveur d'applications via FCM, bien que je ne puisse pas le trouver immédiatement dans la documentation.


Voici le document firebase.google.com/docs/cloud-messaging/ android /…


Cet exemple utilise le SDK Admin, qui est destiné à être exécuté dans un environnement approuvé et ne peut pas être utilisé dans votre application Android.


3 Réponses :


2
votes

Il n'existe aucun moyen d'envoyer en toute sécurité des messages directement d'un appareil Android à un autre appareil avec Firebase Cloud Messaging. Vous aurez toujours besoin d'un serveur (ou d'un autre environnement de confiance) pour ce faire. Consultez cette section de documentation montrant comment les messages sont envoyés et ma réponse. ici: Comment envoyer un à un message à l'aide de Firebase Messaging .

L'exemple de code que vous avez partagé utilise le SDK Admin pour Java pour envoyer un message, qui est destiné à être exécuté dans un environnement approuvé. Il ne peut pas être utilisé dans votre application Android.


5 commentaires

J'ai finalement utilisé les fonctions cloud pour réaliser ce que je voulais. La fonction écoute toute écriture sur une collection firestore et par conséquent envoie un message au sujet spécifique.


Google fournit une API. Nous pouvons envoyer un message fcm à un autre appareil à partir d'un appareil Android en envoyant une demande d'API à cette API. Vous avez tort.


@SamirElekberov Dans votre réponse, vous incluez la clé FCM serveur dans votre code côté client. Cela représente un risque de sécurité énorme, car n'importe qui peut prendre cette clé de votre code et l'utiliser pour envoyer le message de son choix à tous vos utilisateurs. C'est pourquoi la clé de serveur FCM ne doit (comme son nom l'indique) être utilisée que dans des environnements de confiance, tels que votre machine de développement, un serveur que vous contrôlez ou Cloud Functions.


Oui mais de toute façon ce n'est pas impossible .. Et il est prévu de l'utiliser de cette façon .. Et comment pouvons-nous utiliser les URL API dans notre application si quelqu'un peut l'obtenir? Ils peuvent envoyer une demande à nos URL API, n'est-ce pas?


J'ai clarifié ma réponse à "Il n'y a aucun moyen d'envoyer en toute sécurité des messages directement d'un appareil Android à un autre appareil avec Firebase Cloud Messaging". Ce n'est pas un cas d'utilisation prévu (j'ai vérifié cela à plusieurs reprises avec l'équipe produit avant de publier ma première réponse à ce sujet). Cependant, je ne suis pas sûr de comprendre vos questions, il pourrait donc être utile de poster une question distincte à leur sujet si vous ne les trouvez pas traitées ici ou ailleurs.



4
votes

Vous pouvez le faire via Volley et FCM API

Voici un exemple pour envoyer une notification de l'utilisateur au sujet "newOrder" et avoir le titre et le corps

RequestQueue mRequestQue = Volley.newRequestQueue(this);

        JSONObject json = new JSONObject();
        try {
            json.put("to", "/topics/" + "newOrder");
            JSONObject notificationObj = new JSONObject();
            notificationObj.put("title", "new Order");
            notificationObj.put("body", "New order from : " + phoneNum.replace("+", " "));
            //replace notification with data when went send data
            json.put("notification", notificationObj);

            String URL = "https://fcm.googleapis.com/fcm/send";
            JsonObjectRequest request = new JsonObjectRequest(Request.Method.POST, URL,
                    json,
                    response -> Log.d("MUR", "onResponse: "),
                    error -> Log.d("MUR", "onError: " + error.networkResponse)
            ) {
                @Override
                public Map<String, String> getHeaders() {
                    Map<String, String> header = new HashMap<>();
                    header.put("content-type", "application/json");
                    header.put("authorization", "key=yourKey");
                    return header;
                }
            };


            mRequestQue.add(request);
        } catch (JSONException e) {
            e.printStackTrace();
        }

Remplacez yourKey par clé de serveur dans votre projet dans Firebase


MISE À JOUR: comme @frank dit dans la bonne réponse Vous aurez toujours besoin d'un serveur (ou d'un autre environnement de confiance) pour maintenir votre clé et la rendre non publique

donc ceci La réponse fonctionne déjà et peut envoyer des notifications d'Android vers un sujet ou un jeton

mais si quelqu'un prend votre clé peut également envoyer des notifications à vos applications à tout moment donc je suggère d'utiliser les fonctions firebase ou tout autre service sur votre serveur, assurez-vous simplement que votre clé est dans un environnement de confiance et non accessible

également lorsque vous obtenez la clé, tapez deux: 1 - Clé serveur 2 - Clé de serveur héritée

comme Firebase dit ci-dessous, j'ai également suggéré de l'utiliser en premier car il est plus flexible de changer ou de supprimer

Firebase a mis à niveau nos clés de serveur vers une nouvelle version. Tu peux continuez à utiliser votre clé de serveur héritée, mais il est recommandé de passer à la dernière version


0 commentaires

0
votes

Reportez-vous à ce lien . Vous pouvez faire quoi dont vous avez besoin via cette documentation google officielle.

Mais je peux vous montrer un exemple que j'ai écrit via la bibliothèque AndroidFastNetworking:

        JSONObject dataJsonObject = new JSONObject();
        dataJsonObject.put("anyDataYouWant":"value");

        try {

            bodyJsonObject.put("to", "/topics/topic");
            bodyJsonObject.put("data", dataJsonObject);
            
        } catch (JSONException e) {
            e.printStackTrace();
        }
        
        
        
        
        AndroidNetworking.post("https://fcm.googleapis.com/fcm/send")
                .setContentType("application/json; charset=utf-8")
                .addJSONObjectBody(bodyJsonObject)
                .addHeaders("Authorization", "Your Firebase Authorization Key with 'key=' prefix:  ("key=AAAAjHK....") ")
                .setPriority(Priority.HIGH)
                .build()
                .getAsJSONObject(new JSONObjectRequestListener() {
                    @Override
                    public void onResponse(JSONObject response) {
                        Toast.makeText(context, "Success", Toast.LENGTH_SHORT).show();
                    }
                    
                    
                    @Override
                    public void onError(ANError anError) {
                        Toast.makeText(context, "Error: " + anError.toString(), Toast.LENGTH_SHORT).show();
                    }
                });


1 commentaires

Vous incluez ici la clé FCM serveur dans votre code côté client, ce qui représente un risque de sécurité énorme. N'importe qui peut prendre cette clé de votre code et l'utiliser pour envoyer le message de son choix à tous vos utilisateurs. C'est pourquoi la clé de serveur FCM ne doit (comme son nom l'indique) être utilisée que dans des environnements de confiance, tels que votre machine de développement, un serveur que vous contrôlez ou Cloud Functions.