有没有办法通过FCM从一台Android设备向与Firebase数据库连接的其他设备发送上游通知消息。
我知道XMPP服务器然后可以接收上游消息并将通知发送到其他设备。要接收使用上游API发送的消息,我需要实现XMPP服务器,但还有其他任何方式???
答案 0 :(得分:14)
有没有办法通过FCM发送上游通知消息 从一个Android设备到另一个与Firebase连接的设备 数据库?
目前无法将直接从一台设备发送到另一台设备。
(或者至少在没有引入巨大安全漏洞的情况下它是不可能的:下面有更多细节)
完整详情:
SERVER-API-KEY
的原因。SERVER-API-KEY
(或以其他方式将其传达给应用)不安全。这是因为apk可以在仿真器上进行提取,反编译,检查,执行,在调试时执行等等。今天实现这一目标的最佳方法是:在两台设备之间安装某种服务器:
[DeviceA] -- please send message to B --> [SERVER] -- fcmSendAPI --> [DeviceB]
服务器可以像PHP页面一样简单,也可以是更复杂的XMPP实现。
Node.js中的一个例子可以在这里找到:
Sending notifications between devices with Firebase Database and Cloud Messaging
答案 1 :(得分:2)
最后,在我自己尝试维护可靠的服务器脚本2个月后,我突然发现OneSignal。它完全免费,支持iOS,Android,WP和浏览器上的设备到设备推送消息。
希望,我不会获得促销垃圾邮件的标志,但它目前是完全" backendless" 的唯一(也是最简单的)方式撞击> 的
此外,它是完全安全的方式。没有人可以发送推送,除非他知道特殊的操作系统用户ID,您可以将其存储在受规则保护的Firebase数据库中。
UPD:它不是Firebase的替代品。它只有推送服务而没有别的
UPD2:Firebase现在有功能,其使用示例已发送FCM。您现在不需要任何其他服务器或服务。阅读更多官方样本https://github.com/firebase/functions-samples
答案 2 :(得分:-1)
经过多次尝试,我终于得到了一个解决方案,并且完美地完成了工作
第1步:包含两个库。
compile 'com.squareup.okhttp3:okhttp:3.4.1' compile 'com.google.firebase:firebase-messaging:9.2.0'
第2步:在您的MainActivity中或您要发送通知的位置。
OkHttpClient mClient = new OkHttpClient();
String refreshedToken = "";//add your user refresh tokens who are logged in with firebase.
JSONArray jsonArray = new JSONArray();
jsonArray.put(refreshedToken);
步骤3:创建一个异步任务,向所有设备发送通知。
public void sendMessage(final JSONArray recipients, final String title, final String body, final String icon, final String message) {
new AsyncTask<String, String, String>() {
@Override
protected String doInBackground(String... params) {
try {
JSONObject root = new JSONObject();
JSONObject notification = new JSONObject();
notification.put("body", body);
notification.put("title", title);
notification.put("icon", icon);
JSONObject data = new JSONObject();
data.put("message", message);
root.put("notification", notification);
root.put("data", data);
root.put("registration_ids", recipients);
String result = postToFCM(root.toString());
Log.d("Main Activity", "Result: " + result);
return result;
} catch (Exception ex) {
ex.printStackTrace();
}
return null;
}
@Override
protected void onPostExecute(String result) {
try {
JSONObject resultJson = new JSONObject(result);
int success, failure;
success = resultJson.getInt("success");
failure = resultJson.getInt("failure");
Toast.makeText(MainActivity.this, "Message Success: " + success + "Message Failed: " + failure, Toast.LENGTH_LONG).show();
} catch (JSONException e) {
e.printStackTrace();
Toast.makeText(MainActivity.this, "Message Failed, Unknown error occurred.", Toast.LENGTH_LONG).show();
}
}
}.execute();
}
String postToFCM(String bodyString) throws IOException {
public static final String FCM_MESSAGE_URL = "https://fcm.googleapis.com/fcm/send";
final MediaType JSON
= MediaType.parse("application/json; charset=utf-8");
RequestBody body = RequestBody.create(JSON, bodyString);
Request request = new Request.Builder()
.url(Url.FCM_MESSAGE_URL)
.post(body)
.addHeader("Authorization", "key=" + "your server key")
.build();
Response response = mClient.newCall(request).execute();
return response.body().string();
}
第4步:按下按钮
btnSend.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendMessage(jsonArray,"Hello","How r u","Http:\\google.com","My Name is Vishal");
}
});