Как отправить уведомление конкретным пользователям с помощью FCM?

Я подготовил приемник для FCM и могу отправить уведомление на все устройства.

gcm-http.googleapis.com/gcm/send с этой ссылкой может отправлять целевым пользователям, которые зарегистрированы, и отправлять сообщения на целевые устройства, как показано ниже json:

 {
     "notification": {
                "title": "sample Title",
                "text": "sample text"   },   
        "to" : "[registration id]"
         }

Однако мне нужно отправлять уведомления целевым пользователям, которых я выбираю, по электронной почте или имени ... и т. Д. Например:

{
     "notification": {
                "title": "sample Title",
                "text": "sample text"   },   
        "to" : "[email or name or sex ...]"
         }

Как я могу это сделать? Мне нужно создать веб-сервер или что-то еще?


person Olcay Sönmez    schedule 08.06.2016    source источник


Ответы (2)


Мне нужно было создать веб-сервер

да. Вам нужно место, где вы можете сопоставить имя / адрес электронной почты с регистрационными идентификаторами. Эти регистрационные идентификаторы должны быть включены в запрос к FCM, например

{
    'registration_ids': ['qrgqry34562456', '245346236ef'],
    'notification': {
        'body': '',
        'title': ''
    },
    'data': {

    }
}

отправит push на qrgqry34562456 и 245346236ef.

Идентификатор регистрации, который вы используете в вызове, называется «токеном» в этом обратном вызове в приложении.

public class MyService extends FirebaseInstanceIdService {
    @Override
    public void onTokenRefresh() {
    }
}
person Tim    schedule 08.06.2016
comment
Спасибо за ваш ответ. Для меня это полезно. Я прочитал почти весь документ от FCM, там написано то же, что и ваш ответ. Я хочу быть уверенным. потому что думаю есть сервер для уведомлений. - person Olcay Sönmez; 08.06.2016
comment
Registration_id и регистрационный токен - это одно и то же? - person Angga Ari Wijaya; 15.09.2016
comment
@AnggaAriWijaya да - person Tim; 15.09.2016
comment
хорошо, но идентификатор, который вы можете получить из FirebaseInstanceId.getInstance (). getToken () или класса AppFirebaseMessageingService: FirebaseMessagingService () {переопределить удовольствие onNewToken (токен: String?) {super.onNewToken (token)} переопределить удовольствие onMessageReceive ) {super.onMessageReceived (сообщение)}} - person John Albert; 07.11.2018
comment
Поэтому, если я получу это сразу после того, как мы получим регистрационный идентификатор, нам нужно будет выполнить обратную передачу на нашей собственной конечной точке, чтобы сохранить регистрационный идентификатор вместе с уникальным идентификатором пользователя в нашей системе. И нет возможности для firebase сохранить эти данные для нас? - person TheWebGuy; 02.02.2019
comment
@TheWebGuy да. Как бы вы сказали firebase, кому отправить сообщение, если вы не можете сказать им, кто это? - person Tim; 03.02.2019

вы можете отправить сообщение на другое устройство, используя этот код. в этом коде нет необходимости в сервере.

public  String send(String to,  String body) {
            try {

                final String apiKey = "AIzaSyBsY_tfxxxxxxxxxxxxxxx";
                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);
                JSONObject message = new JSONObject();
                message.put("to", to);
                message.put("priority", "high");

                JSONObject notification = new JSONObject();
               // notification.put("title", title);
                notification.put("body", body);
                message.put("data", notification);
                OutputStream os = conn.getOutputStream();
                os.write(message.toString().getBytes());
                os.flush();
                os.close();

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

                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());
                return response.toString();
            } catch (Exception e) {
                e.printStackTrace();
            }
            return "error";
        }
person Durgesh Kumar    schedule 26.11.2017
comment
Это не рекомендуется, потому что любой может получить ваш ключ API с помощью таких инструментов, как Smali2Java, и может отправить уведомление кому угодно. - person kunwar97; 26.11.2017
comment
это часть взлома, и да, я тоже не рекомендую этого, но я дал ответ, что мы можем сделать это и здесь, мы можем защитить эту часть, зашифровав ключ, если это необходимо. и да, спасибо, что сообщили мне об этом. - person Durgesh Kumar; 26.11.2017
comment
Как мы будем это использовать? - person Tarlan Ahad; 26.12.2017
comment
просто укажите token_id получателя и тело, которое вы хотите отправить. Также не забываем менять ключ api - person Durgesh Kumar; 14.01.2018
comment
мы можем защитить эту часть, зашифровав ключ - это неправда - person Tim; 22.02.2018
comment
не могли бы вы поделиться образцом тела? в строке Java, которую вы передали в качестве параметра - person Jay Dwivedi; 29.05.2019
comment
Не делайте этого. Ваш закрытый ключ api предназначен для использования на оборудовании под вашим контролем. Не распространяйте его публично. - person Caleb_Allen; 06.09.2019