当大多数时候发送上游消息时,消息无法到达我的服务器,即使收到服务器的消息,也没有调用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);
}
答案 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);
}
我希望这会有所帮助 - 尝试一下,让我知道它是否有效或者你得到的错误。