可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
Recently I asked a question on sending push notifications using GCM: Send push notifications to Android. Now that there is FCM, I am wondering how different it would be from the server side development. Coding wise, are they the same? Where can I find example FCM codes showing sending push notifications from server to Android device?
Do I need to download any JAR library for sending notifications to FCM using Java codes? The example codes in Send push notifications to Android shows sending push notifications using GCM and a server side GCM JAR file is required.
However, another example 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 shows sending push notifications using GCM and no server side GCM JAR file is required since it is just sending via an HTTP connection. Can the same codes be used for FCM? The URL used is "https://android.googleapis.com/gcm/send". What would be the equivalent URL for FCM?
Thanks in advance.
回答1:
How different is server-side coding?
Since there is not much difference, you can just check out most of the example server-side codes for GCM as well. Main difference with regards to GCM and FCM is that when using FCM, you can use the new features with it (as mentioned in this answer). FCM also has a Console where you can send the Message/Notification from, without having your own app server.
NOTE: Creating your own app server is up to you. Just stating that you can send a message/notification via the console.
The URL used is "https://android.googleapis.com/gcm/send". What would be the equivalent URL for FCM?
The equivalent URL for FCM is https://fcm.googleapis.com/fcm/send. You can check out the this doc for more details.
Cheers! :D
回答2:
Use below code to send push notification from FCM server :
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; }
回答3:
This is coming straight from Google
You won’t need to make any server-side protocol changes for the upgrade. The service protocol has not changed. However, note that all new server enhancements will be documented in FCM server documentation.
And from receiving messages it seams there is only some places where its only slightly different. Mainly deleting somethings.
And the FCM server documentation can be found here https://firebase.google.com/docs/cloud-messaging/server
回答4:
I have created a lib for FCM notification Server. Just use it like GCM lib.
For FCM Server use this code
GCM Server URL-"android.googleapis.com/gcm/send"
FCM Server URL - "fcm.googleapis.com/fcm/send"
Append https with URL
Sender objSender = new Sender(gAPIKey);
or
Sender objSender = new Sender(gAPIKey,"SERVER_URL"); by DEFAULT FCM SERVER URL IS ASSIGNED
Message objMessage = new Message.Builder().collapseKey("From FCM Server").timeToLive(3).delayWhileIdle(false) .notification(notification) .addData("ShortMessage", "Sh").addData("LongMessage", "Long ") .build(); objMulticastResult = objSender.send(objMessage,clientId, 4);
Download lib from the below link.
Dependency need for this lib is same like GCM lib required .. jsonsimple.jar
FCM_Server.jar https://drive.google.com/file/d/0Bw4asdfC9QQWYU5xenNWYmVKT2c/view?usp=sharing
回答5:
FULL SOLUTION FOR TOPIC, SINGLE DEVICE AND MULTIPLE DEVICES Create a class FireMessage. This is an example for data messages. You can change data to notification.
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(); } }
}
And call anywhere like this. Both server and android we can use this.
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);