¿Cómo enviar mensajes de dispositivo a dispositivo usando Firebase Cloud Messaging?

Resuelto Suyash asked hace 54 años • 14 respuestas

Después de buscar en los documentos, no pude encontrar ninguna información sobre cómo enviar mensajes de dispositivo a dispositivo usando FCM sin el uso de un servidor externo.

Por ejemplo, si estuviera creando una aplicación de chat, necesitaría enviar notificaciones automáticas a los usuarios sobre mensajes no leídos, ya que no estarán en línea todo el tiempo y no puedo tener un servicio persistente en segundo plano que siempre esté conectado. la base de datos en tiempo real porque eso requeriría demasiados recursos.

Entonces, ¿cómo enviaría una notificación automática a un usuario "A" cuando cierto usuario "B" le envía un mensaje de chat? ¿Necesito un servidor externo para esto o puedo hacerlo solo con servidores Firebase?

Suyash avatar Jan 01 '70 08:01 Suyash
Aceptado

ACTUALIZACIÓN: ahora es posible utilizar las funciones de la nube de Firebase como servidor para manejar notificaciones push. Consulta su documentación aquí.

=============

Según los documentos, debe implementar un servidor para manejar notificaciones automáticas en la comunicación de dispositivo a dispositivo.

Antes de poder escribir aplicaciones cliente que utilicen Firebase Cloud Messaging, debes tener un servidor de aplicaciones que cumpla con los siguientes criterios:

...

Deberá decidir qué protocolo(s) de servidor de conexión FCM desea utilizar para permitir que su servidor de aplicaciones interactúe con los servidores de conexión FCM. Tenga en cuenta que si desea utilizar mensajería ascendente desde sus aplicaciones cliente, debe utilizar XMPP. Para obtener una discusión más detallada sobre esto, consulte Elección de un protocolo de servidor de conexión FCM .

Si solo necesita enviar notificaciones básicas a sus usuarios desde el servidor. Puede utilizar su solución sin servidor, Firebase Notifications .

Vea una comparación aquí entre FCM y Firebase Notifications: https://firebase.google.com/support/faq/#messaging-difference

eikooc avatar Jun 25 '2016 12:06 eikooc

Me ayudó realizar una solicitud HTTP POST con el enlace https://fcm.googleapis.com/fcm/send con el encabezado y los datos requeridos. En el siguiente fragmento de código Constants.LEGACY_SERVER_KEYhay una variable de clase local, puede encontrarla en su Proyecto Firebase Settings->Cloud Messaging->Legacy Server key. Debe pasar el token de registro del dispositivo, es decir, regTokenel siguiente fragmento de código al que se hace referencia AQUÍ.

Por fin necesita la dependencia de la biblioteca okhttp para que este fragmento funcione.

public static final MediaType JSON
        = MediaType.parse("application/json; charset=utf-8");
private void sendNotification(final String regToken) {
    new AsyncTask<Void,Void,Void>(){
        @Override
        protected Void doInBackground(Void... params) {
            try {
                OkHttpClient client = new OkHttpClient();
                JSONObject json=new JSONObject();
                JSONObject dataJson=new JSONObject();
                dataJson.put("body","Hi this is sent from device to device");
                dataJson.put("title","dummy title");
                json.put("notification",dataJson);
                json.put("to",regToken);
                RequestBody body = RequestBody.create(JSON, json.toString());
                Request request = new Request.Builder()
                        .header("Authorization","key="+Constants.LEGACY_SERVER_KEY)
                        .url("https://fcm.googleapis.com/fcm/send")
                        .post(body)
                        .build();
                Response response = client.newCall(request).execute();
                String finalResponse = response.body().string();
            }catch (Exception e){
                //Log.d(TAG,e+"");
            }
            return null;
        }
    }.execute();

}

Además, si desea enviar un mensaje a un tema en particular, reemplácelo regTokenen json como este

json.put("to","/topics/foo-bar")

y no olvide agregar el permiso de INTERNET en su AndroidManifest.xml.

IMPORTANTE : - Usar el código anterior significa que la clave de su servidor reside en la aplicación cliente. Esto es peligroso ya que alguien puede profundizar en su aplicación y obtener la clave del servidor para enviar notificaciones maliciosas a sus usuarios.

Brijesh Kumar avatar Feb 01 '2017 14:02 Brijesh Kumar

Puedes hacerlo usando la solicitud Volly Jsonobject....

Siga estos pasos primero:

1 copie la clave del servidor heredado y guárdela como Legacy_SERVER_KEY

Clave del servidor heredado

Puedes ver en la imagen cómo llegar.

2 Necesitas dependencia de Volley

compilar 'com.mcxiaoke.volley:library:1.0.19'

ingrese la descripción de la imagen aquí

Código para enviar Push: -

private void sendFCMPush() {

    String Legacy_SERVER_KEY = YOUR_Legacy_SERVER_KEY;
    String msg = "this is test message,.,,.,.";
    String title = "my title";
    String token = FCM_RECEIVER_TOKEN;

    JSONObject obj = null;
    JSONObject objData = null;
    JSONObject dataobjData = null;

    try {
        obj = new JSONObject();
        objData = new JSONObject();

        objData.put("body", msg);
        objData.put("title", title);
        objData.put("sound", "default");
        objData.put("icon", "icon_name"); //   icon_name image must be there in drawable
        objData.put("tag", token);
        objData.put("priority", "high");

        dataobjData = new JSONObject();
        dataobjData.put("text", msg);
        dataobjData.put("title", title);

        obj.put("to", token);
        //obj.put("priority", "high");

        obj.put("notification", objData);
        obj.put("data", dataobjData);
        Log.e("!_@rj@_@@_PASS:>", obj.toString());
    } catch (JSONException e) {
        e.printStackTrace();
    }

    JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.POST, Constants.FCM_PUSH_URL, obj,
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    Log.e("!_@@_SUCESS", response + "");
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    Log.e("!_@@_Errors--", error + "");
                }
            }) {
        @Override
        public Map<String, String> getHeaders() throws AuthFailureError {
            Map<String, String> params = new HashMap<String, String>();
            params.put("Authorization", "key=" + Legacy_SERVER_KEY);
            params.put("Content-Type", "application/json");
            return params;
        }
    };
    RequestQueue requestQueue = Volley.newRequestQueue(this);
    int socketTimeout = 1000 * 60;// 60 seconds
    RetryPolicy policy = new DefaultRetryPolicy(socketTimeout, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
    jsObjRequest.setRetryPolicy(policy);
    requestQueue.add(jsObjRequest);
}

Simplemente llame a sendFCMPush() ;

Rajesh Satvara avatar Feb 25 '2017 04:02 Rajesh Satvara

1) suscríbete a un nombre de tema idéntico, por ejemplo:

  • ClientA.subcribe("a/topic_users_channel")
  • ClientB.subcribe("a/topic_users_channel")

2) enviar mensajes dentro de la aplicación

GoogleFirebase: Cómo enviar mensajes temáticos

Maxim Firsoff avatar Sep 05 '2016 10:09 Maxim Firsoff