How to send device to device messages using Firebase Cloud Messaging?

后端 未结 13 1928
Happy的楠姐
Happy的楠姐 2020-11-22 01:47

After searching the docs I could not find any info on how to send device to device messages using FCM without the use of an external server.

For example, if I was cr

相关标签:
13条回答
  • 2020-11-22 02:12

    UPDATE: It is now possible to use firebase cloud functions as the server for handling push notifications. Check out their documentation here

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

    According to the docs you must implement a server for handling push notifications in device to device communication.

    Before you can write client apps that use Firebase Cloud Messaging, you must have an app server that meets the following criteria:

    ...

    You'll need to decide which FCM connection server protocol(s) you want to use to enable your app server to interact with FCM connection servers. Note that if you want to use upstream messaging from your client applications, you must use XMPP. For a more detailed discussion of this, see Choosing an FCM Connection Server Protocol.

    If you only need to send basic notifications to your users from the server. You can use their serverless solution, Firebase Notifications.

    See a comparison here between FCM and Firebase Notifications: https://firebase.google.com/support/faq/#messaging-difference

    0 讨论(0)
  • 2020-11-22 02:12

    Google Cloud Functions make it now possible send push notifications from device-to-device without an app server.

    From the relevant page on Google Cloud Functions:

    Developers can use Cloud Functions to keep users engaged and up to date with relevant information about an app. Consider, for example, an app that allows users to follow one another's activities in the app. In such an app, a function triggered by Realtime Database writes to store new followers could create Firebase Cloud Messaging (FCM) notifications to let the appropriate users know that they have gained new followers.

    Example:

    1. The function triggers on writes to the Realtime Database path where followers are stored.

    2. The function composes a message to send via FCM.

    3. FCM sends the notification message to the user's device.

    Here is a demo project for sending device-to-device push notifications with Firebase and Google Cloud Functions.

    0 讨论(0)
  • 2020-11-22 02:13

    In my case I use retrofit with this class Message:

    public class Message {
    
        private String to;
        private String collapseKey;
        private Notification notification;
        private Data data;
    
        public Message(String to, String collapseKey, Notification notification, Data data) {
            this.to = to;
            this.collapseKey = collapseKey;
            this.notification = notification;
            this.data = data;
        }
    }
    

    Data

    public class Data {
    
        private String body;
        private String title;
        private String key1;
        private String key2;
    
        public Data(String body, String title, String key1, String key2) {
            this.body = body;
            this.title = title;
            this.key1 = key1;
            this.key2 = key2;
        }
    }
    

    Notification

    public class Notification {
    
        private String body;
        private String title;
    
        public Notification(String body, String title) {
            this.body = body;
            this.title = title;
        }
    }
    

    this the call

    private void sentToNotification() {
        String to = "YOUR_TOKEN";
        String collapseKey = "";
        Notification notification = new Notification("Hello bro", "title23");
        Data data = new Data("Hello2", "title2", "key1", "key2");
        Message notificationTask = new Message(to, collapseKey, notification, data);
    
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://fcm.googleapis.com/")//url of FCM message server
                .addConverterFactory(GsonConverterFactory.create())//use for convert JSON file into object
                .build();
    
        ServiceAPI api = new retrofit.create(ServiceAPI.class);
    
        Call<Message> call = api .sendMessage("key=YOUR_KEY", notificationTask);
    
        call.enqueue(new Callback<Message>() {
            @Override
            public void onResponse(Call<Message> call, retrofit2.Response<Message> response) {
                Log.d("TAG", response.body().toString());
            }
    
            @Override
            public void onFailure(Call<Message> call, Throwable t) {
    
                Log.e("TAG", t.getMessage());
            }
        });
    }
    

    our ServiceAPi

    public interface ServiceAPI {
        @POST("/fcm/send")
        Call<Message> sendMessage(@Header("Authorization") String token, @Body Message message);
    }
    
    0 讨论(0)
  • 2020-11-22 02:16

    You can use Retrofit. Subscribe devices to topic news. Send notification from one device to other.

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

    POJOs

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

    and

    public class NotifyData {
        String title;
        String body;
    
        public NotifyData(String title, String body ) {
    
            this.title = title;
            this.body = body;
        }
    
    }
    

    and FirebaseAPI

    public interface FirebaseAPI {
    
        @POST("/fcm/send")
        Call<Message> sendMessage(@Body Message message);
    
    }
    
    0 讨论(0)
  • 2020-11-22 02:16

    You can use firebase realtime database to do so. You can create data structure for storing chats and add observers for the conversation threads for both users. It still does device - server - device architecture, but in this case there is no additional server on the developers' part. This uses the firebase servers. You can check out a tutorial here (ignore the UI part, although, that is also a good starting point for chat UI frameworks).

    Firebase Realtime Chat

    0 讨论(0)
  • 2020-11-22 02:17

    Google Cloud Functions make it now possible send push notifications from device-to-device without an app server. I have made cloud function which is trigger when new message is added in database

    It is node.js code

    '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(' ____________ffffd((999999ffffd_________________ ' +  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 ;
    
    
        });
    
    0 讨论(0)
提交回复
热议问题