推送并不是什么新技术,这种技术在互联网时代就已经很流行了。只是随着进入移动互联网时代,推送技术显得更加重要。因为在智能手机中,推送从某种程度上,可以取代使用多年的短信,而且与短信相比,还可以向用户展示更多的信息(如图像、表格、声音等)。

推送技术的实现通常会使用服务端向客户端推送消息的方式。也就是说客户端通过用户名、Key等ID注册到服务端后,在服务端就可以将消息向所有活动的客户端发送。

实际上,在很多移动操作系统中,官方都为其提供了推送方案,例如,Google的云推送、IOS、Windows Phone7/8也都提供了类似的推送方案。不过这些推送方案的服务器都在国外,有一些推送服务(如Google的云推送)在国内由于某些原因不太稳定,所以国内近几年涌现出了很多专门为国人打造的推送服务。

本文将从各种流行移动操作系统入手介绍推送技术的各种实现方式。当然,我们的主要目的是讨论Android的推送技术。

一、iOS的推送技术

Apple为IOS提供了很完美的推送方案,其基本原理是Apple提供了自己的推送服务器,叫APNS(Apple Push Notification Service,苹果推送通知服务器)。而客户端设备(IPhone、IPad等)直接与APNS建立长连接。不过向客户端设备发送的消息并不是由APNS产生的,而是在需要发送消息的用户自己提供的服务器(称为Provider)中产生的,然后Provider将消息传送给APNS,最后由APNS将消息传送给客户端设备。也就是说,消息最开始由Provider产生,然后Provider将消息传送给APNS,最后再由APNS传送给客户端设备。消息传递的过程如图1所示。

图1

在发送消息到客户端设备接收到消息的过程中,始终伴随这一个令牌的传送(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的描述就会对这一过程更加了解了。每一个流程描述前面的数字表示发送的时间先后顺序。

图2

二、Windows Phone的推送技术

微软为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

三、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)、百度推送等。读者也可以用一下,这些同时通常是免费的(可能推送多媒体数据需要收费)。

 
 

Android、iOS和Windows Phone中的推送技术的更多相关文章

  1. PHP ServerPush (推送) 技术的探讨

    2016年11月29日17:51:03 转自:http://www.cnblogs.com/hnrainll/archive/2013/05/07/3064874.html 需求: 我想做个会员站内通 ...

  2. PHP ServerPush (推送) 技术

    用来代替ajax的请求 转自:http://blog.163.com/bailin_li/blog/static/17449017920124811524364/ 需求: 我想做个会员站内通知的功能. ...

  3. 基于comet服务器推送技术(web实时聊天)

    http://www.cnblogs.com/zengqinglei/archive/2013/03/31/2991189.html Comet 也称反向 Ajax 或服务器端推技术.其思想很简单:将 ...

  4. PHP ServerPush (推送) 技术的探讨[整理]

    需求: 我想做个会员站内通知的功能.不想用以前的ajax查询,听说有个推技术.以下文章介绍的不错,来自转载, ============================================= ...

  5. cocos2d-x中本地推送消息

    作者:HU 转载请注明,原文链接:http://www.cnblogs.com/xioapingguo/p/4038277.html  IOS下很简单: 添加一条推送 void PushNotific ...

  6. Expo大作战(十四)--expo中消息推送的实现

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  7. HTML5中的SSE(服务器推送技术)

    本文原链接:https://cloud.tencent.com/developer/article/1194063 SSE技术详解:一种全新的HTML5服务器推送事件技术 前言 概述 基本介绍 与We ...

  8. 李洪强iOS经典面试题154- 通知与推送

    李洪强iOS经典面试题154- 通知与推送   通知与推送 本地通知和远程推送通知对基本概念和用法? image 本地通知和远程推送通知都可以向不在前台运行的应用发送消息,这种消息既可能是即将发生的事 ...

  9. Android推送技术研究

    前言 最近研究Android推送的实现, 研究了两天一夜, 有了一点收获, 写下来既为了分享, 也为了吐槽. 需要说明的是有些东西偏底层硬件和通信行业, 我对这些一窍不通, 只能说说自己的理解. 为什 ...

随机推荐

  1. openCV_java 图像二值化

    较为常用的图像二值化方法有:1)全局固定阈值:2)局部自适应阈值:3)OTSU等. 局部自适应阈值则是根据像素的邻域块的像素值分布来确定该像素位置上的二值化阈值.这样做的好处在于每个像素位置处的二值化 ...

  2. java产生随机数的几种方式

    java产生随机数的几种方式 一.在j2se里我们可以使用Math.random()方法来产生一个随机数,这个产生的随机数是0-1之间的一个double,我们可以把他乘以一定的数,比如说乘以100,他 ...

  3. fresco Bitmap too large to be uploaded into a texture

    fresco加载图片方法 布局文件引入 xmlns:fresco="http://schemas.android.com/apk/res-auto" <com.faceboo ...

  4. Swift中的Void类型与空元祖表达式

    可能有不少Swift开发者会忽略这么一个细节:在Swift中,Void类型其实是一个别名类型,而其真正的类型为(),即一个空元祖(empty tuple)! 这种语言特性给Swift带来了一些比较方便 ...

  5. Django 源码小剖: 应用程序入口 WSGIHandler

    WSGI 有三个部分, 分别为服务器(server), 应用程序(application) 和中间件(middleware). 已经知道, 服务器方面会调用应用程序来处理请求, 在应用程序中有真正的处 ...

  6. android Animation 动画绘制逻辑

    参考:http://www.jianshu.com/p/3683a69c38ea 1.View.draw(Canvas) 其中步骤为:/* * Draw traversal performs seve ...

  7. 《objective-c基础教程》学习笔记(十一)—— 类别

    在编写面向对象程序的时候,我们经常想为现有的类添加一些新的行为.有些时候,我们可以创建这个类的子类.但是,如果我们用到工具集或者类库的时候,无法处理新建的子类.这时,Objective-C就给我们提供 ...

  8. Kafka - SQL 引擎分享

    1.概述 大多数情况下,我们使用 Kafka 只是作为消息处理.在有些情况下,我们需要多次读取 Kafka 集群中的数据.当然,我们可以通过调用 Kafka 的 API 来完成,但是针对不同的业务需求 ...

  9. ubuntu-16.10-desktop-amd64.iso 版本 安装 oracle 11gR2 11.2.0.1 database

    特点: 需要重新安装:libaio1_0.3.109-2ubuntu?_amd64.deb.默认的libaio库有问题,和其默认libaio的编译方式有关! 需要重新安装gcc 4.x,默认的gcc ...

  10. 增大VM下linux的根目录空间

    增大VM下linux的根目录空间   用的太久,发现VM下的系统空间不足.简单的方法是,分一个新硬盘,挂载到根目录下.    下面是直接增大根目录下空间:  1. 增大vm下的磁盘大小, VM -&g ...