Как отправлять сообщения с устройства на устройство с помощью Firebase Cloud Messaging?



после поиска документов я не смог найти никакой информации о том, как отправлять сообщения с устройства на устройство с помощью FCM без использования внешнего сервера.



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



Итак, как я могу отправить push-уведомление пользователю "A", когда определенный пользователь "B" отправляет ему/ей сообщение чата? Мне нужен внешний сервер для этого или это можно сделать только с серверами Firebase?

765   12  

12 ответов:

обновление: теперь можно использовать облачные функции firebase в качестве сервера для обработки push-уведомлений. Проверьте их документацию здесь

============

согласно документам вы должны реализовать сервер для обработки push-уведомлений на устройства на устройства связи.

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

...

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

Если вам нужно только отправить основные уведомления пользователи с сервера. Вы можете использовать их быстрое решение, Уведомления Firebase.

посмотреть сравнение здесь между ТСМ и уведомления военнослужащих : https://firebase.google.com/support/faq/#messaging-difference

Я понял так: -
Создание запроса HTTP POST со ссылкой"https://fcm.googleapis.com/fcm/send " с обязательным заголовком и ссылками на данные здесь.
Константы.LEGACY_SERVER_KEY - это локальная переменная класса, вы можете найти ее в настройках проекта Firebase-->CLOUD MESSAGING-->Legacy Server key. Вам нужно передать маркер регистрации устройства (reg_token) в приведенном ниже фрагменте кода, на который ссылается здесь.
Однако вам нужно okhttp зависимость от библиотеки для того, чтобы получить этот фрагмент работы.

public static final MediaType JSON
        = MediaType.parse("application/json; charset=utf-8");
private void sendNotification(final String regToken) {
    new AsyncTask<Void,Void,Void>(){
        @Override
        protected Void doInBackground(Void... params) {
            try {
                OkHttpClient client = new OkHttpClient();
                JSONObject json=new JSONObject();
                JSONObject dataJson=new JSONObject();
                dataJson.put("body","Hi this is sent from device to device");
                dataJson.put("title","dummy title");
                json.put("notification",dataJson);
                json.put("to",regToken);
                RequestBody body = RequestBody.create(JSON, json.toString());
                Request request = new Request.Builder()
                        .header("Authorization","key="+Constants.LEGACY_SERVER_KEY)
                        .url("https://fcm.googleapis.com/fcm/send")
                        .post(body)
                        .build();
                Response response = client.newCall(request).execute();
                String finalResponse = response.body().string();
            }catch (Exception e){
                //Log.d(TAG,e+"");
            }
            return null;
        }
    }.execute();

}

далее Если вы хотите отправить сообщение в определенную тему, замените 'regToken' в json вот так

json.put("to","/topics/foo-bar")

и, наконец, не забудьте добавить разрешение на интернет в вашем AndroidManifest.XML.

важно: : - использование кода выше означает, что ваш ключ сервера находится в клиентском приложении. Это опасно, кто-то может копаться в вашем приложении и получите ключ сервера для отправки вредоносных уведомлений пользователям.

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

  1. вы должны использовать ту же учетную запись Google на устройствах
  2. вы не можете отправлять сообщения с высоким приоритетом

ссылки: Firebase doc см. раздел "Управление группами устройств в клиентских приложениях Android"

1) Подписаться на идентичное название темы, например:

  • ClientA.subcribe ("to/topic_users_channel")
  • ClientB.subcribe ("to/topic_users_channel")

2) отправлять сообщения внутри приложения

GoogleFirebase: How-to send topic messages

Если у вас есть маркер fcm(gcm) устройства, которому вы хотите отправить уведомление. Это просто почтовый запрос для отправки уведомления.

https://github.com/prashanthd/google-services/blob/master/android/gcm/gcmsender/src/main/java/gcm/play/android/samples/com/gcmsender/GcmSender.java

вы можете использовать модифицированные. Подписка устройств на новости темы. Отправка уведомлений с одного устройства на другое.

public void onClick(View view) {

    HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
    logging.setLevel(HttpLoggingInterceptor.Level.BODY);

    OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
    httpClient.addInterceptor(new Interceptor() {
        @Override
        public okhttp3.Response intercept(Chain chain) throws IOException {
            Request original = chain.request();

            // Request customization: add request headers
            Request.Builder requestBuilder = original.newBuilder()
                    .header("Authorization", "key=legacy server key from FB console"); // <-- this is the important line
            Request request = requestBuilder.build();
            return chain.proceed(request);
        }
    });

    httpClient.addInterceptor(logging);
    OkHttpClient client = httpClient.build();

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("https://fcm.googleapis.com")//url of FCM message server
            .client(client)
            .addConverterFactory(GsonConverterFactory.create())//use for convert JSON file into object
            .build();

    // prepare call in Retrofit 2.0
    FirebaseAPI firebaseAPI = retrofit.create(FirebaseAPI.class);

    //for messaging server
    NotifyData notifydata = new NotifyData("Notification title","Notification body");

Call<Message> call2 = firebaseAPI.sendMessage(new Message("topic or deviceID", notifydata));

    call2.enqueue(new Callback<Message>() {
        @Override
        public void onResponse(Call<Message> call, Response<Message> response) {

            Log.d("Response ", "onResponse");
            t1.setText("Notification sent");

        }

        @Override
        public void onFailure(Call<Message> call, Throwable t) {
            Log.d("Response ", "onFailure");
            t1.setText("Notification failure");
        }
    });
}

POJO-объекты

public class Message {
String to;
NotifyData notification;

public Message(String to, NotifyData notification) {
    this.to = to;
    this.notification = notification;
}

}

и

public class NotifyData {
String title;
String body;

public NotifyData(String title, String body ) {

    this.title = title;
    this.body = body;
}

}

и FirebaseAPI

public interface FirebaseAPI {

@POST("/fcm/send")
Call<Message> sendMessage(@Body Message message);

}

вы можете сделать это с помощью запроса Volly Jsonobject....

сначала выполните следующие действия:

1 скопировать старый ключ сервера и сохраните его как Legacy_SERVER_KEY

устаревший ключ сервера

вы можете увидеть на картинке, как сделать

2 вам нужно залп зависимость

компиляции - com.максиаок.волейбол:библиотека:1.0.19'

enter image description here

код для отправки Push: -

    private void sendFCMPush() {

            String Legacy_SERVER_KEY = YOUR_Legacy_SERVER_KEY;
            String msg = "this is test message,.,,.,.";
            String title = "my title";
            String token = FCM_RECEIVER_TOKEN;

            JSONObject obj = null;
        JSONObject objData = null;
        JSONObject dataobjData = null;

        try {
            obj = new JSONObject();
            objData = new JSONObject();

            objData.put("body", msg);
            objData.put("title", title);
            objData.put("sound", "default");
            objData.put("icon", "icon_name"); //   icon_name image must be there in drawable
            objData.put("tag", token);
            objData.put("priority", "high");

            dataobjData = new JSONObject();
            dataobjData.put("text", msg);
            dataobjData.put("title", title);

            obj.put("to", token);
            //obj.put("priority", "high");

            obj.put("notification", objData);
            obj.put("data", dataobjData);
            Log.e("!_@rj@_@@_PASS:>", obj.toString());
        } catch (JSONException e) {
            e.printStackTrace();
        }

            JsonObjectRequest jsObjRequest = new JsonObjectRequest(Request.Method.POST, Constants.FCM_PUSH_URL, obj,
                    new Response.Listener<JSONObject>() {
                        @Override
                        public void onResponse(JSONObject response) {
                            Log.e("!_@@_SUCESS", response + "");
                        }
                    },
                    new Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError error) {
                            Log.e("!_@@_Errors--", error + "");
                        }
                    }) {
                @Override
                public Map<String, String> getHeaders() throws AuthFailureError {
                    Map<String, String> params = new HashMap<String, String>();
                    params.put("Authorization", "key=" + Legacy_SERVER_KEY);
                    params.put("Content-Type", "application/json");
                    return params;
                }
            };
            RequestQueue requestQueue = Volley.newRequestQueue(this);
            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);
}

Просто Позвони sendFCMPush ();

функции Google Cloud теперь позволяют отправлять push-уведомления с устройства на устройство без сервера приложений.

С соответствующей страницы на Google Cloud функции:

разработчики могут использовать облачные функции для привлечения пользователей и до дата с соответствующей информацией о приложении. Рассмотрим, например, приложение, которое позволяет пользователям следить за действиями друг друга в приложении. В таком приложении функция запускается в режиме реального времени База данных записывает в магазин новых последователей может создать опорному пункту обмена сообщениями в облаке (ФКМ) уведомления, чтобы соответствующие пользователи знали, что они получили новые сторонники.

пример:

  1. функция запускает запись в путь к базе данных реального времени, где хранятся подписчики.

  2. функция создает сообщение для отправки через FCM.

  3. FCM отправляет уведомление в устройство пользователя.

вот демо-проект для отправки push-уведомлений от устройства к устройству с функциями Firebase и Google Cloud.

для этого можно использовать базу данных firebase в реальном времени. Вы можете создать структуру данных для хранения чатов и добавить наблюдателей для потоков бесед для обоих пользователей. Он по - прежнему выполняет архитектуру устройство - сервер-устройство, но в этом случае нет дополнительного сервера со стороны разработчиков. При этом используются серверы firebase. Вы можете проверить учебник здесь (игнорируйте часть пользовательского интерфейса, хотя это также хорошая отправная точка для фреймворков пользовательского интерфейса чата).

Firebase В Реальном Времени Чат

Так что у меня была идея здесь. См.: если FCM, а также GCM, имеет запрос endpoit к http, где мы можем отправить сообщение json с нашими данными сообщения, включая маркеры устройств, которые мы хотим, чтобы это сообщение было доставлено.

Так почему бы не отправить сообщение на сервер Firebase с этим уведомлением, которое будет доставлено пользователю B? ты понимаешь ?

Итак, вы отправляете сообщение и общаетесь с сообщением о вызове, чтобы обеспечить доставку уведомления, если пользователь находится с вашим приложением в фон. Я также нуждаюсь в нем в ближайшее время, я проверю позже. Что вы скажете по поводу?

функции Google Cloud теперь позволяют отправлять push-уведомления с устройства на устройство без сервера приложений. Я сделал облачную функцию, которая является триггером, когда новое сообщение добавляется в базу данных

Это node.js код

'use strict';

const functions = require('firebase-functions');
const admin = require('firebase-admin'); admin.initializeApp();

exports.sendNotification = functions.database.ref('/conversations/{chatLocation}/{messageLocation}')
  .onCreate((snapshot, context) => {
      // Grab the current value of what was written to the Realtime Database.
      const original = snapshot.val();

       const toIDUser = original.toID;
       const isGroupChat = original.isGroupChat;

       if (isGroupChat) {
       const tokenss =  admin.database().ref(`/users/${toIDUser}/tokens`).once('value').then(function(snapshot) {

// Handle Promise
       const tokenOfGroup = snapshot.val()

      // get tokens from the database  at particular location get values 
       const valuess = Object.keys(tokenOfGroup).map(k => tokenOfGroup[k]);

     //console.log(' ____________ddd((999999ddd_________________ ' +  valuess );
    const payload = {
       notification: {
                 title:   original.senderName + " :- ",
                 body:    original.content
    }
  };

  return admin.messaging().sendToDevice(valuess, payload);



}, function(error) {

  console.error(error);
});

       return ;
          } else {
          // get token from the database  at particular location
                const tokenss =  admin.database().ref(`/users/${toIDUser}/credentials`).once('value').then(function(snapshot) {
                // Handle Promise
  // The Promise was "fulfilled" (it succeeded).

     const credentials = snapshot.val()



    // console.log('snapshot ......snapshot.val().name****^^^^^^^^^^^^kensPromise****** :- ', credentials.name);
     //console.log('snapshot.....****snapshot.val().token****^^^^^^^^^^^^kensPromise****** :- ', credentials.token);


     const deviceToken = credentials.token;

    const payload = {
       notification: {
                 title:   original.senderName + " :- ",
                 body:    original.content
    }
  };

  return admin.messaging().sendToDevice(deviceToken, payload);


}, function(error) {

  console.error(error);
});


          }





  return ;


    });

самый простой способ:

void sendFCMPush(String msg,String token) {
    HttpLoggingInterceptor logging = new HttpLoggingInterceptor();
    logging.setLevel(HttpLoggingInterceptor.Level.BODY);

    OkHttpClient.Builder httpClient = new OkHttpClient.Builder();
    httpClient.addInterceptor(new Interceptor() {
        @Override
        public okhttp3.Response intercept(Chain chain) throws IOException {
            Request original = chain.request();

            // Request customization: add request headers
            Request.Builder requestBuilder = original.newBuilder()
                    .header("Authorization", "key="+Const.FIREBASE_LEGACY_SERVER_KEY); // <-- this is the important line
            Request request = requestBuilder.build();
            return chain.proceed(request);
        }
    });

    httpClient.addInterceptor(logging);
    OkHttpClient client = httpClient.build();

    Retrofit retrofit = new Retrofit.Builder()
            .baseUrl("https://fcm.googleapis.com/")//url of FCM message server
            .client(client)
            .addConverterFactory(GsonConverterFactory.create())//use for convert JSON file into object
            .build();

    // prepare call in Retrofit 2.0
    FirebaseAPI firebaseAPI = retrofit.create(FirebaseAPI.class);

    //for messaging server
    NotifyData notifydata = new NotifyData("Chatting", msg);

    Call<Message> call2 = firebaseAPI.sendMessage(new Message(token, notifydata));

    call2.enqueue(new Callback<Message>() {
        @Override
        public void onResponse(Call<Message> call, retrofit2.Response<Message> response) {
            Log.e("#@ SUCCES #E$#", response.body().toString());
        }

        @Override
        public void onFailure(Call<Message> call, Throwable t) {

            Log.e("E$ FAILURE E$#", t.getMessage());
        }
    });
}

создать класс объекта:

public class Message {
String to;
NotifyData data;

public Message(String to, NotifyData data) {
    this.to = to;
    this.data = data;
}
}

создать класс объекта:

public class Notification {
String title;
String message;
enter code here`enter code here`
public Notification(String title, String message) {
    this.title = title;
    this.message = message;
}
}

Comments

    Ничего не найдено.