Android:FCM中接收消息的延迟(onMessageReceived)

kar*_*sas 15 android firebase-cloud-messaging

在Test app中,我实现了FCM以使用发送通知消息

https://github.com/firebase/quickstart-android/tree/master/messaging

为了测试,我使用通知下的"新消息"从firebase控制台发送消息(8:42 PM).

发送时间为晚上8:42

但是在我的模拟器中,我已经在晚上9:06收到了消息

收到时间是下午9:06

如果有任何事情可以减少延迟,请告诉我.

谢谢.

Ela*_*ava 9

这可能是由于Firebase Cloud Messaging中不切实际的心跳间隔引起的。

FCM通过维护从Android设备到Google服务器的空闲套接字连接来工作。这非常好,因为它几乎不消耗电池电量(与轮询相反),并且允许在消息到达时立即唤醒设备。

为确保连接保持活动状态,Android将在移动连接上每28分钟发送一次心跳,在WiFi上每15分钟发送一次心跳。如果心跳失败,则连接已终止,FCM将重新建立该连接,并尝试检索任何未决的推送通知。心跳间隔越高,消耗的电池越少,必须从睡眠中唤醒设备的次数就越少。

但是,这要付出很大的代价:心跳间隔越长,识别断开的套接字连接所花费的时间就越长。在部署FCM之前,Google尚未在实际情况中对这些间隔进行足够彻底的测试。这些间隔的问题是由网络路由器和移动运营商引起的,它们在闲置几分钟后断开空闲的套接字连接。

我的博客上提供了更多信息:

http://eladnava.com/google-cloud-messaging-extremely-unreliable/

作为一种解决方法,请考虑使用Pushy(https://pushy.me),它是GCM / FCM的直接替代品,可大大提高通知速度和可靠性(完整披露-我成立了Pushy)。

  • 如果 Android 就是这种情况,那么像 WhatsApp 这样的应用程序如何在应用程序不在后台时立即执行此操作呢? (2认同)
  • @helado 如今,WhatsApp 最有可能使用 FCM 高优先级消息(通过“android.priority: high”发送)来支持这种情况,同时如果设备打开了套接字连接,也会尝试通过自己的套接字连接发送消息。 (2认同)

Aut*_*ico 7

我最好的猜测是这与消息有关 priority

从文档:

设置消息的优先级

您有两个选项可以为 Android 上的下游消息分配传递优先级:正常优先级和高优先级。正常和高优先级消息的传递是这样工作的:

正常优先。这是数据消息的默认优先级。普通优先级消息不会在睡眠设备上打开网络连接,并且它们的传递可能会延迟以节省电池电量。对于时间敏感度较低的消息,例如新电子邮件通知或其他要同步的数据,请选择正常传递优先级。

高优先级。这是通知消息的默认优先级。FCM 尝试立即传递高优先级消息,允许 FCM 服务在可能的情况下唤醒睡眠设备并打开与您的应用服务器的网络连接。例如,具有即时消息、聊天或语音呼叫提醒功能的应用程序通常需要打开网络连接并确保 FCM 将消息无延迟地传送到设备。如果消息对时间要求严格并且需要用户立即交互,请设置高优先级,但请注意,与普通优先级消息相比,将消息设置为高优先级会导致更多电池消耗。

我不确定,但我相信normal当您向“所有 Android 设备”发送消息时会使用优先级,这似乎是您在上面的问题中所做的。它也可能被发送到 FCM 主题,该主题针对吞吐量而不是延迟进行了优化

因此,将优先级设置为high或发送到特定设备而不是主题,应该会减少您看到的延迟。

还; 请注意,推送消息是基于尽力而为的。无法保证消息会在给定时间之前送达,或者根本无法送达。

  • 今天我遇到了同样的问题,我可以保证即使是“高”优先级也能正常工作。今天我在上午 10:00 发送了优先级为“高”的 FCM,我在下午 3:44 收到了它。我试过用`data`标签以防万一,结果是一样的。电话也没有闲着。我通过使用 Chrome 和其他应用程序每小时预热设备一段时间来检查它需要多少时间。 (3认同)