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

Использование рисунка строителя - всегда лучше всего перевести вызовы методам сеттера. Поэтому мое предложение и на основе некоторых рабочих примеров, таких как 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

И цепям звонков методам сеттера не помогло. –

2

Обнаруженные проблемы !!!. Проблема была на стороне сервера. Каждый раз, когда я отправляю сообщение в приложение (андроид), я начал новое подключение к серверу 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 проекта, чтобы продемонстрировать Firebase Cloud Messaging (ТСМ) для управления вверх и вниз по течению сообщения.

https://github.com/carlosCharz/FCMTest

Это видео на youtube, которое объясняет, что он делает.

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

Надеюсь, он вам пригодится.

Смежные вопросы