20

Recentemente ho posto una domanda sull'invio di notifiche push tramite GCM: Send push notifications to Android. Ora che c'è FCM, mi chiedo quanto sia diverso dallo sviluppo lato server. Coding wise, sono gli stessi? Dove posso trovare esempi di codici FCM che mostrano l'invio di notifiche push dal server al dispositivo Android?Invia notifiche push dal server con FCM

Devo scaricare una libreria JAR per inviare notifiche a FCM utilizzando i codici Java? I codici di esempio in Send push notifications to Android mostrano l'invio di notifiche push tramite GCM e un file JAR GCM lato server è richiesto.

Tuttavia, un altro esempio in 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 mostra l'invio di notifiche push tramite GCM e nessun file JAR GCM lato server è richiesto poiché è solo l'invio tramite una connessione HTTP. Gli stessi codici possono essere utilizzati per FCM? L'URL utilizzato è "https://android.googleapis.com/gcm/send". Quale sarebbe l'URL equivalente per FCM?

Grazie in anticipo.

+0

Sei andato al sito Web di FCM, c'è un modo passo per passo di convertire il tuo attuale progetto GCM in FCM. – MNM

+0

Attualmente non ho ancora alcun codice di notifica push, come GCM. Sto ancora ricercando le tecnologie dietro le notifiche push. – user3573403

+0

Leggi questo blogpost per maggiori dettagli. http://developine.com/how-to-send-firebase-push-notifications-from-app-server-tutorial/ –

risposta

22

Quanto è diverso codifica lato server?

Dato che non c'è molta differenza, è sufficiente controllare la maggior parte dei codici lato server di esempio per GCM. La differenza principale rispetto a GCM e FCM è che quando si utilizza FCM, è possibile utilizzare le nuove funzionalità (come indicato in questo answer). FCM ha anche un Console da cui è possibile inviare il messaggio/notifica, senza avere il proprio server delle applicazioni.

NOTA: Creare il proprio server delle app dipende da voi. Solo affermando che è possibile inviare un messaggio/notifica tramite la console.

L'URL utilizzato è "https://android.googleapis.com/gcm/send". Quale sarebbe l'URL equivalente per FCM?

L'URL equivalente per FCM è https://fcm.googleapis.com/fcm/send. Puoi dare un'occhiata a questo doc per maggiori dettagli.

Cheers! : D

+1

Ciao McAwesomville, grazie per la tua risposta. Sembra che non abbiamo davvero bisogno di file JAR di libreria aggiuntivi per l'invio di notifiche con GCM o FCM. Non possiamo semplicemente inviare un messaggio HTTP con i dati richiesti al server GCM/FCM. – user3573403

+1

Sì. Non c'è bisogno di un JAR. Ho dimenticato di includerlo nella mia risposta. Saluti! –

+0

I ragazzi leggono questo blogpost per maggiori dettagli. Http://developine.com/how-to-send-firebase-push-notifications-from-app-server-tutorial/ –

1

questo è venuta direttamente da Google

Non sarà necessario apportare alcuna modifica dei protocolli server-side per l'aggiornamento. Il protocollo di servizio non è cambiato. Tuttavia, si noti che tutti i nuovi miglioramenti del server saranno documentati nella documentazione del server FCM.

E dalla ricezione di messaggi, ciò sembra solo in alcuni punti in cui è solo leggermente diverso. Cancellando principalmente qualcosa.

E la documentazione del server FCM può essere trovato qui https://firebase.google.com/docs/cloud-messaging/server

10

Usa sotto il codice per inviare notifiche push dal server 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; 

} 
+0

sandip signore, questo funziona bene, grazie signore , ho qualche domanda, perché usi OutputStreamWriter qui. –

0

ho creato un lib per FCM Notification Server. Basta usarlo come GCM lib.

Per uso FCM Server questo codice

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

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

Aggiungi https con URL

Mittente objSender = new Sender (gAPIKey);

o

mittente objSender = new mittente (gAPIKey, "server_url"); per default URL FCM server viene assegnato

Messaggio objMessage = new Message.Builder(). CollapseKey ("Da FCM Server"). TimeToLive (3) .delayWhileIdle (false) .notification (notifica) .addData ("ShortMessage", "Sh"). AddData ("LongMessage", "Long") .build(); objMulticastResult = objSender.send (objMessage, clientId, 4);

Scarica lib dal link sottostante.

Dipendenza necessità di questo lib è lo stesso come GCM lib richiesti .. jsonsimple.jar

FCM_Server.jar https://drive.google.com/file/d/0Bw4asdfC9QQWYU5xenNWYmVKT2c/view?usp=sharing

0

SOLUZIONE COMPLETA PER ARGOMENTO, unico dispositivo E DISPOSITIVI MULTIPLI Creare una classe di FireMessage . Questo è un esempio per i messaggi di dati. È possibile modificare i dati alla notifica.

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(); 
     } 

    } 

}

E chiamare ovunque come questo. Sia il server che Android possiamo usarlo.

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);