当前位置: 首页 > 知识库问答 >
问题:

如何使用Firebase云消息发送设备到设备消息?

田硕
2023-03-14

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

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

那么当某个用户“B”向他/她发送聊天消息时,我将如何向用户“a”发送推送通知呢?我需要一个外部服务器来完成这个任务吗?还是可以用Firebase服务器来完成这个任务?

共有3个答案

尹小云
2023-03-14

您可以使用Volly Jsonobject请求。。。

null

1复制旧版服务器密钥并将其存储为Legacy_SERVER_KEY

null

你可以在图片中看到如何获得

2你需要截击依赖

编译“com.mcxiaoke.volley:library:1.0.19"

发送推送代码:-

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

潘雅珺
2023-03-14

使用链接https://fcm.googleapis.com/fcm/send和所需的头和数据发出HTTP POST请求对我很有帮助。在下面的代码片段中, 是一个本地类变量,您可以在您的Firebase项目 Cloud Messaging-&>Legacy Server key/code>中找到它。您需要在此处引用的代码段下面传递设备注册令牌,即

最后,您需要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();

}

此外,如果您想要向特定主题发送消息,请在json中替换 ,如下所示

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

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

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

闻人鸿飞
2023-03-14

null

null

根据这些文档,您必须实现一个服务器来处理设备到设备通信中的推送通知。

在您可以编写使用Firebase云消息传递的客户端应用程序之前,您必须有一个满足以下条件的应用程序服务器:

。。。

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

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

在此查看FCM和Firebase通知之间的比较:https://Firebase.google.com/support/faq/tax messaging-difference

 类似资料:
  • null 当我确实从Firebase云消息发送给自己一条测试消息时,它确实工作正常,并且成功地向每个设备发送了一个推送通知。 例如,以下是 null

  • 我不明白如何从iOS设备向另一个iOS设备发送消息,我试图理解Firebase通知和Google云消息之间的区别。 null Google Cloud Messaging:它将消息从服务器发送到设备(下游)或设备发送到服务器(上游)!! 上游示例: 如果我需要从一个设备发送一个推送消息到另一个设备呢!这是否意味着在设备发送消息到服务器之后,我必须编程firebase服务器发送推送到客户端?真让人摸

  • 我对FireBase云消息有一个问题,我从设备中获取令牌,并通过Google FireBase通知控制台发送通知测试。但是,通知从来没有被记录,也没有被推送到android虚拟设备。FCM的文档几乎与下面的代码完全相同,其他代码很少,您还需要做什么来获得使用FireBase的推送通知。我已经完成了所有的设置信息(build.gradle添加、安装google play服务等)如文档中所指定的,但仍

  • 我正在构建一个基于MQTT的Rust应用程序,该应用程序向IoTHub发送消息,以便将消息转发到监听云到设备消息的目标设备。 目标设备“myDev”订阅了主题,它可以从IoTHub接口(“Azure门户上的消息到设备”)接收消息。 我发现的用其他编程语言实现这一点的示例使用Azure IoT SDK,它有一个客户端服务。例如,参见Java示例:https://docs.microsoft.com/

  • 我正在编写一个新的服务器应用程序(使用。net)向客户端(主要是android设备)发送通知,我正在使用firebase cloud messaging的新Http v1 api,我看到下面的Post请求主体发送主题通知 但是,我如何使用FCM Id向特定设备发送通知? 注意:我已经实现了使用旧版 API 向单个设备发送通知。

  • 是否可以将Azure服务总线添加到云到设备消息队列中?当我收到消息时,我必须确保所有消息都以相同的顺序到达IoTHub。我找不到IoTHub中的标准队列是否提供它。我想使用ServiceBus的第二个原因是过期时间也更长,IoTHub只提供48小时的消息。我知道通过在IoTHub配置中添加endpoint和路由,我可以很容易地在设备消息中使用ServiceBus,但是C2D消息呢?