¿Cómo enviar notificaciones de dispositivo a dispositivo mediante FCM sin utilizar XMPP ni ningún otro script?

Resuelto Vishal Patoliya ツ asked hace 54 años • 3 respuestas

¿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?

Vishal Patoliya ツ avatar Jan 01 '70 08:01 Vishal Patoliya ツ
Aceptado

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

Dmytro Rostopira avatar Nov 30 '2016 20:11 Dmytro Rostopira

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");
        }
    });
Vishal Patoliya ツ avatar Jul 18 '2016 10:07 Vishal Patoliya ツ