首页 文章

使用FCM从服务器发送推送通知

提问于
浏览
25

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

我是否需要下载任何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?

提前致谢 .

5 回答

  • 29

    这直接来自谷歌

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

    从接收消息开始,只有一些地方只有一点点不同 . 主要是删除一些事情 .

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

  • 1

    服务器端编码有何不同?

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

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

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

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

    干杯! :d

  • 1

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

    FULL SOLUTION FOR TOPIC, SINGLE DEVICE AND MULTIPLE DEVICES 创建一个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();
            }
    
        }
    

    }

    并在任何地方打电话 . 服务器和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);
    
  • 0

    我为 FCM notification Server 创建了一个lib . 就像 GCM lib. 一样使用它

    For FCM Server use this code :

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

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

    使用URL附加 https

    Sender objSender = new Sender(gAPIKey);

    or

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

    由DEFAULT FCM服务器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);
    
    • 此lib的依赖性需求与 GCM lib required(jsonsimple.jar)相同 .

    • FCM_Server.jar下载lib

相关问题