¿Cómo enviar mensajes de dispositivo a dispositivo usando Firebase Cloud Messaging?
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?
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
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_KEY
hay 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, regToken
el 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 regToken
en 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.
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'
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() ;
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