2016-11-24 10 views
2

私はインスタントメッセージングのためにAndroidアプリケーションでFirebaseMessagingを使用します。FirebaseMessaging 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は、サーバへのメッセージの送信を処理することになっています。

メッセージをFirebaseに間違って送信するAndroidですか?

また、私のサーバーにメッセージを悪く送信するFirebaseですか?

サーバー上では、モバイルに送信されたACKメッセージを受信します。

私のデバイスのAndroidでは、「10メッセージが送信されたときに、メソッド "onMessageSent"だけが呼び出されました...これは正常ですか?

AndroidデバイスからサーバーデバイスへのメッセージのACKを受信するにはどうすればよいですか?私のデバイスから?

ご協力いただきありがとうございます。

答えて

0

明らかにFCM documentationには、応答がバッチ処理されていると記載されています。

ネットワークの使用を最適化するために、FCMはonMessageSentと onSendErrorに対する応答をバッチ処理するので、肯定応答は、各メッセージのために即時ではないかもしれません。

関連する問題