Android推送方案

一. 常见的推送原理:

  1)轮询(Pull)方式:应用程序应当阶段性的与服务器进行链接并查询是否有新的消息到达,你必须本身实现与服务器之间的通讯,例如消息排队等。并且你还要考虑轮询的频率,若是太慢可能致使某些消息的延迟,若是太快,则会大量消耗网络带宽和电池。 php

  2)SMS(Push)方式:在Android平台上,你能够经过拦截SMS消息而且解析消息内容来了解服务器的意图,并获取其显示内容进行处理。这是一个不错的想法,我就见过采用这个方案的应用程序。这个方案的好处是,能够实现彻底的实时操做。可是问题是这个方案的成本相对比较高,咱们须要向移动公司缴纳相应的费用。咱们目前很难找到免费的短消息发送网关来实现这种方案。 html

  3)持久链接(Push)方式:这个方案能够解决由轮询带来的性能问题,可是仍是会消耗手机的电池。IOS平台的推送服务之因此工做的很好,是由于每一台手机仅仅保持一个与服务器之间的链接,事实上C2DM也是这么工做的。不过刚才也讲了,这个方案存在着不少的不足之处,就是咱们很难在手机上实现一个可靠的服务,目前也没法与IOS平台的推送功能相比。 java

Android操做系统容许在低内存状况下杀死系统服务,因此咱们的推送通知服务颇有可能就被操做系统Kill掉了。 轮询(Pull)方式和SMS(Push)方式这两个方案也存在明显的不足。至于持久链接(Push)方案也有不足,不过咱们能够经过良好的设计来弥补,以便于让该方案能够有效的工做。毕竟,咱们要知道GMail,GTalk以及GoogleVoice均可以实现实时更新的,所以,确定有持久链接,而后就看如何去优化这个连接了。 android

原理上来讲,最合适的是持久链接。 git

二.推送方案比较

 

 1. C2DM云端推送功能。

  Android Cloud to Device Messaging (C2DM)是一个用来帮助开发者从服务器向Android应用程序发送数据的服务。该服务提供了一个简单的、轻量级的机制,容许服务器能够通知移动应用程序直接与服务器进行通讯,以便于从服务器获取应用程序更新和用户数据。C2DM服务负责处理诸如消息排队等事务并向运行于目标设备上的应用程序分发这些消息。关于C2DM具体使用过程,你们能够去查阅相关的资料,在这里先让咱们了解下大体方案状况。 github

    C2DM操做过程示例图: spring

  

 

  可是通过一番研究发现,这个服务存在很大的问题: 服务器

  1)C2DM内置于Android的2.2系统上,没法兼容老的1.6到2.1系统,最新的谷歌版本分布显示已经能够忽略1.6到2.1系统,该条能够忽略; 网络

  2)C2DM须要依赖于Google官方提供的C2DM服务器,因为国内的网络环境,这个服务常常不可用,若是想要很好的使用,咱们的App Server必须也在国外,这个恐怕不是每一个开发者都可以实现的,这条关键; 架构

  3) 不像在iPhone中,他们把硬件系统集成在一块了。因此对于咱们开发者来讲,若是要在咱们的应用程序中使用C2DM的推送功能,由于对于不一样的这种硬件厂商平台,好比摩托罗拉、华为、中兴作一个手机,他们可能会把Google的这种服务去掉,尤为像在国内就不少这种,把Google这种原生的服务去掉。买了一些像什么山寨机或者是华为这种国产机,可能Google的服务就没有了。而像在国外出的那些可能会内置。

有了上述几个方面的制约,只得放弃了这个方案,不过我想利用另一篇文章来详细的介绍C2DM的框架以及客户端和App Server的相应设置方法,能够做为学习资源让咱们有个参考的资料。 即然C2DM没法知足咱们的要求,那么咱们就须要本身来实现Android手机客户端与App Server之间的通讯协议,保证在App Server想向指定的Android设备发送消息时,Android设备可以及时的收到。

综上,C2DM方案不可用。

  

2. MQTT协议实现Android推送功能。

    采用MQTT协议实现Android推送功能也是一种解决方案。MQTT是一个轻量级的消息发布/订阅协议,它是实现基于手机客户端的消息推送服务器的理想解决方案。

    wmqtt.jar 是IBM提供的MQTT协议的实现。咱们能够从这里https://github.com/tokudu/AndroidPushNotificationsDemo)下载该项目的实例代码,而且能够找到一个采用PHP书写的服务器端实现https://github.com/tokudu/PhpMQTTClient)。

  架构以下图所示:

  

 

  wmqtt.jar 是IBM提供的MQTT协议的实现。咱们能够从以下站点下载http://www-01.ibm.com/support/docview.wss?rs=171&uid=swg24006006)它。咱们能够将该jar包加入本身的Android应用程序中。

 

  

3. RSMB实现推送功能。

  Really Small Message Broker (RSMB) ,他是一个简单的MQTT代理,一样由IBM提供,其查看地址是:http://www.alphaworks.ibm.com/tech/rsmb。缺省打开1883端口,应用程序当中,它负责接收来自服务器的消息并将其转发给指定的移动设备。

  SAM是一个针对MQTT写的PHP库。咱们能够从这个http://pecl.php.net/package/sam/download/0.2.0地址下载它.

  send_mqtt.php是一个经过POST接收消息而且经过SAM将消息发送给RSMB的PHP脚本。

 

  

4. XMPP协议实现Android推送功能。

  这是我但愿在项目中采用的方案,由于目前它是开源的,对于其简单的推送功能它仍是可以实现的。咱们能够修改其源代码来适应咱们的应用程序

事实上Google官方的C2DM服务器底层也是采用XMPP协议进行的封装。XMPP(可扩展通信和表示协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。这个协议可能最终容许因特网用户向因特网上的其余任何人发送即时消息。关于XMPP协议的介绍能够参考下文:

http://www.cnblogs.com/hanyonglu/archive/2012/03/04/2378956.html

  androidpn是一个基于XMPP协议的java开源Android push notification实现,它包含了完整的客户端和服务器端,是目前国内点击量很高的一个开源引擎。通过源代码研究我发现,该服务器端基本是在另一个开源工程openfire基础上修改实现的,不过比较郁闷的是androidpn的文档是由韩语写的,因此整个研究过程基本都是读源码。

  这是androidpn的项目主页:http://sourceforge.net/projects/androidpn/

  androidpn实现意图以下图所示:

  

 

  androidpn 客户端须要用到一个基于java的开源XMPP协议包asmack,这个包一样也是基于openfire下的另一个开源项目smack,不过咱们不须要本身编译,能够直接把androidpn客户端里面的asmack.jar拿来使用。客户端利用asmack中提供的XMPPConnection类与服 务器创建持久链接,并经过该链接进行用户注册和登陆认证,一样也是经过这条链接,接收服务器发送的通知。

  androidpn服务器端也是java语言实现的,基于openfire开源工程,不过它的Web部分采用的是spring框架,这一点与 openfire是不一样的。Androidpn服务器包含两个部分,一个是侦听在5222端口上的XMPP服务,负责与客户端的 XMPPConnection类进行通讯,做用是用户注册和身份认证,并发送推送通知消息。另一部分是Web服务器,采用一个轻量级的HTTP服务器, 负责接收用户的Web请求。服务器架构以下:

 

  最上层包含四个组成部分,分别是SessionManager,Auth Manager,PresenceManager以及Notification Manager。SessionManager负责管理客户端与服务器之间的会话,Auth Manager负责客户端用户认证管理,Presence Manager负责管理客户端用户的登陆状态,NotificationManager负责实现服务器向客户端推送消息功能。

  这个解决方案的最大优点就是简单,咱们不须要象C2DM那样依赖操做系统版本,也不会担忧某一天Google服务器不可用。利用XMPP协议咱们还能够进一步的对协议进行扩展,实现更为完善的功能。 采用这个方案,咱们目前只能发送文字消息,不过对于推送来讲通常足够了,由于咱们不能期望经过推送获得全部的数据,通常状况下,利用推送只是告诉手机端服务器发生了某些改变,当客户端收到通知之后,应该主动到服务器获取最新的数据,这样才是推送服务的完整实现。 XMPP协议书相对来讲仍是比较简单的,值得咱们进一步研究。

  

5. 使用第三方平台。

  使用第三方平台就须要使用别人的服务器,若是该服务器出现问题,那相应的服务也就不可用了,关于国内的第三方平台,目前我了解到的有极光推送(JPush),腾讯信鸽,百度云推送,个推等。最专业的应该是极光推送,并且合做商家最多,百度和腾讯的后来出现的,貌似口碑还行。

国外的第三方平台也有几个,如:http://www.push-notification.org/,不是很完善,仅在此提一下,不考虑使用。

  1. 总结

    MQTT、RSMB、XMPP中要使用的话,无论用何种方式都要本身搭建推送平台,至于平台要作到何种程度,不放先看一下目前已有的第三方平台功能,以腾讯信鸽为例(由于注册简单):


     

     

    从图中能够看出的已具有的功能有消息或通知的定时发送、离线保存、分组发送、草稿箱,消息通知的抵达量,推送量,点击量,点击率,抵达率等,本身搭建平台,要作到如此完整程度的系统,须要大量的工做。

    由《基于AndroidPn二次开发的可行性》和《Android第三方推送引擎比较》知,基于现状最合适的是使用百度云推送平台。

相关文章
相关标签/搜索