工信部将统一安卓推送标准
推送,目前几乎是APP的标配了。我们来看看推送这件事。
推送的实现方案
总结一下几种推送实现方式(历史解决方案),目前已经被废弃掉了,了解一下还是有必要的。
1.轮询
应用程序阶段性的与服务器进行连接并查询是否有新的消息到达,必须自己实现与服务器之间的通信,例如消息排队等。而且还要考虑轮询的频率,如果太慢可能导致某些消息的延迟,如果太快,则会大量消耗网络带宽和电池。
优点:实现简单
实现:用Timer和TimerTask定时器,以及HTTP相关的几个类就可以实现基本的功能,然后自己解析服务器返回信息。
2.SMS短信
在Android平台上,可以通过拦截SMS消息并且解析消息内容来了解服务器的意图。这是一个不错的想法,我就见过采用这个方案的应用程序。这个方案的好处是,可以实现实时操作。但是问题是这个方案的成本相对比较高,很难找到免费的短消息发送网关。
优点:实现简单,实时性也好。
缺点:SMS服务的成本问题。
3.TCP/IP持久的长连接
这个方案可以解决由轮询带来的性能问题,但是还是会消耗手机的电池。Apple的推送服务之所以工作的很好(使用APNs(Apple Push Notification service)进行推送),是因为每一台手机仅仅保持一个与服务器之间的连接,事实上C2DM也是这么工作的。不过这个方案也存在不足,就是我们很难在手机上实现一个可靠的服务。Android操作系统允许在低内存情况下杀死系统服务,所以通知服务很可能被操作系统Kill掉了。
优点:实时性好。
缺点:实现起来比较困难。比较费电。
总结:
Android操作系统允许在低内存情况下杀死系统服务,所以我们的推送通知服务很有可能就被操作系统Kill掉了。轮询方式和SMS方式这两个方案也存在明显的不足。至于持久连接方案也有不足,不过我们可以通过良好的设计来弥补,以便于让该方案可以有效的工作。毕竟,我们要知道GMail,GTalk ,GoogleVoice以及我们熟悉的微信,QQ都可以实现实时更新的。
具体实现长连接解决方案
C2DM,GCM
Google提供了C2DM(Cloudto Device Messaging)服务(基于XMPP),GCM(Google Cloud Messaging)作为 Google 官方的推送支持的
优点:谷歌提供的
缺点:C2DM需要依赖于Google官方提供的C2DM服务器,由于国内的网络环境,这两个个服务经常不可用,如果想要很好的使用,我们的app服务器必须也在国外。并且需要手机安装了Google Service ,条件比较苛刻。可能不是每个开发者或公司能实现的。
MQTT协议实现Android推送功能
采用MQTT协议实现Android推送功能也是一种解决方案。MQTT是一个轻量级的消息发布/订阅协议,它是实现基于手机客户端的消息推送服务器的理想解决方案。IBM提供的MQTT协议的实现。
客户端地址
https://github.com/tokudu/AndroidPushNotificationsDemo
服务器端地址
https://github.com/tokudu/PhpMQTTClient
wmqtt.jar
http://www-01.ibm.com/support/docview.wss?rs=171&uid=swg24006006
RSMB实现推送功能
Really Small Message Broker (RSMB) ,他是一个简单的MQTT代理,同样由IBM提供。
Xmpp(可扩展通讯和表示协议)
简介:XMPP(Extensible Messaging and Presence Protocol)
百度文库介绍:http://wenku.baidu.com/view/563b1ebff121dd36a32d8225.html
xmpp协议起源于著名的Linux即时通讯服务服务器 jabber, 有时候我们会把xmpp协议也叫jabber协议,其实这是不规范的,xmpp是个协议,而jabber是个服务器,因为jabber开源,设计精良,安全,稳定,跨语言,跨平台,封装开发简便,越来越多人开始使用它,并且逐步完善,不久它便形成了一个强大的标准化体系,Google GTalk、Pidgin、PSI、Spark、Pandion、MSN、Yahoo、ICQ、QQ、WhatsApp Wechat..诸如此类一些软件在这个强大的标准体系下实现了互联。
那么XMPP到底是什么意思,用通俗的话讲它和基于xml格式的一些协议原理差不多,只不过是个针对服务器的软件协议罢了。
XMPP(可扩展通讯和表示协议)是基于可扩展标记语言(XML)的协议,它用于即时消息(IM)以及在线探测。这个协议可能最终允许因特网用户向因特网上的其他任何人发送即时消息。
XMPP(Extensible Messaging and Presence Protocol),简单的来讲,它就是一个发送接收处理消息的协议,但是这个协议发送的消息,既不是二进制的东东也不是字符串,而是XML。正是因为使用了XML作为消息传递的中介,XMPP目前被IETF国际标准组织完成了标准化工作。
其中Gtalk 就是基于XMPP 协议的一个实现,其他的则不是。当前IM几乎作为每个上网者必然使用的工具,在国外的大型企业中有一些企业级的IM应用,但是其商业价值还没完全发挥出来。
设想既然XMPP协议是一个公开的协议,那么每个企业都可以利用它来开发适合本身企业工作,提高自身生产效率的IM;甚至,你还可以在网络游戏中集成这种通信软件,不但让你可以边游戏边聊天,也可以开发出适合游戏本身的IM应用,比如说一些游戏关键场景提醒功能,团队语音交流等等都可以基于IM来实现。
基于XMPP的几个案例
Openfire - Java XMPP服务器
Openfire是开源的实时协作服务器(RTC),它是基于公开协议XMPP(也成为Jabber)消息的。Openfire的核心功能可以概括为:连接管理、消息解析、消息路由、消息发送
Openfire(服务器端)
Openfire是一个即时通讯服务器,也称之为即时通讯平台。它是基于XMPP协议的,大家所熟悉的通讯软件QQ、MSN和Gtalk等等,其中Gtalk就是基于XMPP协议的实现。
下载地址:
http://www.igniterealtime.org/downloads/index.jsp
注意: 使用Openfire需要配置机器的域名。如果局域网内没有安装域服务器,则需要手工为机器配置域名,Windows平台打开C:\WINDOWS\system32\drivers\etc\hosts文件,增加一新行:127.0.0.1 www.rair.com (根据自己的需要可配置称别的名字,但最好符合带.的域名格式)
Spark(客户端) XMPP,自带有Android组件的处理
Spark从本质上来说就是一个运行在PC上的java程序,你可以看成是官方为我们实现好的运行在PC上的客户端,我们只需要下载使用即可
下载地址:
http://www.igniterealtime.org/downloads/index.jsp
ASmack( jar )
一套封装好了的用于实现XMPP协议传输的API,它是一个非常简单并且功能强大的类库,给用户发送消息只需要三行代码
下载地址:
http://www.igniterealtime.org/downloads/index.jsp
http://code.google.com/p/asmack/downloads/list (需科学上网)
常用API
XMPPConnection(xmpp连接核心类)
ConnectionConfiguration(连接配置类)
AccountManager(注册用户管理类)
XmppConnectionListener(连接监听类)
ChatManagerListener(聊天事监听事件)
MultiUserChat(多用户聊天)
MessageListener(消息监听事件)
androidpn
(Android Push Notification)是一个基于XMPP协议的java开源Android push notification实现。它包含了完整的客户端和服务器端。
服务器端实现原理
connection收到packet,使用tsc.push.server.xmpp.codec解码。router根据packet的namespace等信息,将packet路由到相应的handler,handler进行处理PersistentConnectionListener,PhoneStateChangeListener,ReconnectionThread。java三个类则负责监听手机的状态并进行断线重连
客服端实现原理
NotificationIQ,NotificationIQProvider,NotificationPacketListener三个类负责对收到的Notification格式的消息进行解析和处理。XmppManager是主控制器,NotificationService通过这个类,在后台维护androidpn连接。
开发者
作为我们开发者,我们主要还是用到第三方平台。
推送:
极光推送(部分免费)
友盟推送(免费)
百度推聊(免费)
个推推送(部分免费) - 新浪微博
即时通讯:
环信即时通讯
融云即时通讯
极光推送
第三方平台的配置和使用参照官方文档就妥妥的了。
n(≧▽≦)n
由泰尔实验室牵头的安卓统一推送研讨会正在进行中,我们一起关注安卓推送生态的变化吧。