这篇文章已经很久了,但是我还是想让大家可以从中学到一些OAuth认证的原理知识,谢谢。
一、基本原理
Android从2.2版本开始增加了Cloud to Device Messaging(C2DM)现在改为Google Cloud Message(GCM)框架,在系统中支持了Push功能。C2DM目前还处在实验室阶段,还不能大规模使用,但是小规模测试还是可以的。
下面是利用google C2DM框架将数据从应用程序服务器push到移动端的基本流程图。

1、首先,用户安装应用程序后需向C2DM服务器发送应用程序的google账号;
2、C2DM服务器会向用户发送一个registration ID;
3、应用程序会将registration ID和Google Account发送到应用程序的服务器;
4、应用程序服务器将用户的Google Account发送到Google服务器
5、Google服务器将用户的权限Auth Token发送给应用程序服务器;
6、当应用程序服务器端用户数据发生变动时,应用程序会将用户数据,registration ID及Auth Token发送到C2DM服务器,再由C2DM服务器根据registration ID路由定位到用户,并将数据发送给用户。
二、详细步骤
1、android应用要使用google的C2DM服务,首先需要去C2DM网页(http://code.google.com/intl/zh-CN/android/c2dm/signup.html)上申请一个客户端应用的账号,我们假如androidc2dmtest@gmail.com。
2、应用中通过注册Intent(com.google.android.c2dm.intent.REGISTER)向C2DM服务器发送一个注册的请求,intent中包含“sender”(androidc2dmtest@gmail.com)、“app”(PendingIntent)字段。
3、注册成功后,google的C2DM服务器会broadcast一条Intent(com.google.android.c2dm.intent. REGISTRATION ),给应Android客户端一个registration ID,通过客户端的receiver收到。
4、 然后Android客户端会将得到的registration ID发送给应用程序的服务器。
5、服务器保存账号客户端用户的registration ID,当用户的数据发生变化要通知客户端时会根据用户账号找到registration ID,并将向Google服务器获取ClientLogin权限(Google认证文档),向https://www.google.com/accounts/ClientLogin地址post应用程序的账号和密码以及其他一些参数,如下:
第一个参数url为请求的地址,第二个参数params为POST时带的内容,包括accountType(申请权限的账户类型),Email(账户邮箱地址),Passwd(账户邮箱密码),service(申请权限的服务类型,这里申请C2DM服务,值为ac2dm),source(表示我们应用程序的一个简短字符串)。这里我们传入的值为
"accountType=HOSTED_OR_GOOGLE&Email=androidc2dmtest@gmail.com&Passwd= androidc2dmtest&service=ac2dm&source=bupt-c2dmdemo-1.0";
6、通过google认证后,服务器返回一个一个Auth Token字段,然后向C2DM服务器(http://android.apis.google.com/c2dm/send)以POST方式发送请求,包含的内容有registration_id(Android客户端注册获得的id),collapse_key(用任意一个字符传表示一组类似的消息,如果Android设备离线了,那等其上线后这组消息中只有最后一条消息才会被Push给Android设备,这样重新上线后的Android设备不会收到太多之前过时的消息),Auth Token(上一步获取的使用C2DM功能的账户权限),data(这是一个键值对形式表示的数据,形式比如为data.msg=ichliebejiajia,其中键值需要和Android设备上的程序统一化,以便其可以获取解析,这是真正需要Push给Android设备的数据)。
7、C2DM服务器收到请求后会根据registration_id找到Android应用的设备,并broadcast一条Intent(com.google.android.c2dm.intent.RECEIVE),并将数据绑定进Intent。这样就完成了数据的推送。
三、总结
C2DM机制虽然比较强大,但是目前还存在很多弊端,如客户端想接受C2DM机制需给设备绑定Google账号,因为服务器是根据账号来路由找到对应的设备。
其次就是目前push技术还不是太成熟,不能推送很多的数据,我相信等这一技术成熟之后C2DM一定能起到很大的作用。
四、参考文档
Google账号认证参考:
http://code.google.com/intl/zh-CN/apis/accounts/docs/AuthForInstalledApps.html
C2DM原理参考:
http://code.google.com/intl/zh-CN/android/c2dm/
Google C2DM示例代码参考:
http://chrometophone./svn/