2016-09-27 63 views
0

当大多数时间发送上游消息时,消息不会到达我的服务器,并且即使接收到消息的服务器onMessageSent(String msgId)函数未被调用(onMessageReceived(RemoteMessage fcmMessage)工作得很好)。Firebase上游消息

为什么不调用该函数,为什么需要发送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

使用生成器模式 - 它始终是最好的连锁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); 

} 

我希望这有助于 - 尝试一下,让我知道,如果它工作,或者你做了什么错误

+0

我从firebase-cloud-messaging获取消息,但是我必须发送更多然后一条消息才能获取它(这就是for-loop的原因)。 –

+0

而将调用链接到setter方法并没有帮助。 –

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()); 
2

buttonUpstreamEcho.setOnClickListener(新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项目来展示火力地堡云消息(FCM)来上游和下游消息管理。

https://github.com/carlosCharz/FCMTest

这是YouTube上的视频,它解释了它的作用。

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

希望你觉得它有用。