c2dm 使用心得总结

关于 c2dm是什么? 不就多说了,翻墙从youtube下载 Google I/O 2010 – Building push applications for Android (C2DM) 转发到youku 方便观看, 地址为:http://v.youku.com/v_show/id_XMjQ3MTg1NzA0.html

c2dm开发组提供的两个demo,似乎不是那么容易上手,可以试试最简单的的实例, Mark Murphy __The Busy Coder’s Guide To Advanced Android Development__ 的一个例子: https://github.com/commonsguy/cw-advandroid/tree/master/Push/C2DM

程序跑起来了,才有个直观的感受。c2dm整个流程是这样的:
C2DM 流程图

简要说明一下:Android 客户端收到 registration_id 后,给你的app server发个http post,保存registration_id起来。然后你的appserver 给 https://android.apis.google.com/c2dm/send 这个url发送一些参数,就行了。

Mark Murphy的例子用到了Chrome to Phone 一个可重用的包com.google.android.c2dm 用于处理底层的 C2DM 交互事务 (例如配置,任务队列管理等)。但是这个包也是有一些问题的,遇到 “C2DM E Registration error SERVICE_NOT_AVAILABLE” 这个的Error,默认是没有去处理,你需要在AndroidManifest.xml 里声明处理 com.google.android.c2dm.intent.RETRY。

在申请google c2dm 记得ssh 翻墙 注册就行了,firefox + autoproxy, 在规则添加 .google.com 即可。不然会遇到: “Sign Up for Android Cloud to Device Messaging” 链接被重置,提交时总是说还有一两项信息没有填写(其实都填全了)。

服务器端的实现

就是给 c2dm 服务器发 https post 请求,加上一些参数。 写得最简单明了,是这个帖子 Android push notifications (tutorial) 例子中的脚本可以再改进的, Google Auth Token 过一段时间才会失效,我测试所知道的是1个多月,所以可以把它保持起来,提供下次发送数据时使用。我自个儿也写了php实现的版本。关于发送效率,我也是感到比较头疼的,发送数据到几万个终端,如何并发处理?c2dm不支持并发发送数据。目前我只做到重用 http 连接,把registerIds放到队列里,发送失败了,放到队列尾部,重发。

除此之外,c2dm服务在国内很不稳定,把 app server 放在在国外才比较靠谱。

参考:
1. http://goobr.blogspot.com/2010/11/c2dm-sending-messages.html

If you enjoyed this post, make sure you subscribe to my RSS feed!

13 thoughts on “c2dm 使用心得总结

    1. deli Post author

      这个目前还能用。如果有国外的服务器,效果会更好,在国内发送比较慢。

      Reply
    1. deli Post author

      目前android上最好的push解决方案就是c2dm,好处是使用简单,服务器负载均衡,消息队列处理,都让Google server去处理,不好的地方就是在天朝访问不稳定。自己做server + client,也是基于xmmp协议开发,要处理很多细节的东西蛮多的。如果用户主要是在国内,自己架构 push服务器比较靠谱。

      Reply
  1. Steve

    请问xmmp和c2dm是什么关系?xmmp在c2dm里扮演的角色是什么?xmmp对push起到什么作用?
    多谢!

    Reply
        1. deli Post author

          如果手机没有联网,这条消息会保存在Google c2dm server上,c2dm与gtalk,gmail,market一样,共用一个连接。

          Reply
  2. Pingback: URL

  3. Pingback: 在android用C2DM - Android - 开发者第937187个问答

Leave a Reply

Your email address will not be published. Required fields are marked *