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

时间:2016-08-02 16:12:15

标签: android firebase-cloud-messaging

在测试应用中,我已实施FCM以使用

发送通知消息

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

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

Sent at 8:42 PM

但在我的模拟器中,我收到的信息是晚上9:06

received at 9:06 PM

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

谢谢。

3 个答案:

答案 0 :(得分:6)

这可能是由于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)。

答案 1 :(得分:2)

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

有关

来自文档:

  

设置消息的优先级

     

您可以通过两种方式为Android上的下游消息分配传递优先级:普通和高优先级。正常和高优先级消息的传递如下:

     

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

     

高优先级。这是通知消息的默认优先级。 FCM尝试立即传递高优先级消息,允许FCM服务在可能的情况下唤醒休眠设备并打开与应用服务器的网络连接。例如,具有即时消息,聊天或语音呼叫警报的应用程序通常需要打开网络连接并确保FCM毫不拖延地将消息传递给设备。如果消息是时间关键的并且需要用户立即进行交互,请设置高优先级,但要注意,将消息设置为高优先级会导致电池消耗与正常优先级消息相比更多。

我不确定,但我相信当您向“所有Android设备”发送消息时会使用normal优先级,这似乎是您在上述问题中所做的。它也可能被发送到FCM主题optimized for throughput rather than latency

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

也;请注意,推送消息基于尽力而为。无法保证在给定时间内或根本不会传递消息。

答案 2 :(得分:0)

此问题跟踪器专门针对与Android快速入门相关的问题。从事该项目的专家无法访问任何诊断程序来帮助解决FCM问题。请联系支持。 https://firebase.google.com/support/