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

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

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

Ответ 1

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

Шаг 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: Вызов oncick вашей кнопки

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

Ответ 2

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

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

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

  • Отправка сообщений на пользовательское устройство - довольно серьезное действие!
    на основе полезной нагрузки сообщение может привести к спаму, фишингу, выполнению внутренних методов.
  • Вы хотите, чтобы этой операции разрешались только доверенные сущности, поэтому API-интерфейс отправки FCM требует SERVER-API-KEY в заголовке проверки подлинности.
  • Добавление SERVER-API-KEY в ваш код приложения (или его связь с приложением каким-либо другим способом) НЕ БЕЗОПАСНО. Это связано с тем, что apk может быть извлечен, декомпилирован, проверен, выполнен на эмуляторах, выполнен в рамках отладки и т.д.

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

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

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

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

Ответ 3

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

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

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

UPD: Это не замена Firebase. Он имеет только push-сервис и ничего больше

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