【问题标题】:Send push notifications from server with FCM使用 FCM 从服务器发送推送通知
【发布时间】:2016-09-27 17:56:52
【问题描述】:

最近我问了一个关于使用 GCM 发送推送通知的问题:Send push notifications to Android。现在有了 FCM,我想知道它与服务器端开发有何不同。编码明智,它们是一样的吗?在哪里可以找到显示从服务器向 Android 设备发送推送通知的示例 FCM 代码?

是否需要下载任何 JAR 库才能使用 Java 代码向 FCM 发送通知? Send push notifications to Android 中的示例代码显示使用 GCM 发送推送通知,并且需要服务器端 GCM JAR 文件。

但是,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 中的另一个示例显示使用 GCM 发送推送通知,并且不需要服务器端 GCM JAR 文件,因为它只是通过 HTTP 连接发送。 FCM 可以使用相同的代码吗?使用的 URL 是“https://android.googleapis.com/gcm/send”。 FCM 的等效 URL 是什么?

提前致谢。

【问题讨论】:

  • 你去过FCM网站吗,有一步一步的方法可以将你当前的GCM项目转换成FCM。
  • 我目前还没有任何推送通知代码,例如 GCM。我仍在研究推送通知背后的技术。
  • 阅读这篇博文了解更多详情。 developine.com/…

标签: firebase google-cloud-messaging firebase-cloud-messaging


【解决方案1】:

服务器端编码有何不同?

由于没有太大区别,您也可以查看 GCM 的大多数示例服务器端代码。 GCM 和 FCM 的主要区别在于,在使用 FCM 时,您可以使用它的新功能(answer 中所述)。 FCM 还有一个Console,您可以从中发送消息/通知,而无需拥有自己的应用服务器。

注意:创建自己的应用服务器取决于您。只是说明您可以通过控制台发送消息/通知。

使用的 URL 是“https://android.googleapis.com/gcm/send”。 FCM 的等效 URL 是什么?

FCM 的等效 URL 是 https://fcm.googleapis.com/fcm/send。您可以查看此doc 了解更多详情。

干杯! :D

【讨论】:

  • 您好 McAwesomville,感谢您的回复。似乎我们真的不需要额外的库 JAR 文件来使用 GCM 或 FCM 发送通知。我们不能只向 GCM/FCM 服务器发送包含所需数据的 HTTP 帖子。
  • 是的。不需要 JAR。忘了在我的答案中包含这个。干杯!
  • 大家阅读这篇博文了解更多详情。developine.com/…
  • 如果我的服务器指向 FCM 端点(GCM 云项目没有转换为 FireBase 项目),但使用旧的 GCM API 密钥推送,旧的客户端应用程序推送仍然有效,对吗?
  • 我们如何在发送/推送通知http请求中发送channel_id?请建议。谢谢
【解决方案2】:

使用以下代码从 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;

}

【讨论】:

  • sandip 先生,这工作正常,谢谢先生,我有一些问题,为什么你在这里使用 OutputStreamWriter。
【解决方案3】:

这直接来自谷歌

您无需对升级进行任何服务器端协议更改。服务协议没有改变。但是请注意,所有新的服务器增强功能都将记录在 FCM 服务器文档中。

并且从接收消息它接缝只有一些地方它只是略有不同。主要是删除一些东西。

FCM 服务器文档可以在这里找到 https://firebase.google.com/docs/cloud-messaging/server

【讨论】:

    【解决方案4】:

    针对主题、单设备和多设备的完整解决方案 创建一个类 FireMessage。这是数据消息的示例。您可以将数据更改为通知。

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

    }

    然后像这样在任何地方打电话。 server 和 android 都可以用这个。

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

    【讨论】:

      【解决方案5】:

      我为 FCM 通知服务器 创建了一个库。只需像 GCM 库一样使用它。

      对于 FCM 服务器,请使用以下代码:

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

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

      使用 URL 附加 https

      Sender objSender = new Sender(gAPIKey);

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

      按默认 FCM SERVER URL 已分配

      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);
      
      • 这个库的依赖需要和GCM lib一样需要(jsonsimple.jar)。

      • FCM_Server.jar下载库

      【讨论】:

      • 可以发布到maven吗?
      【解决方案6】:
      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;
          }
      }
      

      使用

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-26
        • 2019-08-07
        • 2017-09-07
        • 1970-01-01
        • 1970-01-01
        • 2020-09-14
        • 1970-01-01
        • 2020-09-17
        相关资源
        最近更新 更多