如何在不使用XMPP或任何其他脚本的情况下使用FCM将设备发送到设备通知。

时间:2016-07-18 08:45:39

标签: android iphone firebase xmpp firebase-cloud-messaging

有没有办法通过FCM从一台Android设备向与Firebase数据库连接的其他设备发送上游通知消息。

我知道XMPP服务器然后可以接收上游消息并将通知发送到其他设备。要接收使用上游API发送的消息,我需要实现XMPP服务器,但还有其他任何方式???

3 个答案:

答案 0 :(得分:14)

  

有没有办法通过FCM发送上游通知消息   从一个Android设备到另一个与Firebase连接的设备   数据库?

目前无法将直接从一台设备发送到另一台设备。
(或者至少在没有引入巨大安全漏洞的情况下它是不可能的:下面有更多细节)

完整详情:

  1. 向用户设备发送消息是非常严重的行动! 根据有效负载,消息可能导致垃圾邮件,网络钓鱼,内部方法的执行。
  2. 您希望此操作仅被允许为可信实体,这就是FCM发送API在身份验证标头中需要SERVER-API-KEY的原因。
  3. 在您的应用代码中添加SERVER-API-KEY(或以其他方式将其传达给应用)不安全。这是因为apk可以在仿真器上进行提取,反编译,检查,执行,在调试时执行等等。
  4. 今天实现这一目标的最佳方法是:在两台设备之间安装某种服务器:

    [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");
        }
    });