registro notification notificaciones from firebaseinstanceidservice fcm firebase google-cloud-messaging firebase-cloud-messaging

firebase - notification - Enviar notificaciones push desde el servidor con FCM



send push notification firebase from server (6)

¿Qué tan diferente es la codificación del lado del servidor?

Como no hay mucha diferencia, también puede consultar la mayoría de los códigos de ejemplo del lado del servidor para GCM. La principal diferencia con respecto a GCM y FCM es que al usar FCM, puede usar las nuevas funciones con él ( como se menciona en esta answer ). FCM también tiene una Console donde puede enviar el mensaje / notificación, sin tener su propio servidor de aplicaciones.

NOTA: Crear su propio servidor de aplicaciones depende de usted. Simplemente indicando que puede enviar un mensaje / notificación a través de la consola.

La URL utilizada es " https://android.googleapis.com/gcm/send ". ¿Cuál sería la URL equivalente para FCM?

La URL equivalente para FCM es https://fcm.googleapis.com/fcm/send . Puede consultar este doc para obtener más detalles.

¡Salud! :RE

Recientemente hice una pregunta sobre el envío de notificaciones push mediante GCM: Enviar notificaciones push a Android . Ahora que hay FCM, me pregunto qué tan diferente sería del desarrollo del lado del servidor. Codificación sabia, ¿son lo mismo? ¿Dónde puedo encontrar ejemplos de códigos FCM que muestren el envío de notificaciones push desde el servidor al dispositivo Android?

¿Necesito descargar alguna biblioteca JAR para enviar notificaciones a FCM usando códigos Java? Los códigos de ejemplo en Enviar notificaciones push a Android muestran el envío de notificaciones push usando GCM y se requiere un archivo JAR GCM del lado del servidor.

Sin embargo, otro ejemplo en https://www.quora.com/How-do-I-make-a-post-request-to-a-GCM-server-in-Java-to-push-a-notification-to-the-client-app muestra el envío de notificaciones push usando GCM y no se requiere ningún archivo JAR de GCM del lado del servidor ya que solo se está enviando a través de una conexión HTTP. ¿Se pueden usar los mismos códigos para FCM? La URL utilizada es " https://android.googleapis.com/gcm/send ". ¿Cuál sería la URL equivalente para FCM?

Gracias por adelantado.


Esto viene directamente de Google

No necesitará realizar ningún cambio en el protocolo del lado del servidor para la actualización. El protocolo de servicio no ha cambiado. Sin embargo, tenga en cuenta que todas las nuevas mejoras del servidor se documentarán en la documentación del servidor FCM.

Y al recibir mensajes parece que solo hay algunos lugares donde es solo un poco diferente. Principalmente borrando algunas cosas.

Y la documentación del servidor FCM se puede encontrar aquí https://firebase.google.com/docs/cloud-messaging/server


He creado una lib para el servidor de notificaciones FCM . Solo úsalo como GCM lib.

Para el servidor FCM, use este código:

GCM Server URL-"android.googleapis.com/gcm/send"

FCM Server URL - "fcm.googleapis.com/fcm/send"

Agregar https con URL

Sender objSender = new Sender(gAPIKey);

o

Sender objSender = new Sender(gAPIKey,"SERVER_URL");

POR DEFECTO LA URL DEL SERVIDOR FCM SE ASIGNA

Message objMessage = new Message.Builder().collapseKey("From FCMServer").timeToLive(3).delayWhileIdle(false) .notification(notification) .addData("ShortMessage", "Sh").addData("LongMessage", "Long ") .build(); objMulticastResult = objSender.send(objMessage,clientId, 4);

  • La necesidad de dependencia de esta biblioteca es la misma que la biblioteca GCM lib requerida (jsonsimple.jar).

  • Descargar lib de FCM_Server.jar


Use el siguiente código para enviar notificaciones push desde el servidor FCM:

public class PushNotifictionHelper { public final static String AUTH_KEY_FCM = "Your api key"; public final static String API_URL_FCM = "https://fcm.googleapis.com/fcm/send"; public static String sendPushNotification(String deviceToken) throws IOException { String result = ""; URL url = new URL(API_URL_FCM); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setUseCaches(false); conn.setDoInput(true); conn.setDoOutput(true); conn.setRequestMethod("POST"); conn.setRequestProperty("Authorization", "key=" + AUTH_KEY_FCM); conn.setRequestProperty("Content-Type", "application/json"); JSONObject json = new JSONObject(); json.put("to", deviceToken.trim()); JSONObject info = new JSONObject(); info.put("title", "notification title"); // Notification title info.put("body", "message body"); // Notification // body json.put("notification", info); try { OutputStreamWriter wr = new OutputStreamWriter( conn.getOutputStream()); wr.write(json.toString()); wr.flush(); BufferedReader br = new BufferedReader(new InputStreamReader( (conn.getInputStream()))); String output; System.out.println("Output from Server .... /n"); while ((output = br.readLine()) != null) { System.out.println(output); } result = CommonConstants.SUCCESS; } catch (Exception e) { e.printStackTrace(); result = CommonConstants.FAILURE; } System.out.println("GCM Notification is sent successfully"); return result; }


SOLUCIÓN COMPLETA PARA TEMA, DISPOSITIVO ÚNICO Y DISPOSITIVOS MÚLTIPLES Cree una clase FireMessage. Este es un ejemplo para mensajes de datos. Puede cambiar los datos a notificación.

public class FireMessage { private final String SERVER_KEY = "YOUR SERVER KEY"; private final String API_URL_FCM = "https://fcm.googleapis.com/fcm/send"; private JSONObject root; public FireMessage(String title, String message) throws JSONException { root = new JSONObject(); JSONObject data = new JSONObject(); data.put("title", title); data.put("message", message); root.put("data", data); } public String sendToTopic(String topic) throws Exception { //SEND TO TOPIC System.out.println("Send to Topic"); root.put("condition", "''"+topic+"'' in topics"); return sendPushNotification(true); } public String sendToGroup(JSONArray mobileTokens) throws Exception { // SEND TO GROUP OF PHONES - ARRAY OF TOKENS root.put("registration_ids", mobileTokens); return sendPushNotification(false); } public String sendToToken(String token) throws Exception {//SEND MESSAGE TO SINGLE MOBILE - TO TOKEN root.put("to", token); return sendPushNotification(false); } private String sendPushNotification(boolean toTopic) throws Exception { URL url = new URL(API_URL_FCM); HttpURLConnection conn = (HttpURLConnection) url.openConnection(); conn.setUseCaches(false); conn.setDoInput(true); conn.setDoOutput(true); conn.setRequestMethod("POST"); conn.setRequestProperty("Content-Type", "application/json"); conn.setRequestProperty("Accept", "application/json"); conn.setRequestProperty("Authorization", "key=" + SERVER_KEY); System.out.println(root.toString()); try { OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream()); wr.write(root.toString()); wr.flush(); BufferedReader br = new BufferedReader(new InputStreamReader( (conn.getInputStream()))); String output; StringBuilder builder = new StringBuilder(); while ((output = br.readLine()) != null) { builder.append(output); } System.out.println(builder); String result = builder.toString(); JSONObject obj = new JSONObject(result); if(toTopic){ if(obj.has("message_id")){ return "SUCCESS"; } } else { int success = Integer.parseInt(obj.getString("success")); if (success > 0) { return "SUCCESS"; } } return builder.toString(); } catch (Exception e) { e.printStackTrace(); return e.getMessage(); } }

}

Y llama a cualquier parte como esta. Tanto el servidor como Android podemos usar esto.

FireMessage f = new FireMessage("MY TITLE", "TEST MESSAGE"); //TO SINGLE DEVICE /* String fireBaseToken="c2N_8u1leLY:APA91bFBNFYDARLWC74QmCwziX-YQ68dKLNRyVjE6_sg3zs-dPQRdl1QU9X6p8SkYNN4Zl7y-yxBX5uU0KEKJlam7t7MiKkPErH39iyiHcgBvazffnm6BsKjRCsKf70DE5tS9rIp_HCk"; f.sendToToken(fireBaseToken); */ // TO MULTIPLE DEVICE /* JSONArray tokens = new JSONArray(); tokens.put("c2N_8u1leLY:APA91bFBNFYDARLWC74QmCwziX-YQ68dKLNRyVjE6_sg3zs-dPQRdl1QU9X6p8SkYNN4Zl7y-yxBX5uU0KEKJlam7t7MiKkPErH39iyiHcgBvazffnm6BsKjRCsKf70DE5tS9rIp_HCk"); tokens.put("c2R_8u1leLY:APA91bFBNFYDARLWC74QmCwziX-YQ68dKLNRyVjE6_sg3zs-dPQRdl1QU9X6p8SkYNN4Zl7y-yxBX5uU0KEKJlam7t7MiKkPErH39iyiHcgBvazffnm6BsKjRCsKf70DE5tS9rIp_HCk"); f.sendToGroup(tokens); */ //TO TOPIC String topic="yourTopicName"; f.sendToTopic(topic);


public class SendPushNotification extends AsyncTask<Void, Void, Void> { private final String FIREBASE_URL = "https://fcm.googleapis.com/fcm/send"; private final String SERVER_KEY = "REPLACE_YOUR_SERVER_KEY"; private Context context; private String token; public SendPushNotification(Context context, String token) { this.context = context; this.token = token; } @Override protected Void doInBackground(Void... voids) { /*{ "to": "DEVICE_TOKEN", "data": { "type": "type", "title": "Android", "message": "Push Notification", "data": { "key": "Extra data" } } }*/ try { URL url = new URL(FIREBASE_URL); HttpURLConnection connection = (HttpURLConnection) url.openConnection(); connection.setUseCaches(false); connection.setDoInput(true); connection.setDoOutput(true); connection.setRequestMethod("POST"); connection.setRequestProperty("Content-Type", "application/json"); connection.setRequestProperty("Accept", "application/json"); connection.setRequestProperty("Authorization", "key=" + SERVER_KEY); JSONObject root = new JSONObject(); root.put("to", token); JSONObject data = new JSONObject(); data.put("type", "type"); data.put("title", "Android"); data.put("message", "Push Notification"); JSONObject innerData = new JSONObject(); innerData.put("key", "Extra data"); data.put("data", innerData); root.put("data", data); Log.e("PushNotification", "Data Format: " + root.toString()); try { OutputStreamWriter writer = new OutputStreamWriter(connection.getOutputStream()); writer.write(root.toString()); writer.flush(); writer.close(); int responseCode = connection.getResponseCode(); Log.e("PushNotification", "Request Code: " + responseCode); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader((connection.getInputStream()))); String output; StringBuilder builder = new StringBuilder(); while ((output = bufferedReader.readLine()) != null) { builder.append(output); } bufferedReader.close(); String result = builder.toString(); Log.e("PushNotification", "Result JSON: " + result); } catch (Exception e) { e.printStackTrace(); Log.e("PushNotification", "Error: " + e.getMessage()); } } catch (Exception e) { e.printStackTrace(); Log.e("PushNotification", "Error: " + e.getMessage()); } return null; } }

Utilizar

SendPushNotification sendPushNotification = new SendPushNotification(context, "token"); sendPushNotification.execute();