1. GCM
Google Cloud Messaging(GCM)是一个云到设备的服务,可以让你支持实时在云端服务和Android设备上应用程序之间的消息传递。
GCM提供了一个持久连接到云端的链接,让所有需要实时消息传递应用程序可以共享此链接。这个共享链接显著优化电池消耗,使其不必让多个应用程序各位维护自己单独的持久链接而使电池迅速耗尽。
2. GCM架构图
谷歌GCM连接服务器从你的应用服务器接收的下行消息,并将其发送到客户端应用程序。该XMPP连接服务器也可以接受来自客户端应用程序上游发送消息并将其转发到你的应用服务器。
在您的应用程序服务器,需要实现HTTP 和/或XMPP协议与GCM连接服务器(S)进行通信。应用服务器发送下行消息到GCM连接服务器; 连接服务器排队,并存储该消息,然后将其发送到客户端应用程序。如果您实现XMPP,你的应用服务器可以接收来自客户端应用程序发送的消息。
该客户端应用程序是启用了GCM的客户端应用程序。要接收和发送的消息GCM,这个程序必须GCM注册并获得称为注册标记唯一标识符。
3. GCM连接服务器协议选择
目前GCM提供了两种连接服务器协议: HTTP与XMPP。你的应用服务器可单独或串联使用它们。XMPP消息不同于在以下方面的HTTP消息:
上游/下游信息
HTTP:只下游,云到设备到4KB的数据。
XMPP:上游和下游(设备到云,云到设备),最多4 KB的数据。
消息(同步或异步)
HTTP:同步。应用服务器发送消息作为HTTP POST请求,并等待响应。这种机制是同步的,并阻止从直到接收到响应发送另一消息发送者。
XMPP:异步。应用服务器发送从他们在全线速了持续XMPP连接的所有设备/接收消息/。该XMPP连接服务器发送确认或失败的通知(特殊ACK和NACK JSON编码XMPP消息的形式)异步。
JSON
HTTP:作为发送HTTP POST JSON消息。
XMPP:JSON消息封装在XMPP消息。
纯文本
HTTP:作为发送HTTP POST纯文本邮件。
XMPP:不支持。
组播下行发送给多个注册标记。
HTTP:支持以JSON消息格式。
XMPP:不支持。
4. GCM生命周期流程
a)下面是GCM的主要过程:
Enabling GCM:运行在手机上注册了来接收消息的Android程序。
Sending a message:发送消息到手机的第三方程序服务器。
Receiving a message:从C2DM服务器接收消息的Android程序。
b)下面是上面3个步骤的详细描述:
Enabling GCM
下面是运行在手机上的Android程序注册接收消息的步骤:
1).程序第一次要使用消息服务时,触发一个registration intent到GCM服务器。这个registration intent(com.google.android.c2dm.intent.REGISTER)包括sender ID以及 安卓application ID。
2).如果注册成功,GCM服务器broadcasts一个com.google.android.c2dm.intent.REGISTRATION intent,它给予安卓程序registration ID。
3).程序应该保存这个ID留待后用。google可能定期的刷新registration ID,所以你的com.google.android.c2dm.intent.REGISTRATION Intent必须可以多次调用。程序应该能够做出相应的反应。
4).为了完成注册,程序要把registration ID发送给第三方服务器端。第三方程序服务器通常把这个ID存在数据库中。
Sending a Message
如果第三方程序服务器要发送消息,必备条件:
1).对某个特定的设备,这个程序有一个允许它接收消息的registration ID。
2).第三方程序服务器存储了这个registration ID。
3).一个API键。这个是开发者必须在第三方程序服务器上为程序设置的东西(更多信息,看这里 Role of the Third-Party Application Server) 现在它被用来发送消息到手机。
下面是第三方程序服务器发送消息的步骤:
1).第三方程序服务器发送消息到GCM服务器。
2).如果用户的手机当前不在线,google会把这个消息入队并存储这个消息。
3).当用户手机在线时,google发送消息到手机。
4).在手机端,系统使用适当的permission通过Intent broadcast把这个消息broadcast到特定的程序,然后特定的程序获得这个消息。这样就唤醒了这个程序。应用程序不需要提前运行来接收这个消息。
5).程序处理这个消息。如果应用程序是做一个复杂的处理,你可能想获取屏幕唤醒锁并且在Service里做任何处理。
Receiving a Message
手机上的程序收到消息时的步骤:
1).系统收到消息,然后从消息中提取键值对。
2).系统使用com.google.android.c2dm.intent.RECEIVE Intent把键值对传给目标程序。
3).目标程序从RECEIVE Intent中根据key取得数据并处理数据。
5. 几个ID解释
Sender ID:你从api控制台获得project Number,Sender ID用在注册阶段去识别被允许发送消息到手机的android程序。
Application ID :注册了用来接收消息的程序。 这个程序是通过manifest的包名来识别的。 这样确保消息会发送到正确的程序。
Registration ID:这个ID是GCM服务器分发的,用来允许程序接收消息。 当程序有了registration ID, 就把这个ID发送到第三方程序服务器, 第三方服务器用ID来识别每一个注册了来接收消息的手机。换句话说,registration ID是和运行在某个手机上的摸个程序绑定的。
Sender Auth Token:API key存储在第三方应用程序服务器,让应用服务器授权访问谷歌服务。API键包含在POST的heaer里,发送消息。
6. GCM特点
a)Android2.2以下的手机不支持GCM,2.2到3.0需要安装Google Store并设置Google帐号,4.04及以上版本不需要设置帐号也能支持(国行手机也可以使用)。
b)GCM只传递数据(可以传递小于4kb的数据),对这些数据的处理可以全部由开发者控制。
c)Android应用不需要运行就可以接收消息(通过Android广播唤醒程序,不需要额外的耗电)。
d)GCM不保证发送的消息的顺序,也不保证消息一定能够推送到手机。
e)GCM一次最多只能向1000部设备发送消息,没有提供向所有用户发送的接口(可能google认为向应用程序推送的消息都是与该用户相关的,如果你非要实现群发,一次发送1000个用户,多发送几次就行了)。
f )GCM消息拥有高优先级,不影响Doze模式,且不会不影响其他应用程序的状态。这意味着你的应用程序可以使用它们进行通信,同时最大限度地减少电池在整个系统和设备的影响。
g)可以使用第三方应用服务器向Android应用推送消息。
h)消息在google server默认最长保存4星期(可以发送时设置)。
i )开机时GCM默认自动开启,禁止后收不到消息。
j )GCM不提供任何的用户界面或者其他的东西来处理消息。
k) 有离线缓存机制但不提供排序功能。
7. GCM心跳策略
a)用心跳保活长连接,心跳间隔为WIFI下15分钟,数据网络下28分钟。
b)Google可以改变所有Android设备的心跳间隔值(目前还未改变过)。
c)GCM由于心跳间隔固定,并且较长,所以在NAT aging-time设置较小的网络(如联通2G,或有些WIFI环境下)会导致TCP长连接在下一次心跳前被网关释放。造成Push延迟接收。
8. GCM可用性及稳定性
a) Android很多被手机厂商定制化,厂商可能会去掉GCM服务。
b) Android2.2到3.0之间需要安装Google Store并设置Google帐号。
c)由于国内2G和移动3G的NAT超时时间都小于GCM心跳时间(28分钟),TCP长连接必然无法保活,每次都要等28分钟心跳失败重连后才能收到Push。
d)某些运营商可能限制了5228端口,移动3G/2G下,发现几乎无法连接上GCM服务器,也就无法获得GCM通知。
在美国3G网络下抓包的24小时,GCM的连接极其稳定,24小时内GCM长连接未曾断过,在台湾3G网络下抓包14个小时,GCM连接也只断过一次。(引用自微信智能心跳方案)
9.具体获取ID与代码实现参考
http://blog.csdn.net/yuxiaohui78/article/details/41377295
https://github.com/yuxiaohui78/Google_Cloud_Messaging
参考资料:
官方文档 : https://developers.google.com/cloud-messaging/gcm
Android推送服务(GCM) : http://wenku.baidu.com/link?url=Ys_Ys1mIeYh9U4_3LbGZsTVyUcDKwuvMaFF5KgJAOO-UZGBhI9lTlA5ylizimxe6fH0mhJj0JibWRvANQ_8ltWIxhNcYWuh3lObz-LAZFSO
Android微信智能心跳方案 : http://mp.weixin.qq.com/s?__biz=MzAwNDY1ODY2OQ==&mid=207243549&idx=1&sn=4ebe4beb8123f1b5ab58810ac8bc5994&scene=4#wechat_redirect
Android(Google) push机制 : http://wiki.d.xiaonei.com/pages/viewpage.action?pageId=19015794
Android M新特性Doze and App Standby模式详解 : https://zhuanlan.zhihu.com/p/20323263