2016-09-27 58 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

希望你覺得它有用。