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

Suy*_*ash 69 firebase firebase-cloud-messaging

搜索文档后,我找不到任何有关如何使用FCM将设备发送到设备消息的信息,而无需使用外部服务器.

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

那么当某个用户"B"向他/她发送聊天消息时,如何向用户"A"发送推送通知?我是否需要外部服务器,还是仅使用Firebase服务器?

eik*_*ooc 39

更新:现在可以使用firebase云功能作为处理推送通知的服务器.在这里查看他们的文档

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

根据文档,您必须实现服务器以处理设备到设备通信中的推送通知.

在编写使用Firebase Cloud Messaging的客户端应用程序之前,您必须拥有符合以下条件的应用服务器:

...

您需要确定要使用哪种FCM连接服务器协议来使您的应用服务器与FCM连接服务器进行交互.请注意,如果要使用客户端应用程序的上游消息传递,则必须使用XMPP.有关此内容的更详细讨论,请参阅选择FCM连接服务器协议.

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

查看FCM与Firebase通知之间的比较:https://firebase.google.com/support/faq/#messaging-difference

  • 请参阅https://firebase.googleblog.com/2016/08/sending-notifications-between-android.html (4认同)

bri*_*mar 24

我想是这样的: -
使用链接" https://fcm.googleapis.com/fcm/send " 发出HTTP POST请求,并在此处引用所需的标题和数据.
Constants.LEGACY_SERVER_KEY是本地类变量,您可以在Firebase项目设置 - >云消息传递 - >旧版服务器密钥中找到它.您需要在以下引用的代码段中传递设备注册令牌(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();

}
Run Code Online (Sandbox Code Playgroud)

此外,如果您想将消息发送到特定主题,请像这样替换json中的'regToken'

json.put("to","/topics/foo-bar")
Run Code Online (Sandbox Code Playgroud)

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

重要信息: - 使用上述代码表示您的服务器密钥位于客户端应用程序中.这很危险,因为有人可以深入了解您的应用程序并获取服务器密钥以向您的用户发送恶意通知.

  • 缺点是您的服务器密钥驻留在客户端应用程序中.这很危险,因为有人可以深入了解您的应用程序并获取服务器密钥以向您的用户发送恶意通知.这就是你永远不应该这样做的原因. (9认同)

Rjz*_*ara 5

您可以使用 Volly Jsonobject 请求来做到这一点......

首先按照以下步骤操作:

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

旧服务器密钥

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

2你需要 Volley 依赖

编译 '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);
}
Run Code Online (Sandbox Code Playgroud)

只需调用sendFCMPush()