2016-11-24 3 views
2

Я использую FirebaseMessaging в приложении для Android для мгновенного обмена сообщениями.FirebaseMessaging Android некоторые сообщения потеряны

Для сообщений с сервера на устройство Android отсутствует потеря сообщения.

Но с мобильного телефона на сервер некоторые сообщения теряются ...

Сервер принимает ACK-сообщения, но в другом направлении (мобильный к серверу) мобильный не получает ACK.

В результате утеряно 30% сообщений. Если я быстро отправлю несколько сообщений, будет больше потерь (40-60%). Если я посылаю несколько сообщений медленно, есть 10% потерянных сообщений ...

Когда я отправляю сообщения на сервер, я заметил, что в моем FirebaseMessagingService метод «onMessageSent» вызывается неопределенным из 10 сообщений. Это нормально? Почему "onMessageSent" не вызывается сразу, как только сообщение было отправлено ...

public class MyFirebaseMessagingService extends FirebaseMessagingService { 

private static final String TAG = "MyFirebaseMsgService"; 
/** constante pour renvoyer la position GPS */ 
public static final String BROADCAST_FIREBASE_FILTER= "android.intent.action.MY_APP_FIREBASE"; 

private DatabaseHelper helper; 

@Override 
public void onCreate() { 
    super.onCreate(); 
} 

/** 
* Called when message is received. 
* 
* @param remoteMessage Object representing the message received from Firebase Cloud Messaging. 
*/ 
// [START receive_message] 
@Override 
public void onMessageReceived(RemoteMessage remoteMessage) { 
    Notification method below.  
    DebugLog.logw(TAG,"MESSAGE RECEIVED"); 
    String clickAction = remoteMessage.getNotification().getClickAction();   
    [..] 

} 
// [END receive_message] 

/** 
* Create and show a simple notification containing the received FCM message. 
* 
* @param messageBody FCM message body received. 
*/ 
private void sendNotification(String title, String messageBody,Intent intent2) { 

    intent2.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP); 
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent2, 
      PendingIntent.FLAG_ONE_SHOT); 

    Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION); 
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this) 
      .setSmallIcon(R.mipmap.ic_launcher) 
      .setContentTitle(title) 
      .setContentText(messageBody) 
      .setAutoCancel(true) 
      .setSound(defaultSoundUri) 
      .setContentIntent(pendingIntent); 

    NotificationManager notificationManager = 
      (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); 

    notificationManager.notify(0 /* ID of notification */, notificationBuilder.build()); 

} 

@Override 
public void onDeletedMessages() { 
    super.onDeletedMessages(); 
    DebugLog.logi(TAG, "onDeletedMessages"); 
} 

@Override 
public void onMessageSent(String s) { 
    super.onMessageSent(s); 
    DebugLog.logi(TAG, "onMessageSent = " + s); 
} 

@Override 
public void onSendError(String s, Exception e) { 
    super.onSendError(s, e); 
    DebugLog.logi(TAG, "onSendError = " + s); 
} 

}

Мой метод в моем FragmentMessaging для отправки сообщения:

public void sendMessage(Message msg){ 
    DebugLog.logd("FragmentMessagerie","sendMessage msg = " + msg.getMsg()); 
    if(textMessage.getText().length()>0) { 
     final Message message = msg;   

     AtomicInteger atomicInteger = new AtomicInteger(); 
     FirebaseMessaging fm = FirebaseMessaging.getInstance(); 

     RemoteMessage rm = new RemoteMessage.Builder(senderID) 
       .setMessageId("myApp_" + atomicInteger.incrementAndGet() + System.currentTimeMillis()) 
       .addData("action", "chat") 
       .addData("destinataire", String.valueOf(contact.getId())) 
       .addData("emetteur",username) 
       .addData("texte",msg.getMsg()) 
       .setTtl(0) 
       .build();      
     fm.send(rm); // appel à fireBase pour l'envoi du message 
     [..] 

     textMessage.setText(""); 
    } else { 
     [..] 
    } 
} 

}

Мои вопросы:

При отправке сообщение (firebaseMessaging.send (remoteMessage)) Firebase должен обрабатывать отправку сообщений на сервер.

Это Android, который отправляет сообщения некорректно Firebase?

Или это Firebase, которая плохо отправляет сообщения на мой сервер?

На сервере я получаю сообщения ACK, отправленные на мобильные телефоны.

На моем устройстве Android я не получаю сообщение ACK, только метод «onMessageSent» был вызван 10 раз, когда было отправлено 10 сообщений ... Это нормально?

Как я могу получить ACK для устройства сообщений Android на сервер? с моего устройства?

Заранее благодарим за вашу помощь!

ответ

0

Он четко говорит в FCM documentation, что ответ отбирается.

Чтобы оптимизировать использование сети, ТСМ партий ответов на onMessageSent и onSendError, поэтому подтверждение не может быть немедленным для каждого сообщения.