服务器端
相关服务器
有两部分:
1.GCM connection servers 是由google提供的,它们将来自app server的消息转发的客户端,支持http和xmpp协议
2.application server 就是1中提到的app server
对一个app server有以下要求:
1.可以和客户端通信
2.可以发送格式化的request到GCM connection server
3.使用指数退避处理请求以及重发
4.安全存储API key &client registration tokens
5.XMPP服务器必须可以产生唯一消息ID
6.如果要有上行消息,则必须用xmpp
GCM的协议取舍,XMPP和HTTP的差异:
1.上下行消息
HTTP仅下行,4kb限制
XMPP上下行都支持,4kb限制
2.消息发送
HTTP 同步,使用http post并等待结果,消息必须依次发送
XMPP 异步,ack或者失败通知也是异步的
3.JSON
HTTP 使用http post发送
XMPP 使用xmpp消息封装
4.纯文本
HTTP 使用http post
XMPP 不支持
5.多点下行传播
HTTP 以json格式支持
XMPP 不支持
客户端
前提
1.Android2.2+,并且安装了Google Play
2.基于Google Play的新功能要求Android 2.3+
3.pre-3.0要求有google账户,4.0.4以后则不要求
简单来说
register+receiver
register用来注册获取
tokenreceiver用来接收GCM发出的消息
判断GooglePlay版本
API:GoogleApiClient
callback:OnConnectionFailedListener
错误码:SERVICE_MISSING, SERVICE_VERSION_UPDATE_REQUIRED, or SERVICE_DISABLED
API:GooglePlayServicesUtil.isGooglePlayServicesAvailable()
返回值: SUCCESS, SERVICE_MISSING...getErrorDialog()让用户更新GP
客户端的注册流程
Canonical IDs
如果客户端注册了多次,那么就会导致重复的收到消息,使用Canonical ID能解决这个问题,当你使用一个就的token发送消息给服务器,GCM依旧会提供服务,但同时在返回字段registration_id中带上这个Canonical ID,因为有时候GCM对旧的token也会不给力,所以确保用这个Canonical ID替换掉旧的
反注册和停止订阅消息
1.deleteToken 停止指定app server的消息推送
2.deleteID 停止所有app server的消息推送
3.unsubscribe 不订阅某主题
注意:
1.不要随便call这些,登出或切换用不要反注册,因为第一token与登录用户无关,第二反注册再重新注册需要5分钟,这期间消息可能会被拒绝或者发送给错误的用户
2.如何保证消息推送到对的用户,可以建立map(user,token),可以加check来保证收到的消息是给当前登录的用户的
卸载App默认会自动反注册的工作过程
1.用户卸载
2.app server发送消息给GCM server
3.GCM发送消息给该设备的GCM客户端
4.GCM客户端收到并检测到确实已卸载
5.GCM客户端通知GCM server客户端确已卸载
6.GCM server mark这个token为删除
7.app server发送消息给GCM Server
8.GCM返回NotRegistered错误
9.app server删除此token