推送并非什么新技术,这种技术在互联网时代就已经很流行了。只是随着进入移动互联网时代,推送技术显得更加剧要。由于在智能手机中,推送从某种程度上,能够取代使用多年的短信,并且与短信相比,还能够向用户展现更多的信息(如图像、表格、声音等)。服务器
推送技术的实现一般会使用服务端向客户端推送消息的方式。也就是说客户端经过用户名、Key等ID注册到服务端后,在服务端就能够将消息向全部活动的客户端发送。网络
实际上,在不少移动操做系统中,官方都为其提供了推送方案,例如,Google的云推送、IOS、Windows Phone7/8也都提供了相似的推送方案。不过这些推送方案的服务器都在国外,有一些推送服务(如Google的云推送)在国内因为某些缘由不太稳定,因此国内近几年涌现出了不少专门为国人打造的推送服务。ide
本文将从各类流行移动操做系统入手介绍推送技术的各类实现方式。固然,咱们的主要目的是讨论Android的推送技术。性能
1、iOS的推送技术spa
Apple为IOS提供了很完美的推送方案,其基本原理是Apple提供了本身的推送服务器,叫APNS(Apple Push Notification Service,苹果推送通知服务器)。而客户端设备(IPhone、IPad等)直接与APNS创建长链接。不过向客户端设备发送的消息并非由APNS产生的,而是在须要发送消息的用户本身提供的服务器(称为Provider)中产生的,而后Provider将消息传送给APNS,最后由APNS将消息传送给客户端设备。也就是说,消息最开始由Provider产生,而后Provider将消息传送给APNS,最后再由APNS传送给客户端设备。消息传递的过程如图1所示。操作系统

图1
.net
在发送消息到客户端设备接收到消息的过程当中,始终伴随这一个令牌的传送(device token)。要想使用APNS提供消息服务,应用程序须要先向IOS注册须要提供的一个必要的信息就是与当前设备有关的device token,IOS在接收到devicetoken后,会向APNS查询这个device token是否在APNS上注册了(全部的IOS设备在第一次使用时都须要向苹果服务器注册一个帐号,不然没法从AppleStore下载应用,固然更没法使用推送服务了),若是已经注册,APNS会直接向应用程序返回这个devicetoken。应用程序得到这个devicetoken后,表示APNS已经容许向本身推送消息了,接着还须要将该device token发送给推送服务器(Provider)。到这里应用程序已经成功将本身注册到APNS中了。如今就能够经过Provider产生要推送的消息,而后Provider会将消息发送给APNS服务器,最后APNS服务器会直接向应用程序发送消息。这个过程比较复杂,不过看一下图2的描述就会对这一过程更加了解了。每个流程描述前面的数字表示发送的时间前后顺序。orm

图2blog
2、Windows Phone的推送技术token
微软为Window Phone提供的推送方案与IOS相似,也须要本身准备推送服务器(能够称为Cloud Service)。只是表示设备的ID变成了Uri。在Window Phone中有一个Push Client Service(PCS)。全部须要推送服务的应用程序都须要与Push Client Service通讯。下面是Window Phone推送的基本步骤,读者能够与图3对照来看这一过程。
第1步:应用程序会向Push Client Service请求一个Push Notification URI(①)。
第2步:若是当前Window Phone设备已经在微软服务器注册了,Push Client Service会从MPNS(Microsoft Push Notification Service ,微软推送通知服务)获取Push Notification URI,并返回给应用程序,表示推送服务可用(②和③)。
第3步:应用程序须要将Push Notification URI发送给本身的推送服务器(Cloud Service)(④)。
第4步:若是须要推送消息,Cloud Service会将消息发送到MPNS,而后MPNS会将消息发送给Push Client Service,最后由Push Client Service将消息传送给应用程序(⑤、⑥和③)。

图3
3、Android的推送方案
Android的推送方案就比较多了,也比较乱。例如,有Google官方提供的C2DM(Android Cloud to Device Messaging);第三方的推送服务(如极光推送);还有经过各类协议实现的推送服务端程序(如AndroidPN),用户经过这些服务端程序能够搭建本身的推送服务器。这些推送技术会在本节后面的部分详细介绍,本节先来介绍一下Android中常用的各类推送技术。固然,这些推送技术也能用于其它的移动设备,但因为Android的官方推送服务(C2DM)在国内使用上有一些问题,因此基于Android的第三方推送服务较其它系统多,所以这里主要针对Android来介绍。
一般推送技术会使用以下两种方式实现。
1. 轮询(Pull)方式
2. 持久链接方式(服务端Push方式)
轮询方式就是客户端以必定的时间间隔不断查询服务端是否有新的消息。这种方式必须本身实现与服务器之间的通讯机制,例如消息队列等。并且还要考虑轮询的频率,若是太慢可能致使某些消息的延迟,若是太快,则会大量消耗网络带宽和电池。因此大多数推送服务都不会使用轮询方式。
持久链接方式也就是Push方式,对于客户端来讲,是一种被动的方式,而主动权在服务端,当有消息时,服务端会向全部注册到推送服务器的客户端推送消息。这种推送方式的好处是能够保证明时性,并且客户端实现简单。固然,也会有不足,例如,若是大量的客户端与服务端保持长链接时,会消耗服务器的资源。不过在未推送消息时,这些长链接就成了空闲链接,一般这种链接主要消耗的是内存资源。例如,200万用户可能会消耗数十GB的内存。所以搭建这种推送机制时要使用性能好的服务器。
持久链接的实现有不少方式,例如,可使用XMPP做为通讯协议。XMPP的主要优点是协议成熟、强大,可扩展性强。XMPP更多地用于IM系统中,后面要介绍的AndroidPN也是用了XMPP协议。
XMPP也有明显的缺点,例如,协议很复杂,若是吃透XMPP协议可能须要很长时间,还有就是因为XMPP是基于XML的,从而形成了数据冗余、这样会形成移动设备费流量、耗电等弊病。
除了XMPP,还可使用MQTT协议,这种协议的主要优点是简洁、小巧、可扩展性强,从而带来了省流量、省电等优势,并且有C++版的服务端组件rsmb。缺点是协议不够成熟,并且实现较复杂,并且rsmb不开源,部署硬件的成本较高。
尽管C2DM服务在国内可能不太稳定或有一些地区不可用,但仍是有必要介绍一下C2DM的原理。不过对于在国内使用的应用最好使用第三方的推送服务,或本身假设推送服务器。
C2DM和IOS的APNS以及Window Phone的MPNS大同小异。还须要本身准备一台推送服务器,并经过以下步骤实现消息的推送。
第1步:移动设备上的C2DM服务须要与Google官方的C2DM服务器交互,验证当前设备是否在C2DM服务器上注册了,若是已经注册,C2DM服务器会返回一个注册ID给客户端的C2DM服务。(①和②)
第2步:客户端的C2DM服务会与本身的推送服务器交互,将帐号和C2DM服务器返回的注册ID传给推送服务器。(③)
第3步:若是要推送消息,推送服务器会将注册ID和要推送的消息先发送到C2DM服务器,而后C2DM服务器会直接将消息推送给客户端(手机、平板电脑的设备)(④和⑤)。
读者能够对照图4来理解这3个步骤。

图4
除了使用官方的推送方案外,如今国内涌现出多个第三方的推送方案,例如,极光推送(JPush)、百度推送等。读者也能够用一下,这些同时一般是免费的(可能推送多媒体数据须要收费)。