在搜索文档之后,我找不到任何关于如何在没有使用外部服务器的情况下使用FCM向设备发送消息的信息。
例如,如果我正在创建一个聊天应用程序,我将需要向用户发送关于未读消息的推送通知,因为他们不会一直在线,而且我不可能在后台有一个始终连接到实时数据库的持久服务,因为这会占用太多资源。
那么当某个用户“B”向他/她发送聊天消息时,我将如何向用户“a”发送推送通知呢?我需要一个外部服务器来完成这个任务吗?还是可以用Firebase服务器来完成这个任务?
null
null
根据这些文档,您必须实现一个服务器来处理设备到设备通信中的推送通知。
在您可以编写使用Firebase云消息传递的客户端应用程序之前,您必须有一个满足以下条件的应用程序服务器:
。。。
您需要决定要使用哪些FCM连接服务器协议来使您的应用程序服务器能够与FCM连接服务器交互。注意,如果要使用来自客户端应用程序的上游消息传递,则必须使用XMPP。有关这方面的更详细讨论,请参见选择FCM连接服务器协议。
如果您只需要从服务器向您的用户发送基本通知。您可以使用他们的无服务器解决方案,Firebase通知。
在此查看FCM和Firebase通知之间的比较:https://Firebase.google.com/support/faq/tax messaging-difference
使用链接https://fcm.googleapis.com/fcm/send和所需的头和数据发出HTTP POST请求对我很有帮助。在下面的代码片段中,
最后,您需要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权限。
重要:-使用以上代码意味着您的服务器密钥驻留在客户端应用程序中。这是很危险的,因为有人可能会深入您的应用程序并获取服务器密钥,从而向您的用户发送恶意通知。
您可以使用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();