web-dev-qa-db-fra.com

Comment envoyer une notification de périphérique à périphérique en utilisant FCM sans utiliser XMPP ou tout autre script.?

Existe-t-il un moyen d'envoyer un message de notification en amont via FCM depuis un appareil Android vers un autre appareil connecté à la base de données Firebase.

Je sais que le serveur XMPP peut alors recevoir les messages en amont et envoyer les notifications aux autres appareils. Pour recevoir les messages envoyés avec l'API en amont, j'ai besoin d'implémenter un serveur XMPP mais il y a une autre façon ???

20
Vishal Patoliya ツ

Après beaucoup d'essais, j'ai finalement obtenu une solution et son travail parfaitement

Étape 1: inclure deux bibliothèques.

compile 'com.squareup.okhttp3:okhttp:3.4.1'
compile 'com.google.firebase:firebase-messaging:9.2.0'

Étape 2: dans votre activité principale ou d'où vous souhaitez envoyer des notifications.

OkHttpClient mClient = new OkHttpClient();

String refreshedToken = "";//add your user refresh tokens who are logged in with firebase.

JSONArray jsonArray = new JSONArray();
jsonArray.put(refreshedToken);

Étape 3: créer une tâche asynchrone qui envoie des notifications à tous les appareils.

public void sendMessage(final JSONArray recipients, final String title, final String body, final String icon, final String message) {

        new AsyncTask<String, String, String>() {
            @Override
            protected String doInBackground(String... params) {
                try {
                    JSONObject root = new JSONObject();
                    JSONObject notification = new JSONObject();
                    notification.put("body", body);
                    notification.put("title", title);
                    notification.put("icon", icon);

                    JSONObject data = new JSONObject();
                    data.put("message", message);
                    root.put("notification", notification);
                    root.put("data", data);
                    root.put("registration_ids", recipients);

                    String result = postToFCM(root.toString());
                    Log.d("Main Activity", "Result: " + result);
                    return result;
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
                return null;
            }

            @Override
            protected void onPostExecute(String result) {
                try {
                    JSONObject resultJson = new JSONObject(result);
                    int success, failure;
                    success = resultJson.getInt("success");
                    failure = resultJson.getInt("failure");
                    Toast.makeText(MainActivity.this, "Message Success: " + success + "Message Failed: " + failure, Toast.LENGTH_LONG).show();
                } catch (JSONException e) {
                    e.printStackTrace();
                    Toast.makeText(MainActivity.this, "Message Failed, Unknown error occurred.", Toast.LENGTH_LONG).show();
                }
            }
        }.execute();
    }

String postToFCM(String bodyString) throws IOException {



   public static final String FCM_MESSAGE_URL = "https://fcm.googleapis.com/fcm/send";
      final MediaType JSON
                = MediaType.parse("application/json; charset=utf-8");

        RequestBody body = RequestBody.create(JSON, bodyString);
        Request request = new Request.Builder()
                .url(Url.FCM_MESSAGE_URL)
                .post(body)
                .addHeader("Authorization", "key=" + "your server key")
                .build();
        Response response = mClient.newCall(request).execute();
        return response.body().string();
    }

Étape 4: appelez en un clic sur votre bouton

    btnSend.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            sendMessage(jsonArray,"Hello","How r u","Http:\\google.com","My Name is Vishal");
        }
    });
0
Vishal Patoliya ツ

Existe-t-il un moyen d'envoyer un message de notification en amont via FCM depuis un appareil Android vers un autre appareil connecté à la base de données Firebase?

Actuellement, il n'est PAS possible d'envoyer des messages directement d'un appareil à un autre.
(ou du moins ce n'est pas possible sans introduire une énorme vulnérabilité de sécurité: plus de détails ci-dessous)

Détails complets:

  1. L'envoi de messages à une machine utilisateur est une action assez sérieuse!
    en fonction de la charge utile, un message peut entraîner du spam, du phishing, l'exécution de méthodes internes.
  2. Vous voulez que cette opération ne soit autorisée que comme des entités de confiance, c'est pourquoi l'API d'envoi FCM nécessite le SERVER-API-KEY dans l'en-tête d'authentification.
  3. Ajout du SERVER-API-KEY dans le code de votre application (ou en le communiquant à l'application d'une autre manière) N'EST PAS SÛR . Cela parce que apk peut être extrait, décompilé, inspecté, exécuté sur des émulateurs, exécuté sous débogage et ainsi de suite.

La meilleure façon de l'implémenter aujourd'hui: est d'avoir une sorte de serveur entre les deux appareils:

[DeviceA] -- please send message to B -->  [SERVER] -- fcmSendAPI --> [DeviceB]

Le serveur peut être aussi simple qu'une page PHP, ou une implémentation XMPP plus complexe.

Un exemple dans Node.js peut être trouvé ici:
Envoi de notifications entre les appareils avec la base de données Firebase et la messagerie cloud

14
Diego Giorgini

Enfin, après 2 mois d'essayer de maintenir moi-même un script de serveur fiable, j'ai soudainement trouvé OneSignal . Il est entièrement gratuit, prend en charge les messages Push d'appareil à appareil sur iOS, Android, WP et les navigateurs.

J'espère que je n'obtiendrai pas de drapeau pour le spam de promotion, mais c'est actuellement le seul (et le plus simple) moyen d'être complètement "sans backend".

En outre, c'est un moyen complètement sécurisé. Personne ne peut envoyer Push à moins qu'il ne connaisse l'ID utilisateur spécial du système d'exploitation, que vous pouvez stocker dans la base de données Firebase protégée par des règles.

UPD: Ce n'est pas un remplacement pour Firebase. Il n'a que le service Push et rien d'autre

UPD2: Firebase a maintenant des fonctions, et des exemples de son utilisation ont l'envoi de FCM. Vous n'avez désormais plus besoin d'aucun autre serveur ou service. En savoir plus dans les exemples officiels https://github.com/firebase/functions-samples

3
Dima Rostopira