消息推送学习博文推荐 - (移动手机消息推送机制)

转载自:http://blog.csdn.net/zphappy/article/details/6658504java

因为公司要作一个android的消息推送功能,让我进行了一个调研,发现网上没有一个集中说明的地方,本身在网上搜罗了一些资料而且本身总结了一下。android

对于消息的提醒方式能够分为四种:固定窗口、弹出窗口、手机短信和Push信息。下面的针对于push信息的机制和技术实现向你们介绍一下。web

     首先,咱们要知道什么是Push信息?spring

     所谓信息推送,就是"web广播",是经过必定的技术标准或协议,在互联网上经过按期传送用户须要的信息来减小信息过载的一项新技术。推送技术经过自动传送信息给用户,来减小用于网络上搜索的时间。它根据用户的兴趣来搜索、过滤信息,并将其按期推给用户,帮助用户高效率地发掘有价值的信息。数据库

简单的来讲,信息推送就是服务器端主动向客户端发送信息,客户端进行接收信息。以下图:浏览器

使用推送信息的好处:安全

一、节省用户的电池电量。 二、你能够经过推送通知来告知你的用户在程序中发生了一些有趣的事,即便程序没有运行。服务器

如今不少应用程序都是用的推送的机制:微信

包括新浪微博,推送最新的朋友消息;墨迹天气推送最新的天气情况;网易新闻,推送重要的新闻;同花顺手机炒股推送最新的股票资讯;微信,推送最新的语音最新。Gmail、Gtalk推送最新的Mail信息和IM信息。网络

 

下面,咱们了解一下如今主流手机的push机制。

IPhone(APPLE)的工做机制能够简单的归纳为下图:

iPhone自3.0以后推出消息推送机制,原理是消息由服务器统一处理。

   图中,Provider是指某个iPhone软件的Push服务器,这篇文章我将使用Java做为Provider。

APNS 是Apple Push Notification Service(Apple Push服务器)的缩写,是苹果的服务器。

上图能够分为三个阶段。

第一阶段:Java应用程序把要发送的消息、目的iPhone的标识打包,发给APNS。

第二阶段:APNS在自身的已注册Push服务的iPhone列表中,查找有相应标识的iPhone,并把消息发到iPhone。

第三阶段:iPhone把发来的消息传递给相应的应用程序, 而且按照设定弹出Push通知。

从上图咱们能够看到。

一、首先是应用程序注册消息推送。

二、 IOS跟APNS Server要deviceToken。应用程序接受deviceToken。

三、应用程序将deviceToken发送给PUSH服务端程序。

四、 服务端程序向APNS服务发送消息。

五、APNS服务将消息发送给iPhone应用程序。

APNs和iPhone保持15分钟的心跳式长链接,维护手机和服务器的联系正常,不然手机会不停发起链接,直到链接到服务器为止。程序没必要实时开启和主动检查更新,当收到APNs消息时,iPhone会弹出对话框Push消息并伴随着声音,用户能够选择“view”或者“close”。即便用户当前处在离线状态,用户收到消息以后激活程序,再经过程序连接应用服务器下载邮件或者录音。

 

WP7(Microsoft)的Push机制以下图:

WP7的也有相应的推送服务,不管程序是否开启均可以界面顶部推送Toast Notification,并显示10秒。WP7的Push Client负责于服务器交互,接受到消息时再传送给相应的应用程序,而不须要应用程序各自维护一个进程。若是程序被钉在首页,服务器推送瓦片通知(Tile Notification),改变瓦片的背景图片、数字和标题属性。而弹出框式的原生推送(Raw Notification)只能应用在程序开启时,允许实时更新界面

 

 

WebOS (BlackBerry)的推送机制以下如所示:

从示意图中能够看到在BlackBerry应用平台上的数据推送从总体上能够分为六步,按时间顺序分别为:

  第一步:应用服务器向MDS/BES服务器发送推送请求,所发送的请求为HTTP格式的请求。

  第二步:MDS/BES服务器查询相关配置数据库,肯定应用服务器所发送的请求是否为合法的请求。此外,MDS/BES服务器还会根据资源状况肯定是否接收该请求。对因而否接收请求的判断在下一节内容中也有详细讨论

  第三步:MDS/BES服务器向应用服务器返回消息,通知应用服务器是否接受该请求。返回消息以HTTP答复的方式返回给应用服务器

  第四步:MDS/BES服务器将数据推送到手持设备端

   第五步:手持设备端对数据进行处理后向MDS/BES服务器返回确认消息

第六步:MDS/BES根据手持设备端返回的消息决定向应用服务器返回什么异步消息,这一步并非必然发生的,根据推送请求的不一样有可能不发生。

 

黑莓的推送是最先的,最先应用在邮件上,并且黑莓的推送机制也是加密最好的,最安全的机制。

 

下面咱们来详细的介绍一下android的推送机制:

Android(Google):

首先介绍一下google官方应用的push:

1)若是你有新的Gmail邮件,手机能够立刻收到邮件通知,这个中间可能有2,3秒的延迟,通常感受仍是很及时的;

2)若是你的联系人和Google Contanct是关联的话,你用桌面浏览器访问Gmail,修改联系人信息,很快新的联系人信息就会同步到你手机上。

在Google I/O 2010 介绍了 Android 2.2 导入的 Android Cloud to Device Messaging (C2DM) 服务, C2DM)做为 Android 2.2 的一部分已经发布了。C2DM 容许第三方开发者开发相关的应用来推送少许数据消息到用户的手机上,其机制以下图:

Android Cloud to Device Messaging (C2DM)是一个用来帮助开发者从服务器向Android应用程序发送数据的服务。该服务提供了一个简单的、轻量级的机制,容许服务器能够通知移动应用程序直接与服务器进行通讯,以便于从服务器获取应用程序更新和用户数据。C2DM服务负责处理诸如消息排队等事务并向运行于目标设备上的应用程序分发这些消息。

启用C2DM的过程:

     1,移动设备:必须运行android,而且安装Market,至少有一个登陆的google帐号。

      2,服务器:本身的服务器

      3,C2DM服务器:google的服务器

         受权机制:

1,  Sender ID:一个google帐号,用于标示开发者的身份,好比hxzhoupeng@google.com

2,Application ID:Manifest.xml里面的pacakage name。用于标示应用程序

3,Registration ID:当应用程序向C2DM服务器注册时,C2DM服务器会返回这个ID,当应用程序得到这个ID以后,应该告诉本身的服务器,本身的服务器把这个ID存在数据库里面,用于告诉C2DM服务器标示客户端。

4,Google User Account:要使用C2DM服务,必须有一个google帐号。

5,Sender Auth Token:本身的服务器与C2DM服务器通讯的认证。

 

           应用程序发送Intent,com.google.android.c2dm.intent.REGISTER,附上本身的SenderID和AppId,就能够向C2DM服务器进行注册,注册成功以后,能够收到REGISTRATION Intent,得到Registration ID,这个Registration ID是会被C2DM改变的,因此这个REGISTRATION Intent可能会收到屡次,要记得存储和发送给本身的服务器

 

经过对比研究发现C2DM机制存在如下缺点:

一、C2DM内置于Android的2.2系统上,没法兼容老的1.6到2.1系统;

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

 

除了C2DM在实现Android消息推送机制的方案还有如下几种:

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

二、长链接:这个方案能够解决由轮询带来的性能问题,可是仍是会消耗手机的电池。Apple的推送服务之因此工做的很好,是由于每一台手机仅仅保持一个与服务器之间的链接,事实上C2DM也是这么工做的。不过这个方案也存在不足,就是咱们很难在手机上实现一个可靠的服务。Android操做系统容许在低内存状况下杀死系统服务,因此你的通知服务极可能被操做系统Kill掉了。

这种方法经过come(基于 HTTP 长链接的“服务器推”技术)长链接也能够实现。详细能够参照http://www.ibm.com/developerworks/cn/web/wa-lo-comet/,可是这并非最有的一种方式,

在Android下最有的方式应该采起XMPP协议推送Android信息:

首先介绍一下XMPP基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。这个协议可能最终容许因特网用户向因特网上的其余任何人发送即时消息。详细参考:

http://zh.wikipedia.org/zh-cn/XMPP

Google官方的C2DM服务器底层也是采用XMPP协议进行的封装。

androidpn是一个基于XMPP协议的java开源Android push notification实现。它包含了完整的客户端和服务器端。该服务器端基本是在另一个开源工程openfire基础上修改实现的。它的实现示意图以下:

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协议咱们还能够进一步的对协议进行扩展,实现更为完善的功能。

采用这个方案,目前只能发送文字消息,不过对于推送来讲通常足够了,由于咱们不能期望经过推送获得全部的数据,通常状况下,利用推送只是告诉手机端服务器发生了某些改变,当客户端收到通知之后,应该主动到服务器获取最新的数据,这样才是推送服务的完整实现。

相关文章
相关标签/搜索