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 ???
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");
}
});
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:
SERVER-API-KEY
dans l'en-tête d'authentification.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
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