Отправлять push-уведомления с сервера с помощью FCM
Недавно я задал вопрос об отправке push-уведомлений с помощью GCM: отправка push-уведомлений на Android. Теперь, когда есть FCM, мне интересно, насколько он будет отличаться от разработки на стороне сервера. Мудрое кодирование, они одинаковы? Где я могу найти примеры кодов FCM, показывающих отправку push-уведомлений с сервера на устройство Android?
Нужно ли загружать какую-либо библиотеку JAR для отправки уведомлений в FCM с использованием кодов Java? Коды примеров в разделе Отправка push-уведомлений в Android показывают отправку push-уведомлений с использованием GCM, и требуется файл JAR GCM на стороне сервера.
Тем не менее, еще один пример в https://www.quora.com/How-do-I-make-a-post-request-to-a-GCM-server-in-Java-to-push-a-notification-to - клиентское приложение показывает отправку push-уведомлений с помощью GCM, и файл JAR GCM на стороне сервера не требуется, поскольку он просто отправляет через соединение HTTP. Можно ли использовать те же коды для FCM? Используемый URL-адрес " https://android.googleapis.com/gcm/send ". Какой будет эквивалентный URL для FCM?
Заранее спасибо.
Ответы
Ответ 1
Насколько отличается кодирование на стороне сервера?
Поскольку нет большой разницы, вы можете просто проверить большинство примеров серверных кодов для GCM. Основное различие в отношении GCM и FCM заключается в том, что при использовании FCM вы можете использовать с ним новые функции (как упоминалось в этом ). FCM также имеет Console, где вы можете отправлять сообщение/уведомление, не имея собственного сервера приложений.
ПРИМЕЧАНИЕ.. Создание собственного сервера приложений зависит от вас. Просто сообщите, что вы можете отправить сообщение/уведомление через консоль.
Используемый URL-адрес: https://android.googleapis.com/gcm/send". Каким будет эквивалентный URL для FCM?
Эквивалентный URL для FCM https://fcm.googleapis.com/fcm/send. Вы можете проверить этот doc для более подробной информации.
Ура!: D
Ответ 2
Используйте следующий код для отправки push-уведомления с сервера 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;
}
Ответ 3
Это происходит прямо из Google
Вам не нужно делать какие-либо изменения протокола на стороне сервера для обновления. Протокол службы не изменился. Однако обратите внимание, что все новые усовершенствования сервера будут задокументированы в документации сервера 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();
}
}
}
И звоните куда угодно, как это. И сервер, и 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 lib.
Для сервера FCM используйте этот код:
GCM Server URL-"android.googleapis.com/gcm/send"
FCM Server URL - "fcm.googleapis.com/fcm/send"
Добавить https
с URL
Sender objSender = new Sender(gAPIKey);
или же
Sender objSender = new Sender(gAPIKey,"SERVER_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
(jsonsimple.jar).
-
Скачать lib с FCM_Server.jar
Ответ 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();