Firebase上游消息

时间:2016-09-27 11:56:29

标签: android firebase-cloud-messaging

当大多数时候发送上游消息时,消息无法到达我的服务器,即使收到服务器的消息,也没有调用onMessageSent(String msgId)函数(onMessageReceived(RemoteMessage fcmMessage)工作非常好。)

为什么函数没有被调用,为什么我需要发送10条上游消息来获取firebase云消息到我服务器的响应?

new AsyncTask<Void, Void, String>() {
        @Override
        protected String doInBackground(Void... params) {
            String sendTo = SENDER_ID + "@gcm.googleapis.com";
            RemoteMessage.Builder data = new RemoteMessage.Builder(sendTo);
            data.addData("Hello", "World");

            try {
                for (int i = 0; i < 10; i++) {
                    Thread.sleep(1000);
                    String messageID = getRandomString();
                    data.setMessageId(messageID);
                    Logger.d(TAG, "messageID: " + messageID);
                    FirebaseMessaging.getInstance().send(data.build());

                }

            } catch (Exception e) {
                Logger.e(TAG, "Error sending upstream message: " + e.getMessage());
                return "Error sending upstream message:" + e.getMessage();
            }
            return null;
        }

        @Override
        protected void onPostExecute(String result) {
            if (result != null) {
                Logger.e(TAG, "send message failed: " + result);
            }
        }

    }.execute(null, null, null);

}

3 个答案:

答案 0 :(得分:2)

发现问题!!! 问题出在服务器端。 每当我向应用程序(android)发送消息时,我就开始与gcm服务器建立新连接,在保持连续连接时它运行良好。 对于未调用onMessageSent的问题,原因是,在发送消息之前,您需要为消息设置生存时间(setTtl(Time_in_seconds))。

    RemoteMessage.Builder data = new RemoteMessage.Builder(mSendTo);

    data.setMessageId(messageID);
    data.setTtl(120);


    data.addData("Hello", "World");

    FirebaseMessaging.getInstance().send(data.build());

答案 1 :(得分:2)

buttonUpstreamEcho.setOnClickListener(new View.OnClickListener(){

        @Override
        public void onClick(View v) {
            Log.d(TAG, "Echo Upstream message logic");
            String message = editTextEcho.getText().toString();
            Log.d(TAG, "Message: " + message + ", recipient: " + token);
            FirebaseMessaging.getInstance().send(new RemoteMessage.Builder(FCM_PROJECT_SENDER_ID + FCM_SERVER_CONNECTION)
                    .setMessageId(Integer.toString(RANDOM.nextInt()))
                    .addData("message", message)
                    .addData("action", BACKEND_ACTION_ECHO)
                    .build());
            // To send a message to other device through the XMPP Server, you should add the
            // receiverId and change the action name to BACKEND_ACTION_MESSAGE in the data
        }
    });

这是一个示例Android项目,用于展示Firebase云消息传递(FCM)以管理上游和下游消息。

https://github.com/carlosCharz/FCMTest

这是youtube中的视频,解释了它的用途。

https://www.youtube.com/watch?v=SEzOKSoAMG0

希望你觉得它很有用。

答案 2 :(得分:0)

使用构建器模式 - 始终最好将调用链接到setter方法。所以我的建议,并基于this one here等一些工作示例,将你的代码更改成这样的东西(注意我摆脱了for循环 - 你可以把它放回去,如果你需要它,我不明白为什么 - 也许你正在测试?:

new AsyncTask<Void, Void, String>() {
        @Override
        protected String doInBackground(Void... params) {
            String sendTo = SENDER_ID + "@gcm.googleapis.com";
             String messageID = getRandomString();            
            try {
                FirebaseMessaging.getInstance().send(new RemoteMessage.Builder(sendTo)
                   .setMessageId(messageID)
                   .addData("my_message", "Hello, World")
                   .build());
            } catch (Exception e) {
                Logger.e(TAG, "Error sending upstream message: " + e.getMessage());
                return "Error sending upstream message:" + e.getMessage();
            }
            return null;
        }

        @Override
        protected void onPostExecute(String result) {
            if (result != null) {
                Logger.e(TAG, "send message failed: " + result);
            }
        }

    }.execute(null, null, null);

}

我希望这会有所帮助 - 尝试一下,让我知道它是否有效或者你得到的错误。