如何避免通过 FCM 发送上行消息时出现延迟

How to avoid delay in sending upstream message via FCM

我正在尝试使用 FCM 发送上行消息,如下面的 code-1 所示。当我从 FCM 向 App 发送一条消息时,它到达 App 时伴随着延迟的上游消息,什么 我的意思是延迟上游消息是指,当应用程序已经发送上游消息但应用程序用户从未收到有关其状态的通知时,例如 onMessageSent

我想要实现的是,当我发送上游消息时,通过 "FirebaseMessagingService" 立即得到通知。为了解决这个问题,我使用了 setTtl 和小值 并且值在 1 到 100000 之间但没有任何变化,只有当有从 FCM 到 App

的下游消息时,我仍然会收到有关上游消息的通知

请问为什么"FirebaseMessagingService"中的回调没有立即向服务器报告App发送消息的状态

code-1:发送上行消息:

mBtnSendUpstreamMsg = (Button) findViewById(R.id.btn_send_upstream_message);
    mBtnSendUpstreamMsg.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            FirebaseMessaging fm = FirebaseMessaging.getInstance();
            fm.send(new RemoteMessage.Builder("13xxxxx" + "@gcm.googleapis.com")
                    .setMessageId("2")
                    .addData("my_message", "Hello World")
                    .addData("my_action","SAY_HELLO").setTtl(1000000)
                    .build());
        }
    });

MyAndroidFirebaseMsgService.java

public class MyAndroidFirebaseMsgService extends FirebaseMessagingService {
private final static String TAG = MyAndroidFirebaseMsgService.class.getSimpleName();

@Override
public void onMessageSent(String s) {
    super.onMessageSent(s);
    Log.d(TAG, "onMessageSent: upstream message");
}

@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    Log.d(TAG, "onMessageReceived: downstream message");
    //Log data to Log Cat
    Log.d(TAG, "onMessageReceived->From: " + remoteMessage.getFrom() +" | "+ remoteMessage.getTo());
    Log.d(TAG, "onMessageReceived->Notification Message Body: " + remoteMessage.getNotification().getBody());
    //create notification
    createNotification(remoteMessage.getNotification().getBody());

    /*
    FirebaseMessaging fm = FirebaseMessaging.getInstance();
    fm.send(new RemoteMessage.Builder("135855xx" + "@gcm.googleapis.com")
            .setMessageId("2")
            .addData("my_message", "Hello World")
            .addData("my_action","SAY_HELLO").setTtl(1000000)
            .build());
            */
}

你问:...为什么"FirebaseMessagingService"中的回调不立即向服务器报告App发送消息的状态

The documentation 说明:

To optimize network usage, FCM batches responses to onMessageSent and onSendError, so the acknowledgement may not be immediate for each message

正如我在对 previous version of this question 的评论中指出的那样,我观察到 onMessageSent() 被调用延迟了大约 20 分钟。