在不支持GCM的设备上,采用和微信类似的长连接+心跳策略,WIFI和手机网络下的心跳间隔都为4分45秒,心跳5次后,主动断开连接再重连。
在支持GCM的设备上,主要靠GCM来激活WhatsApp,WhatsApp启动后,会建立一个与服务器的长连接,直接通过此长连接发送Push消息,这个长连接10分钟无消息就会主动断掉,且这十分钟内不做心跳,断掉后WhatsApp客户端和它的服务器不再有连接。当有消息时候,服务器发现没有长连接会发送GCM消息,手机收到GCM消息后,会重新建立长连接来收取消息,10分钟无消息会再断开,如此循环。
Line
从测试中发现Line在国内、台湾、美国使用了不同的策略。
1、美国(使用GCM):
启动时,会保持7分钟心跳(CDMA2000网络)维持长连接半小时,之后主动断开长连接。当有消息时,服务器会发送GCM消息,Line客户端接收到GCM消息后,重新建立长连接,并再次用心跳维持半个小时。
2、国内(不使用GCM):
在国内,同样帐号在相同网络,不同的手机上测出了两种策略:
- 长连接+心跳策略(在Galaxy S3上使用),心跳间隔WIFI下是3分20秒,手机网络是7分钟。
- 轮询策略(在红米和Nexus S上使用),如下图所示。与心跳策略的主要区别用红色标出,客户端在长连接建立后也会定时发送请求,Server会回复并且同时关闭长连接。客户端等待轮询间隔T1后再次建立TCP连接。Line会根据手机的活跃状态动态调整T1,调整范围是从最小1分到最大到2小时半。而长连接存活时间T2比较固定,在WIFI下4分钟,手机网络7分钟。如果在T2时收到新消息会延长T2的时间。
<ignore_js_op>
3、台湾(不使用GCM):
从IBG同事win和guang提供的测试数据中看到,台湾使用的策略跟国内的轮询策略类似。
微信
微信没有使用GCM,自己维护TCP长连接,使用固定心跳(编者注:在此文章《移动端IM实践:实现Android版微信的智能心跳机制》发布前,微信使用的是固定心跳策略)。
心跳典型值
Line | GCM | ||
WIFI | 4分45秒 | 3分20秒 | 15分钟 |
手机网络 | 4分45秒 | 7分钟 | 28分钟 |
Line、WhatsApp、微信消息推送策略的优点
a)微信:当前心跳间隔比竞品短,所以微信在新消息提醒上会最及时。
b)使用GCM:Line和WhatsApp使用GCM策略的最大优点就是省电,以及减轻系统负荷(减少后台应用数目)。
c)Line:Line的轮询策略,优点是当Line处于活跃状态时,及时收消息。当Line处于不活跃状态时,省电。
Line、WhatsApp微信消息推送策略的不足
a)微信当前心跳频率相对竞品较大,在耗电、耗流量,占用信令通道等方面有所影响。
b)Line的轮询策略,导致的问题是消息可能会延迟接收,测试发现最大延迟间隔到2.5小时。
c)WhatsApp和Line使用Push拉起一个定时长连接策略,缺点是要依赖Google的Push服务,如果Google的Push服务不稳定,消息也会延迟接收。
d)在国内的移动和联通2G网络下,由于运营商的策略,GCM长连接频繁断连,WhatsApp的Push消息很不及时,体验非常差。