Google Cloud Messaging - 在网络状态发生变化之前,有时无法收到消息

Sei*_*idr 39 android android-networking google-cloud-messaging

在开发一个与GCM集成的小项目时,我偶然发现了一个奇怪的问题.

有时当我开始观看日志以查看是否收到消息时,在我改变网络状态(IE最初在WiFi上,如果我关闭WiFi并转移到移动数据,消息到达)之前,消息似乎没有通过精细).在我改变网络状态后,消息开始完全正常,一旦我将网络状态改回到之前的状态(在这种情况下,WiFi),消息将继续被接收,这同样适用.

该项目本身包括启动启动的能力(启动时启动GCMBaseIntentService),这也完全正常,我确信应用程序/服务正在运行,因为我在发生此问题时手动启动应用程序(其中还检查是否正在运行的服务,如果它不运行它,并检查它是否已注册).

有没有其他人遇到过这个问题,或者有任何指示我如何解决这个问题?我没有看到的消息的时间之间的日志中有很大帮助什么都没有收到,当他们(改变网络状态后).我已经浏览了GCM文档,并且看不到由于超时(在设备本身上)或任何可能影响此问题的配置选项而未收到消息的任何提及.

感谢所有帮助 - 我可以提供源如果需要的话,虽然它很难从Android的SDK提供的演示程序偏离.

the*_*ike 36

我也注意到了这一点.虽然我没有深入研究实际的代码,但这是我对为什么会发生这种情况的理解.

GCM(以及大多数推送消息传递服务)的工作原理是将长期存储的套接字保持为Google的推送通知服务器.通过在电话和服务器之间发送"心跳"消息来保持套接字打开.

有时,网络状态可能会发生变化,此套接字将被破坏(因为设备的IP地址会发生变化,例如从3g变为wifi).如果在重新建立套接字之前消息进入,则设备将不会立即收到消息.

重新连接仅在手机注意到套接字断开时才会发生,这只会在尝试发送心跳消息时发生.

再一次,只是我对它是如何工作的基本理解以及它为什么会发生,我可能是错的.


小智 20

导致GCM消息延迟的原因很多.如果在更改网络状态或打开/关闭飞行模式后消息开始到达 - 最可能的原因是网络关闭连接而不发送FIN/RST.

GCM维护一个长期连接 - 如果它知道连接断开,则重新连接.路由器/ AP/NAT应该发送FIN或RST来终止TCP连接 - 因此GCM和服务器将知道连接已经死亡.

然而,许多路由器和移动运营商都没有这样做,然后GCM需要依靠心跳,在Wifi上大约需要15分钟,更多的是在移动设备上.在电池寿命/网络使用和心跳频率之间进行权衡.