现在的位置: 首页 > 综合 > 正文

Android推送实现方案探讨

2012年09月28日 ⁄ 综合 ⁄ 共 2659字 ⁄ 字号 评论关闭

背景介绍

随着苹果产品的风靡,推送技术在国内也越来越热门。推送最开始用于邮件系统。随着iPhone 和 Android 手机的风靡,逐渐在手机上也越来越常见。不少手机客户端也时常推送一些消息。

 

推送技术的应用

推送技术在手机上的应用主要有两块:广告推送、SNS信息推送。

Ø 广告推送:给目前有一定安装量但没有盈利模式的手机应用开发者带来了一定希望,但要注意推送的频度和内容选中,不然会因为推送的东西用户不感兴趣造成打扰。

Ø SNS信息推送:主要用于QQ空间、人人网、微博和天涯论坛等web2.0社区网站推送好友的留言等,可以用来提升用户黏性。

 

客户端/服务器通信的两种方式

服务端和客户端推送有两种方式,分别是Pull 和 Push

Ø Pull :由客户端定时访问服务器,询问是否有新信息。而Push则在手机客户端和服务器之间建立持久连接通道,服务端一有消息就通过通道发给手机。

Ø Push:相比PullPush推送的消息是实时的,而且更节省手机的电量和流量,不需要定时访问服务器。Pull轮询方式一般信息会有110分钟不等的延时,且耗电量也比Push方式消耗得多。

 

Android/iOS推送比较

相比AndroidiOS的推送服务要稳定,因为Android操作系统用户可以自己杀死服务,这样就造成了手机接收不到通知消息。苹果APNsApple Push Notification Service)的流程如下:

1、应用程序注册消息推送。

2iOS从苹果推送服务器(APNs)获取device token(设备令牌,用于标识设备),应用程序接收device token

3、应用程序将device token发送给第三方Push服务端程序。

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

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

 

推送解决方案

目前Android上主要的推送实现方案有以下几种:

方案一、Google Cloud Messageing

GoogleAndroid上标配了自己的推送GCMGoogle Cloud Messageing),可以帮助开发人员给他们的Android应用程序发送数据。它是一个轻量级的消息,告诉Android应用程序有新的数据要获取从服务器,或者它可能是一个消息,其中包含了4KBpayload data(像即时通讯这类应用程序可以直接使用该payload消息)。GCM服务处理排队的消息,并把消息传递到目标设备上运行的Android应用程序。

GCM的推送消息的流程如下图:


 

GCM服务的步骤Google已经在http://developer.android.com/guide/google/gcm/gs.html给出了,只要参照着做就行了,我就不再赘述了。

GCM使用比较简单,而且Google的服务器来处理负载均衡、消息队列处理。但有下面三个缺陷也导致了GCM在国内基本不可用:

1)GCM要求Android系统必须是2.2以上的版本,所以对于不少2.2以前的系统没法推送

2)国内服务不稳定。而且不少国内的终端厂商纷纷把Google的服务去掉,替换上自己的。

3)需要用户绑定Google账号,但不少国内用户没有Google账号。

 

方案二、采用XMPP协议

XMPP是一种基于XML的协议,它继承了在XML环境中灵活的发展性,有很强的可扩展性。包括上面讲的GCM服务器底层也是采用XMPP协议封装的。

XMPP协议有如下优点:

1、 分布式:任何人都可以运行自己的XMPP服务器,它没有主服务器

2、 安全性高:使用TLS等技术

3、 跨平台

4、分布式

而androidpn(Android Push Notification)就是基于 XMPP 开源组件的一套整合方案,服务端基于Openfire、客户端基于SmackAndroidPN项目主页( http://sourceforge.net/projects/androidpn/ ) 下载2个文件: androidpn-server-0.5.0-bin.zip 和 androidpn-client-0.5.0.zip  分别是服务器和客户端的代码。详细的实现方式网上有不少文章。

androidpn是韩国人放在sourceforge.net 的项目,已经有两年多没有更新了,项目应该是个人维护的,不是很成熟。有意思的是,网站上这个项目有82%的下载者的ip是中国的。androidpn有如下一些不足,开发的时候需要权衡:

1、androidpn服务端重启后客户端不会重连,这个非常悲剧

2、由于服务器不保存消息,造成了如果客户端当前离线就收不到消息。

3、androidpn发送完消息就不管了,所以没有消息回执报表之类,造成没法做应用后续的数据分析用户体验的改善,这对于企业级的应用是个致命伤。

XMPP协议比较费电费流量,这个对当前智能机的消耗太大,在窄带网络和不稳定的(手机)网络都不是最优的选择。但总体来说,XMPP协议还是比较成熟的。

 

方案三、采用MQTT协议

MQTT是个轻量级的、基于代理的发布/订阅模式的消息传输协议。示例代码可以从https://github.com/tokudu/AndroidPushNotificationsDemo下载。MQTT架构如下:

 

wmqtt.jar IBM提供的MQTT协议的实现。你可以从如下站点下载它。你可以将该jar包加入你自己的Android应用程序中。

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

MQTT协议也有自己的缺点:

协议复杂,部署成本比较高,还不够成熟。

 

方案四、采用第三方服务

目前有不少第三方提供了类似服务,客户端只需要嵌入第三方提供的lib库,由第三方建立长连接,负责消息的接收/发送。同时对于消息都有比较详细的报表数据,可以用于做数据分析挖掘和用户体验的改善。目前比较成熟的有:parsepubnub、蝴蝶、个推等。国外的parsepubnub做的很不错,基本版也是免费的,但是国外的服务在国内经常访问不了。国内的靠谱的不多,蝴蝶做的比较早,以前和机锋网合作过推送,但现在不做了。个推的接入比较简单,新浪微博android上的推送也是他们做的,但和parse比起来用户体验上还有待提升。

抱歉!评论已关闭.