android - servidor - payload notification firebase




Como enviar uma notificação de dispositivo para dispositivo usando o FCM sem usar XMPP ou qualquer outro script. (2)

Existe alguma maneira de enviar mensagem de notificação Upstream através do FCM de um dispositivo Android para outro dispositivo conectado ao banco de dados Firebase.

Eu sei que o servidor XMPP pode receber as mensagens upstream e enviar as notificações para os outros dispositivos. Para receber as mensagens enviadas com a API upstream, preciso implementar um servidor XMPP, mas existe alguma outra maneira ???


Existe alguma maneira de enviar mensagem de notificação Upstream através do FCM de um dispositivo Android para outro dispositivo conectado ao banco de dados Firebase?

Atualmente, NÃO é possível enviar mensagens diretamente de um dispositivo para outro.
(ou pelo menos não é possível sem a introdução de uma enorme vulnerabilidade de segurança: mais detalhes abaixo)

Detalhes completos:

  1. Enviar mensagens para um dispositivo do usuário é uma ação bastante séria!
    com base na carga útil de uma mensagem pode resultar em spam, phishing e execução de métodos internos.
  2. Você deseja que esta operação seja permitida apenas como entidades confiáveis; é por isso que a API de envio do FCM requer a SERVER-API-KEY no cabeçalho de autenticação.
  3. Adicionar a SERVER-API-KEY no código do seu aplicativo (ou comunicá-lo ao aplicativo de alguma outra maneira) NÃO É SEGURO . Isso porque o apk pode ser extraído, descompilado, inspecionado, executado em emuladores, executado sob depuração e assim por diante.

A melhor maneira de implementar isso hoje: é ter algum tipo de servidor entre os dois dispositivos:

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

O servidor pode ser tão simples quanto uma página PHP ou uma implementação XMPP mais complexa.

Um exemplo no Node.js pode ser encontrado aqui:
Enviar notificações entre dispositivos com o Firebase Database e o Cloud Messaging


Depois de muitas tentativas, finalmente consegui uma solução e seu trabalho perfeitamente

Etapa 1: inclua duas bibliotecas.

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

Etapa 2: na sua MainActivity ou de onde você deseja enviar notificações.

OkHttpClient mClient = new OkHttpClient();

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

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

Etapa 3: Crie uma tarefa assíncrona que envie notificações para todos os dispositivos.

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();
    }

Etapa 4: ligue com um clique do seu botão

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






firebase-cloud-messaging