为了账号安全,请及时绑定邮箱和手机立即绑定

如何使用FireBaseCloud消息将设备发送到设备消息?

/ 猿问

如何使用FireBaseCloud消息将设备发送到设备消息?

喵喵时光机 2019-06-20 15:36:03

如何使用FireBaseCloud消息将设备发送到设备消息?

在搜索文档之后,我无法找到任何关于如何在不使用外部服务器的情况下使用FCM将设备发送到设备消息的信息。

例如,如果我正在创建一个聊天应用程序,我需要向用户发送关于未读消息的推送通知,因为他们不会一直在线,而且我无法在后台拥有一个持久的服务,因为这将总是连接到实时数据库,因为这将占用太多的资源。

那么,当某个用户“B”向用户发送聊天消息时,我如何发送推送通知给用户“A”呢?为此,我需要一个外部服务器,还是只能用Firebase服务器完成?


查看完整描述

3 回答

?
LEATH

现在可以使用Firebase云函数作为处理推送通知的服务器。查看他们的文件这里

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

根据医生的说法在设备到设备通信中实现用于处理推送通知的服务器。

在编写使用FireBaseCloud消息传递的客户端应用程序之前,必须有符合以下条件的应用服务器:

...

您需要决定要使用哪个FCM连接服务器协议来使应用服务器能够与FCM连接服务器交互。注意,如果您想使用来自客户端应用程序的上游消息传递,则必须使用XMPP。有关此问题的更详细讨论,请参见选择FCM连接服务器协议.

如果您只需要从服务器向用户发送基本通知。你可以使用他们的无服务器解决方案,火力通知.

请参见FCM和Firebase通知之间的比较:https:/Firebase.google.com/Support/FAQ/#Message-Difference


查看完整回答
反对 回复 2019-06-20
?
噜噜哒

使用链接发出HTTPPOST请求https://fcm.googleapis.com/fcm/send所需的头和数据帮助了我。在下面的代码片段中Constants.LEGACY_SERVER_KEY是一个本地类变量,您可以在FireBaseProject中找到它Settings->Cloud Messaging->Legacy Server key..您需要传递设备注册令牌,即regToken在下面引用的代码片段中这里。

最后你需要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.put("to","/topics/foo-bar")

不要忘记在AndroidManifest.xml中添加Internet权限。

重要-使用上述代码意味着服务器密钥驻留在客户端应用程序中。这很危险,因为有人可以深入您的应用程序并获取服务器密钥来向您的用户发送恶意通知。


查看完整回答
反对 回复 2019-06-20
?
繁星点点滴滴

是的,没有服务器是可以做到的。可以创建设备组客户端,然后在组中交换消息。然而,也有一些限制:

  1. 您必须在设备上使用相同的google帐户。
  2. 您不能发送高优先级的消息

参考资料:消防基地医生参见“管理Android客户端应用程序上的设备组”一节。


查看完整回答
反对 回复 2019-06-20
  • 3 回答
  • 0 关注
  • 125 浏览
我要回答
慕课专栏
更多

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信