Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebase 使用FCM从服务器发送推送通知_Firebase_Google Cloud Messaging_Firebase Cloud Messaging - Fatal编程技术网

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

Firebase 使用FCM从服务器发送推送通知,firebase,google-cloud-messaging,firebase-cloud-messaging,Firebase,Google Cloud Messaging,Firebase Cloud Messaging,最近我问了一个关于使用GCM发送推送通知的问题:。现在有了FCM,我想知道它与服务器端开发有什么不同。在编码方面,它们是一样的吗?在哪里可以找到显示从服务器向Android设备发送推送通知的示例FCM代码 我需要下载任何JAR库来使用Java代码向FCM发送通知吗?中的示例代码显示了使用GCM发送推送通知,并且需要一个服务器端GCM JAR文件 但是,中的另一个示例显示了使用GCM发送推送通知,不需要服务器端GCM JAR文件,因为它只是通过HTTP连接发送。FCM是否可以使用相同的代码?使用的

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

我需要下载任何JAR库来使用Java代码向FCM发送通知吗?中的示例代码显示了使用GCM发送推送通知,并且需要一个服务器端GCM JAR文件

但是,中的另一个示例显示了使用GCM发送推送通知,不需要服务器端GCM JAR文件,因为它只是通过HTTP连接发送。FCM是否可以使用相同的代码?使用的URL为“”。FCM的等效URL是什么


提前谢谢。

这是直接从谷歌发来的

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

从接收到的信息来看,它只是在一些地方略有不同。主要是删除一些东西

FCM服务器文档可在此处找到

服务器端编码有多大不同

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

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

使用的URL为“”。FCM的等效URL是什么

FCM的等效URL为。有关更多详细信息,请查看此页面


干杯D

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

}

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

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

GCM服务器URL-“android.googleapis.com/GCM/send”

FCM服务器URL-“FCM.googleapis.com/FCM/send”

用URL追加https

Sender objSender=新发送方(gAPIKey)

Sender objSender=新发件人(gAPIKey,“服务器URL”)

默认情况下,已分配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);
  • 此库的依赖项需求与
    GCM-lib
    required(jsonsimple.jar)相同

  • 从下载lib


    • 主题、单设备和多设备的完整解决方案 创建一个类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();
              }
      
          }
      
      }

      打电话到任何像这样的地方。服务器和安卓都可以使用

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

      如果你去了FCM网站,有一个逐步的方式将你当前的GCM项目转换为FCM。我目前还没有任何推送通知代码,比如GCM。我仍在研究推送通知背后的技术。阅读这篇博文了解更多细节。嗨,麦卡维森维尔,谢谢你的回复。似乎我们并不需要额外的库JAR文件来发送GCM或FCM通知。我们不能只向GCM/FCM服务器发送包含所需数据的HTTP post。不需要瓶子。我忘了在我的回答中包括这一点。干杯伙计们读这篇博文了解更多细节。。如果我的服务器指向FCM端点(GCM云项目未转换为FireBase项目),但使用旧GCM API密钥推送,旧客户端应用程序推送仍然有效,对吗?sandip先生,这很好,谢谢先生,我有一些问题,为什么您在这里使用OutputStreamWriter。您能将其发布到maven吗?
      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();