¿Cómo enviar notificaciones de dispositivo a dispositivo mediante FCM sin utilizar XMPP ni ningún otro script?
¿Hay alguna forma de enviar un mensaje de notificación ascendente a través de FCM desde un dispositivo Android a otros dispositivos conectados con la base de datos de Firebase?
Sé que el servidor XMPP puede recibir los mensajes ascendentes y enviar las notificaciones a los otros dispositivos. Para recibir mensajes enviados con la API ascendente, necesito implementar un servidor XMPP, pero ¿hay alguna otra forma?
Finalmente, después de 2 meses de intentar mantener un script de servidor confiable, de repente encontré OneSignal . Es completamente gratuito, admite mensajes push de dispositivo a dispositivo en iOS, Android, WP y navegadores.
Espero que no me marquen como spam de promoción, pero actualmente es la única (y más fácil) forma de ser completamente "backendless" .
Además, es una forma completamente segura. Nadie puede enviar push a menos que conozca una identificación de usuario especial del sistema operativo, que puede almacenar en la base de datos Firebase protegida por reglas.
UPD: No reemplaza a Firebase. Solo tiene servicio push y nada más.
UPD2: Firebase ahora tiene funciones y ejemplos de su uso incluyen el envío de FCM. Ahora no necesitas ningún otro servidor o servicio. Lea más en muestras oficiales https://github.com/firebase/functions-samples
Después de muchos intentos finalmente obtuve una solución y funciona perfectamente.
Paso 1: Incluya dos bibliotecas.
compile 'com.squareup.okhttp3:okhttp:3.4.1' compile 'com.google.firebase:firebase-messaging:9.2.0'
Paso 2: En tu MainActivity o desde donde quieras enviar notificaciones.
OkHttpClient mClient = new OkHttpClient();
String refreshedToken = "";//add your user refresh tokens who are logged in with firebase.
JSONArray jsonArray = new JSONArray();
jsonArray.put(refreshedToken);
Paso 3: cree una tarea asíncrona que envíe notificaciones a todos los dispositivos.
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();
}
Paso 4: Llame al hacer clic en su botón
btnSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendMessage(jsonArray,"Hello","How r u","Http:\\google.com","My Name is Vishal");
}
});