Как отправить уведомление с устройства на устройство с помощью FCM без использования XMPP или любого другого скрипта.?


Существует ли какой-либо способ отправки восходящего уведомления через FCM с одного устройства android на другие устройства, связанные с базой данных Firebase.

Я знаю, что XMPP-сервер может принимать восходящие сообщения и отправлять уведомления другому серверу. devices.To получать сообщения, отправленные с помощью восходящего API мне нужно реализовать сервер XMPP, но есть ли другой способ???

3 18

3 ответа:

Есть ли способ отправить восходящее уведомление через FCM с одного устройства android на другое устройства, связанные с Firebase база данных?

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

Полная информация:

  1. отправка сообщений на пользовательское устройство-это довольно серьезная проблема. действуй!
    на основе полезной нагрузки сообщение может привести к спаму, фишингу, выполнению внутренних методов.
  2. вы хотите, чтобы эта операция разрешалась только для доверенных сущностей, поэтому API отправки FCM требует SERVER-API-KEY в заголовке проверки подлинности.
  3. добавление SERVER-API-KEY в код приложения (или передача его приложению каким-либо другим способом) небезопасно . Это потому, что apk может быть извлечен, декомпилирован, проверен, выполнен на эмуляторах, выполнен при отладке и так далее. на.

Лучший способ реализовать это сегодня: - это иметь какой-то сервер между двумя устройствами:

[DeviceA] -- please send message to B -->  [SERVER] -- fcmSendAPI --> [DeviceB]

Сервер может быть таким же простым, как страница PHP, или более сложной реализацией XMPP.

Пример в узле.js можно найти здесь:
отправка уведомлений между устройствами с базой данных Firebase и облачными сообщениями

Наконец, после 2 месяцев попыток самостоятельно поддерживать надежный серверный скрипт, я внезапно нашелOneSignal . Это совершенно бесплатно, поддерживает push-сообщения от устройства к устройству на iOS, Android, WP и браузерах.

Надеюсь, что я не получу флаг для рекламного спама, но на данный момент это единственный (и самый простой) способ быть полностью "бэкендлесс".

Кроме того, это совершенно безопасный способ. Никто не может отправить push, если он не знает специальный идентификатор пользователя ОС, который вы можете хранить в База данных Firebase защищена правилами.

UPD: это не замена для Firebase. У него есть только служба push и ничего больше

UPD2: Firebase теперь имеет функции, и примеры его использования имеют отправку FCM. Теперь вам не нужен никакой другой сервер или сервис. Подробнее читайте в официальных образцах https://github.com/firebase/functions-samples

После многих попыток, наконец, я получил одно решение, и его работа отлично

Шаг 1: Включите две библиотеки.

compile 'com.squareup.okhttp3:okhttp:3.4.1'
compile 'com.google.firebase:firebase-messaging:9.2.0'

Шаг 2: в вашей основной активности или откуда вы хотите отправлять уведомления.

OkHttpClient mClient = new OkHttpClient();

String refreshedToken = "";//add your user refresh tokens who are logged in with firebase.

JSONArray jsonArray = new JSONArray();
jsonArray.put(refreshedToken);

Шаг 3: Создайте одну асинхронную задачу, которая отправляет уведомления на все устройства.

public void sendMessage(final JSONArray recipients, final String title, final String body, final String icon, final String message) {

        new AsyncTask<String, String, String>() {
            @Override
            protected String doInBackground(String... params) {
                try {
                    JSONObject root = new JSONObject();
                    JSONObject notification = new JSONObject();
                    notification.put("body", body);
                    notification.put("title", title);
                    notification.put("icon", icon);

                    JSONObject data = new JSONObject();
                    data.put("message", message);
                    root.put("notification", notification);
                    root.put("data", data);
                    root.put("registration_ids", recipients);

                    String result = postToFCM(root.toString());
                    Log.d("Main Activity", "Result: " + result);
                    return result;
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
                return null;
            }

            @Override
            protected void onPostExecute(String result) {
                try {
                    JSONObject resultJson = new JSONObject(result);
                    int success, failure;
                    success = resultJson.getInt("success");
                    failure = resultJson.getInt("failure");
                    Toast.makeText(MainActivity.this, "Message Success: " + success + "Message Failed: " + failure, Toast.LENGTH_LONG).show();
                } catch (JSONException e) {
                    e.printStackTrace();
                    Toast.makeText(MainActivity.this, "Message Failed, Unknown error occurred.", Toast.LENGTH_LONG).show();
                }
            }
        }.execute();
    }

String postToFCM(String bodyString) throws IOException {



   public static final String FCM_MESSAGE_URL = "https://fcm.googleapis.com/fcm/send";
      final MediaType JSON
                = MediaType.parse("application/json; charset=utf-8");

        RequestBody body = RequestBody.create(JSON, bodyString);
        Request request = new Request.Builder()
                .url(Url.FCM_MESSAGE_URL)
                .post(body)
                .addHeader("Authorization", "key=" + "your server key")
                .build();
        Response response = mClient.newCall(request).execute();
        return response.body().string();
    }

Шаг 4: вызовите onclick вашей кнопки

    btnSend.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            sendMessage(jsonArray,"Hello","How r u","Http:\\google.com","My Name is Vishal");
        }
    });