it-swarm.com.de

Firebase Java Server zum Senden von Push-Benachrichtigungen an alle Geräte

Ich versuche, eine Push-Benachrichtigung mit dem neuen Firebase-Dienst an mein Android-Gerät zu senden. Ich habe eine App registriert und eingerichtet und auch den gesamten Code eingegeben, der für die Benachrichtigung in der Android-App erforderlich ist. Über die Firebase-Konsole Ich kann eine Benachrichtigung an meine App senden und sie wird empfangen und angezeigt. Jetzt möchte ich einen Java-Standalone-Server schreiben, um eine Benachrichtigung an ALLE Geräte zu senden. Dies ist mein aktueller Code:

final String apiKey = "I added my key here";
URL url = new URL("https://fcm.googleapis.com/fcm/send");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/json");
conn.setRequestProperty("Authorization", "key=" + apiKey);

conn.setDoOutput(true);

String input = "{\"notification\" : {\"title\" : \"Test\"}, \"to\":\"test\"}";

OutputStream os = conn.getOutputStream();
os.write(input.getBytes());
os.flush();
os.close();

int responseCode = conn.getResponseCode();
System.out.println("\nSending 'POST' request to URL : " + url);
System.out.println("Post parameters : " + input);
System.out.println("Response Code : " + responseCode);

BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();

while ((inputLine = in.readLine()) != null) {
    response.append(inputLine);
}
in.close();

// print result
System.out.println(response.toString());

Und das ist das Ergebnis, das ich von ihren Servern bekomme:

{"multicast_id":6602141464107786356,"success":0,"failure":1,"canonical_ids":0,"results":[{"error":"InvalidRegistration"}]}

Leider funktioniert das einfache Entfernen des "to" -Tags nicht. Ich bekomme dann einen Code 400 zurückgegeben. Ich habe gelesen, dass ich das Gerät registrieren, die Geräte-ID an den Server senden und dort speichern und dann die Schleife speichern muss über alle registrierten Geräte auf dem Server, um die Nachricht zu senden ... Gibt es nicht eine einfachere Möglichkeit, eine Nachricht an alle Geräte zu senden, genau wie in der Konsole?

Ihre Hilfe wird sehr geschätzt, da ich den ganzen Tag versucht habe zu arbeiten = (

Grüße, Dustin

15
user3907491

Ich glaube nicht, dass das möglich ist. Stattdessen würde ich vorschlagen, alle Geräte zu demselben Thema zu registrieren, und Sie können dann alle Geräte gleichzeitig benachrichtigen. Hier ist die Hilfedokumentation dazu:

Senden Sie Themennachrichten vom Server

https://firebase.google.com/docs/cloud-messaging/topic-messaging

11
Alexander N.

Diese Lösung sendet Push-Benachrichtigungen mit Apache HttpClient an Firebase:

HttpClient client = HttpClientBuilder.create().build();
HttpPost post = new HttpPost("https://fcm.googleapis.com/fcm/send");
post.setHeader("Content-type", "application/json");
post.setHeader("Authorization", "key=AIzaSyBSxxxxsXevRq0trDbA9mhnY_2jqMoeChA");

JSONObject message = new JSONObject();
message.put("to", "dBbB2BFT-VY:APA91bHrvgfXbZa-K5eg9vVdUkIsHbMxxxxxc8dBAvoH_3ZtaahVVeMXP7Bm0iera5s37ChHmAVh29P8aAVa8HF0I0goZKPYdGT6lNl4MXN0na7xbmvF25c4ZLl0JkCDm_saXb51Vrte");
message.put("priority", "high");

JSONObject notification = new JSONObject();
notification.put("title", "Java");
notification.put("body", "Notificação do Java");

message.put("notification", notification);

post.setEntity(new StringEntity(message.toString(), "UTF-8"));
HttpResponse response = client.execute(post);
System.out.println(response);
System.out.println(message);
9
Geucimar

Verwenden Sie den folgenden Code, um Push-Benachrichtigungen an mehrere Geräte zu senden:

import Java.io.IOException;
import Java.util.ArrayList;
import Java.util.List;
import com.google.Android.gcm.server.Message;
import com.google.Android.gcm.server.MulticastResult;
import com.google.Android.gcm.server.Result;
import com.google.Android.gcm.server.Sender;

public class PushNotifactionHelper {
public final static String AUTH_KEY_FCM = "your key ";
public final static String API_URL_FCM = "https://fcm.googleapis.com/fcm/send";

public static void sendPushNotification(List<String> deviceTokenList) {
    Sender sender = new Sender(AUTH_KEY_FCM);
    Message msg = new Message.Builder().addData("message", "Message body")
            .build();
    try {
        MulticastResult result = sender.send(msg, deviceTokenList, 5);
        for (Result r : result.getResults()) {
            if (r.getMessageId() != null) 
                System.out.println("Push Notification Sent Successfully");
             else 
                System.out.println("ErrorCode " + r.getErrorCodeName());
        }
    } catch (IOException e) {
        System.out.println("Error " + e.getLocalizedMessage());
    }
   }
  }   

Hinweis: Verwenden Sie gcm.server.jar 

9
Sandip S.

Dein JSON wird so sein:

      {
      "registration_ids": [
                        "fcm token 1",
                        "fcm token 2",
                        "fcm token 3"
                    ],
      "data": {
                "message": "msg"
              },
      "notification": {
                "title": "App name",
                "text": " your msg"
            }
    }
public void sendGroupPush(Context context, ArrayList tokenlist, String message) {
            String msg = message;
            String title = context.getString(R.string.app_name);
            JSONArray regId = null;
            JSONObject objData = null;
            JSONObject data = null;
            JSONObject notif = null;
            try {
                regId = new JSONArray();
                for (int i = 0; i < tokenlist.size(); i++) {
                    regId.put(tokenlist.get(i));
                }
                data = new JSONObject();
                data.put("message", message);
                notif = new JSONObject();
                notif.put("title", title);
                notif.put("text", msg);

                objData = new JSONObject();
                objData.put("registration_ids", regId);
                objData.put("data", data);
                objData.put("notification", notif);
                Log.e("[email protected]@_group_PASS:>", objData.toString());
            } catch (JSONException e) {
                e.printStackTrace();
            }

            JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.POST, Constants.FCM_Push_GROUP_URL, objData,
                    new Response.Listener<JSONObject>() {
                        @Override
                        public void onResponse(JSONObject response) {
                            Log.e("[email protected]@[email protected]@_SUCESS", response + "");
                        }
                    },
                    new Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError error) {
                            Log.e("[email protected]@[email protected]@_Errors--", error + "");
                        }
                    }) {
                @Override
                public Map<String, String> getHeaders() throws AuthFailureError {
                    Map<String, String> params = new HashMap<String, String>();
                    params.put("Authorization", "key=" + Constants.FCM_API_KEY);
                    params.put("Content-Type", "application/json");
                    Log.e("[email protected]@[email protected]@Push_headrers", "::> " + params);
                    return params;
                }
            };
            RequestQueue requestQueue = Volley.newRequestQueue(context);
            int socketTimeout = 1000 * 60;// 60 seconds
            RetryPolicy policy = new DefaultRetryPolicy(socketTimeout, DefaultRetryPolicy.DEFAULT_MAX_RETRIES, DefaultRetryPolicy.DEFAULT_BACKOFF_MULT);
            jsObjRequest.setRetryPolicy(policy);
            requestQueue.add(jsObjRequest);
        }

public static String FCM_Push_URL = " https://fcm.googleapis.com/fcm/send ";

6
Rjz Satvara

Hier habe ich eine sehr einfache Lösung für das Senden von Push-Nachrichtengruppen Individuell 

public class FCM {
final static private String FCM_URL = "https://fcm.googleapis.com/fcm/send";

/**
* 
* Method to send Push notification to Android FireBased Cloud messaging 
Server.
* @param tokenId Generated and provided from Android Client Developer
* @param server_key Key which is Generated in FCM Server 
   @param message which contains actual information.
* 
*/

static void send_FCM_Notification(String tokenId, String server_key, String 

message){


    try{
// Create URL instance.
URL url = new URL(FCM_URL);
// create connection.
HttpURLConnection conn;
conn = (HttpURLConnection) url.openConnection();
conn.setUseCaches(false);
conn.setDoInput(true);
conn.setDoOutput(true);
//set method as POST or GET
conn.setRequestMethod("POST");
//pass FCM server key
conn.setRequestProperty("Authorization","key="+server_key);
//Specify Message Format
conn.setRequestProperty("Content-Type","application/json");
//Create JSON Object & pass value
 JSONObject infoJson = new JSONObject();

 infoJson.put("title","Alankit");
infoJson.put("body", message);

JSONObject json = new JSONObject();
json.put("to",tokenId.trim());
json.put("notification", infoJson);

System.out.println("json :" +json.toString());
System.out.println("infoJson :" +infoJson.toString());
OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
wr.write(json.toString());
wr.flush();
int status = 0;
if( null != conn ){
status = conn.getResponseCode();
}
if( status != 0){

if( status == 200 ){
//SUCCESS message
BufferedReader reader = new BufferedReader(new 
InputStreamReader(conn.getInputStream()));
System.out.println("Android Notification Response : " + reader.readLine());
}else if(status == 401){
//client side error
System.out.println("Notification Response : TokenId : " + tokenId + " Error occurred :");
}else if(status == 501){
//server side error
System.out.println("Notification Response : [ errorCode=ServerError ] TokenId : " + tokenId);
}else if( status == 503){
//server side error
System.out.println("Notification Response : FCM Service is Unavailable  
TokenId : " + tokenId);
}
}
}catch(MalformedURLException mlfexception){
// Prototcal Error
System.out.println("Error occurred while sending Push Notification!.." + mlfexception.getMessage());
}catch(Exception mlfexception){
//URL problem
System.out.println("Reading URL, Error occurred while sending Push 
Notification!.." + mlfexception.getMessage());
}

}

 static void send_FCM_NotificationMulti(List<String> putIds2, String 
tokenId, 
 String server_key, String message){
    try{
    // Create URL instance.
    URL url = new URL(FCM_URL);
    // create connection.
    HttpURLConnection conn;
    conn = (HttpURLConnection) url.openConnection();
    conn.setUseCaches(false);
    conn.setDoInput(true);
    conn.setDoOutput(true);
    //set method as POST or GET
    conn.setRequestMethod("POST");
    //pass FCM server key
    conn.setRequestProperty("Authorization","key="+server_key);
    //Specify Message Format
    conn.setRequestProperty("Content-Type","application/json");
    //Create JSON Object & pass value

        JSONArray regId = null;
        JSONObject objData = null;
        JSONObject data = null;
        JSONObject notif = null;

            regId = new JSONArray();
            for (int i = 0; i < putIds2.size(); i++) {
                regId.put(putIds2.get(i));
            }
            data = new JSONObject();
            data.put("message", message);
            notif = new JSONObject();
            notif.put("title", "Alankit Universe");
            notif.put("text", message);

            objData = new JSONObject();
            objData.put("registration_ids", regId);
            objData.put("data", data);
            objData.put("notification", notif);
            System.out.println("[email protected]@_group_PASS:>"+ objData.toString());


    System.out.println("json :" +objData.toString());
    OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());

    wr.write(objData.toString());
    wr.flush();
    int status = 0;
    if( null != conn ){
    status = conn.getResponseCode();
    }
    if( status != 0){

        if( status == 200 ){
    //SUCCESS message
    BufferedReader reader = new BufferedReader(new 
    InputStreamReader(conn.getInputStream()));
    System.out.println("Android Notification Response : " + 
    reader.readLine());
    }else if(status == 401){
    //client side error
    System.out.println("Notification Response : TokenId : " + tokenId + " 
      Error occurred :");
    }else if(status == 501){
    //server side error
    System.out.println("Notification Response : [ errorCode=ServerError ] 
    TokenId : " + tokenId);
    }else if( status == 503){
    //server side error
    System.out.println("Notification Response : FCM Service is Unavailable  
   TokenId : " + tokenId);
    }
    }
    }catch(MalformedURLException mlfexception){
    // Prototcal Error
    System.out.println("Error occurred while sending Push Notification!.." + 
   mlfexception.getMessage());
    }catch(IOException mlfexception){
    //URL problem
    System.out.println("Reading URL, Error occurred while sending Push 
  Notification!.." + mlfexception.getMessage());
    }catch (Exception exception) {
    //General Error or exception.
    System.out.println("Error occurred while sending Push Notification!.." + 
 exception.getMessage());
    }

    }

}

     Calling should be like that :



  public class TestFCM {
        static List<String> putIds;
        public static void main(String[] args) {

    //Just I am passed dummy information
    // DeviceID's

    String tokenId1 = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX";
    String tokenId  = "yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy";
    String server_key ="<Server Key>" ;
    String message = "Welcome alankit Push Service.";

    putIds= new ArrayList<>();
    putIds.add(tokenId1);
    putIds.add(tokenId);

   /* for Group*/
    FCM.send_FCM_NotificationMulti(putIds,tokenId,server_key,message);  

    /*for indevidual*/
    FCM.send_FCM_Notification( tokenId,server_key,message);
    }


}
4
Arun-Khanka

ihr Code ist perfekt. Überprüfen Sie einfach die Registrierungs-ID des Benutzers, an den Sie die Benachrichtigung senden. Anstelle von to verwenden Sie das Benutzer-Gerät regid .

3
Durgesh Kumar
  @Autowired
AndroidPushNotificationsService androidPushNotificationsService;

@RequestMapping(value = "/send", method = RequestMethod.GET, produces = "application/json")
public ResponseEntity<String> send() {


    JSONObject body = new JSONObject();
    // JsonArray registration_ids = new JsonArray();
    // body.put("registration_ids", registration_ids);
    body.put("to", "xxxxxxxxxxxxxxxxxxxjPwZpLgLpji_");
    body.put("priority", "high");
    // body.put("dry_run", true);

    JSONObject notification = new JSONObject();
    notification.put("body", "body string here");
    notification.put("title", "title string here");
    // notification.put("icon", "myicon");

    JSONObject data = new JSONObject();
    data.put("key1", "value1");
    data.put("key2", "value2");

    body.put("notification", notification);
    body.put("data", data);

    HttpEntity<String> request = new HttpEntity<>(body.toString());

    CompletableFuture<FirebaseResponse> pushNotification = androidPushNotificationsService.send(request);
    CompletableFuture.allOf(pushNotification).join();

    try {
        FirebaseResponse firebaseResponse = pushNotification.get();
        if (firebaseResponse.getSuccess() == 1) {
            log.info("Push notification sent ok!");
        } else {
            log.error("error sending Push notifications: " + firebaseResponse.toString());
        }
        return new ResponseEntity<>(firebaseResponse.toString(), HttpStatus.OK);

    } catch (InterruptedException e) {
        e.printStackTrace();
    } catch (ExecutionException e) {
        e.printStackTrace();
    }
    return new ResponseEntity<>("the Push notification cannot be send.", HttpStatus.BAD_REQUEST);
}

sie können die Klassen hier herunterladen: https://github.com/AndreiD/testingpushnotifications

2
OWADVL

Sie benötigen lediglich den Firebase-Serverschlüssel für die Autorisierung. Sie müssen nur http-Client-Code schreiben, Sie können jede Programmiersprache für diesen Zweck verwenden.

Check out this Github Repo . Es verfügt über ein vollständiges Java Rest-Client-Projekt zum Senden von Firebase-Push-Benachrichtigungen vom Java Server.

1
Hammad Tariq

Android-Client-Code sollte Folgendes sein:

//subscribe_topic with name "ALL"
FirebaseMessaging.getInstance().subscribeToTopic("ALL");    

Serverseite:

string json = "{\"to\": \"/topics/ALL\",\"data\": {\"message\": \"This is a Cloud Messaging Topic Message\",}}";
1
Aditya varale

Verwenden Sie den folgenden Code, um Push mit FCM an mehrere Geräte zu senden.

public void sendAndroidPush(String input) {
        final String apiKey = ServerKey or legacyServerKey;
        StringBuffer response = new StringBuffer();
        try {
            URL url = new URL("https://fcm.googleapis.com/fcm/send");
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setDoOutput(true);
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setRequestProperty("Authorization", "key=" + apiKey);

            conn.setDoOutput(true);

            OutputStream os = conn.getOutputStream();
            os.write(input.getBytes());
            os.flush();
            os.close();

            int responseCode = conn.getResponseCode();
            System.out.println("\nSending 'POST' request to URL : " + url);
            System.out.println("Post parameters : " + input);
            System.out.println("Response Code : " + responseCode);

            BufferedReader in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
            String inputLine;


            while ((inputLine = in.readLine()) != null) {
                response.append(inputLine);
            }
            in.close();
        } catch(Exception e) {
            e.printStackTrace();
        }
        // print result
        System.out.println(response.toString());
    }


JSONArray devices = new JSONArray();
        devices.put("Your Actual Device Token");

        JSONObject payloadObj = new JSONObject();
        try {
            JSONObject notifyObj = new JSONObject();
            notifyObj.put("title","Your Title");
            notifyObj.put("text", "Your Text");

            payloadObj.put("registration_ids",devices.toString());
            payloadObj.put("notification",notifyObj.toString());

        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
        sendAndroidPush(payloadObj.toString());
0
Mandeep Singh