工信部將統(tǒng)一安卓推送標(biāo)準(zhǔn)
推送疯溺,目前幾乎是APP的標(biāo)配了。我們來看看推送這件事派近。
推送的實(shí)現(xiàn)方案
總結(jié)一下幾種推送實(shí)現(xiàn)方式(歷史解決方案),目前已經(jīng)被廢棄掉了,了解一下還是有必要的钾虐。
1.輪詢
應(yīng)用程序階段性的與服務(wù)器進(jìn)行連接并查詢是否有新的消息到達(dá),必須自己實(shí)現(xiàn)與服務(wù)器之間的通信梗搅,例如消息排隊(duì)等禾唁。而且還要考慮輪詢的頻率,如果太慢可能導(dǎo)致某些消息的延遲无切,如果太快荡短,則會(huì)大量消耗網(wǎng)絡(luò)帶寬和電池。
優(yōu)點(diǎn):實(shí)現(xiàn)簡單
實(shí)現(xiàn):用Timer和TimerTask定時(shí)器哆键,以及HTTP相關(guān)的幾個(gè)類就可以實(shí)現(xiàn)基本的功能掘托,然后自己解析服務(wù)器返回信息。
2.SMS短信
在Android平臺上籍嘹,可以通過攔截SMS消息并且解析消息內(nèi)容來了解服務(wù)器的意圖闪盔。這是一個(gè)不錯(cuò)的想法,我就見過采用這個(gè)方案的應(yīng)用程序辱士。這個(gè)方案的好處是泪掀,可以實(shí)現(xiàn)實(shí)時(shí)操作。但是問題是這個(gè)方案的成本相對比較高颂碘,很難找到免費(fèi)的短消息發(fā)送網(wǎng)關(guān)异赫。
優(yōu)點(diǎn):實(shí)現(xiàn)簡單,實(shí)時(shí)性也好头岔。
缺點(diǎn):SMS服務(wù)的成本問題塔拳。
3.TCP/IP持久的長連接
這個(gè)方案可以解決由輪詢帶來的性能問題,但是還是會(huì)消耗手機(jī)的電池峡竣。Apple的推送服務(wù)之所以工作的很好(使用APNs(Apple Push Notification service)進(jìn)行推送)靠抑,是因?yàn)槊恳慌_手機(jī)僅僅保持一個(gè)與服務(wù)器之間的連接,事實(shí)上C2DM也是這么工作的适掰。不過這個(gè)方案也存在不足颂碧,就是我們很難在手機(jī)上實(shí)現(xiàn)一個(gè)可靠的服務(wù)荠列。Android操作系統(tǒng)允許在低內(nèi)存情況下殺死系統(tǒng)服務(wù),所以通知服務(wù)很可能被操作系統(tǒng)Kill掉了稚伍。
優(yōu)點(diǎn):實(shí)時(shí)性好弯予。
缺點(diǎn):實(shí)現(xiàn)起來比較困難。比較費(fèi)電个曙。
總結(jié):
Android操作系統(tǒng)允許在低內(nèi)存情況下殺死系統(tǒng)服務(wù)锈嫩,所以我們的推送通知服務(wù)很有可能就被操作系統(tǒng)Kill掉了。輪詢方式和SMS方式這兩個(gè)方案也存在明顯的不足垦搬。至于持久連接方案也有不足呼寸,不過我們可以通過良好的設(shè)計(jì)來彌補(bǔ),以便于讓該方案可以有效的工作猴贰。畢竟对雪,我們要知道GMail,GTalk 米绕,GoogleVoice以及我們熟悉的微信瑟捣,QQ都可以實(shí)現(xiàn)實(shí)時(shí)更新的。
具體實(shí)現(xiàn)長連接解決方案
C2DM,GCM
Google提供了C2DM(Cloudto Device Messaging)服務(wù)(基于XMPP)栅干,GCM(Google Cloud Messaging)作為 Google 官方的推送支持的
優(yōu)點(diǎn):谷歌提供的
缺點(diǎn):C2DM需要依賴于Google官方提供的C2DM服務(wù)器迈套,由于國內(nèi)的網(wǎng)絡(luò)環(huán)境,這兩個(gè)個(gè)服務(wù)經(jīng)常不可用碱鳞,如果想要很好的使用桑李,我們的app服務(wù)器必須也在國外。并且需要手機(jī)安裝了Google Service 窿给,條件比較苛刻贵白。可能不是每個(gè)開發(fā)者或公司能實(shí)現(xiàn)的崩泡。
MQTT協(xié)議實(shí)現(xiàn)Android推送功能
采用MQTT協(xié)議實(shí)現(xiàn)Android推送功能也是一種解決方案禁荒。MQTT是一個(gè)輕量級的消息發(fā)布/訂閱協(xié)議,它是實(shí)現(xiàn)基于手機(jī)客戶端的消息推送服務(wù)器的理想解決方案角撞。IBM提供的MQTT協(xié)議的實(shí)現(xiàn)圈浇。
客戶端地址
https://github.com/tokudu/AndroidPushNotificationsDemo
服務(wù)器端地址
https://github.com/tokudu/PhpMQTTClient
wmqtt.jar
http://www-01.ibm.com/support/docview.wss?rs=171&uid=swg24006006
RSMB實(shí)現(xiàn)推送功能
Really Small Message Broker (RSMB) ,他是一個(gè)簡單的MQTT代理靴寂,同樣由IBM提供。
Xmpp(可擴(kuò)展通訊和表示協(xié)議)
簡介:XMPP(Extensible Messaging and Presence Protocol)
百度文庫介紹:http://wenku.baidu.com/view/563b1ebff121dd36a32d8225.html
xmpp協(xié)議起源于著名的Linux即時(shí)通訊服務(wù)服務(wù)器 jabber, 有時(shí)候我們會(huì)把xmpp協(xié)議也叫jabber協(xié)議召耘,其實(shí)這是不規(guī)范的百炬,xmpp是個(gè)協(xié)議,而jabber是個(gè)服務(wù)器污它,因?yàn)閖abber開源剖踊,設(shè)計(jì)精良庶弃,安全,穩(wěn)定德澈,跨語言歇攻,跨平臺,封裝開發(fā)簡便梆造,越來越多人開始使用它缴守,并且逐步完善,不久它便形成了一個(gè)強(qiáng)大的標(biāo)準(zhǔn)化體系镇辉,Google GTalk屡穗、Pidgin、PSI忽肛、Spark村砂、Pandion、MSN屹逛、Yahoo础废、ICQ、QQ罕模、WhatsApp Wechat..諸如此類一些軟件在這個(gè)強(qiáng)大的標(biāo)準(zhǔn)體系下實(shí)現(xiàn)了互聯(lián)评腺。
那么XMPP到底是什么意思,用通俗的話講它和基于xml格式的一些協(xié)議原理差不多手销,只不過是個(gè)針對服務(wù)器的軟件協(xié)議罷了歇僧。
XMPP(可擴(kuò)展通訊和表示協(xié)議)是基于可擴(kuò)展標(biāo)記語言(XML)的協(xié)議,它用于即時(shí)消息(IM)以及在線探測锋拖。這個(gè)協(xié)議可能最終允許因特網(wǎng)用戶向因特網(wǎng)上的其他任何人發(fā)送即時(shí)消息诈悍。
XMPP(Extensible Messaging and Presence Protocol),簡單的來講兽埃,它就是一個(gè)發(fā)送接收處理消息的協(xié)議侥钳,但是這個(gè)協(xié)議發(fā)送的消息,既不是二進(jìn)制的東東也不是字符串柄错,而是XML舷夺。正是因?yàn)槭褂昧薠ML作為消息傳遞的中介,XMPP目前被IETF國際標(biāo)準(zhǔn)組織完成了標(biāo)準(zhǔn)化工作售貌。
其中Gtalk 就是基于XMPP 協(xié)議的一個(gè)實(shí)現(xiàn)给猾,其他的則不是。當(dāng)前IM幾乎作為每個(gè)上網(wǎng)者必然使用的工具颂跨,在國外的大型企業(yè)中有一些企業(yè)級的IM應(yīng)用敢伸,但是其商業(yè)價(jià)值還沒完全發(fā)揮出來。
設(shè)想既然XMPP協(xié)議是一個(gè)公開的協(xié)議恒削,那么每個(gè)企業(yè)都可以利用它來開發(fā)適合本身企業(yè)工作池颈,提高自身生產(chǎn)效率的IM尾序;甚至,你還可以在網(wǎng)絡(luò)游戲中集成這種通信軟件躯砰,不但讓你可以邊游戲邊聊天每币,也可以開發(fā)出適合游戲本身的IM應(yīng)用,比如說一些游戲關(guān)鍵場景提醒功能琢歇,團(tuán)隊(duì)語音交流等等都可以基于IM來實(shí)現(xiàn)兰怠。
基于XMPP的幾個(gè)案例
Openfire - Java XMPP服務(wù)器
Openfire是開源的實(shí)時(shí)協(xié)作服務(wù)器(RTC),它是基于公開協(xié)議XMPP(也成為Jabber)消息的。Openfire的核心功能可以概括為:連接管理矿微、消息解析痕慢、消息路由、消息發(fā)送
Openfire(服務(wù)器端)
Openfire是一個(gè)即時(shí)通訊服務(wù)器涌矢,也稱之為即時(shí)通訊平臺掖举。它是基于XMPP協(xié)議的,大家所熟悉的通訊軟件QQ娜庇、MSN和Gtalk等等塔次,其中Gtalk就是基于XMPP協(xié)議的實(shí)現(xiàn)。
下載地址:
http://www.igniterealtime.org/downloads/index.jsp
注意: 使用Openfire需要配置機(jī)器的域名名秀。如果局域網(wǎng)內(nèi)沒有安裝域服務(wù)器励负,則需要手工為機(jī)器配置域名,Windows平臺打開C:\WINDOWS\system32\drivers\etc\hosts文件匕得,增加一新行:127.0.0.1 www.rair.com (根據(jù)自己的需要可配置稱別的名字继榆,但最好符合帶.的域名格式)
Spark(客戶端) XMPP,自帶有Android組件的處理
Spark從本質(zhì)上來說就是一個(gè)運(yùn)行在PC上的java程序,你可以看成是官方為我們實(shí)現(xiàn)好的運(yùn)行在PC上的客戶端汁掠,我們只需要下載使用即可
下載地址:
http://www.igniterealtime.org/downloads/index.jsp
ASmack( jar )
一套封裝好了的用于實(shí)現(xiàn)XMPP協(xié)議傳輸?shù)腁PI略吨,它是一個(gè)非常簡單并且功能強(qiáng)大的類庫,給用戶發(fā)送消息只需要三行代碼
下載地址:
http://www.igniterealtime.org/downloads/index.jsp
http://code.google.com/p/asmack/downloads/list (需科學(xué)上網(wǎng))
常用API
XMPPConnection(xmpp連接核心類)
ConnectionConfiguration(連接配置類)
AccountManager(注冊用戶管理類)
XmppConnectionListener(連接監(jiān)聽類)
ChatManagerListener(聊天事監(jiān)聽事件)
MultiUserChat(多用戶聊天)
MessageListener(消息監(jiān)聽事件)
androidpn
(Android Push Notification)是一個(gè)基于XMPP協(xié)議的java開源Android push notification實(shí)現(xiàn)考阱。它包含了完整的客戶端和服務(wù)器端翠忠。
服務(wù)器端實(shí)現(xiàn)原理
connection收到packet,使用tsc.push.server.xmpp.codec解碼乞榨。router根據(jù)packet的namespace等信息秽之,將packet路由到相應(yīng)的handler,handler進(jìn)行處理PersistentConnectionListener吃既,PhoneStateChangeListener考榨,ReconnectionThread。java三個(gè)類則負(fù)責(zé)監(jiān)聽手機(jī)的狀態(tài)并進(jìn)行斷線重連
客服端實(shí)現(xiàn)原理
NotificationIQ,NotificationIQProvider,NotificationPacketListener三個(gè)類負(fù)責(zé)對收到的Notification格式的消息進(jìn)行解析和處理鹦倚。XmppManager是主控制器董虱,NotificationService通過這個(gè)類,在后臺維護(hù)androidpn連接。
開發(fā)者
作為我們開發(fā)者愤诱,我們主要還是用到第三方平臺。
推送:
極光推送(部分免費(fèi))
友盟推送(免費(fèi))
百度推聊(免費(fèi))
個(gè)推推送(部分免費(fèi)) - 新浪微博
即時(shí)通訊:
環(huán)信即時(shí)通訊
融云即時(shí)通訊
極光推送
第三方平臺的配置和使用參照官方文檔就妥妥的了捐友。
n(≧▽≦)n
由泰爾實(shí)驗(yàn)室牽頭的安卓統(tǒng)一推送研討會(huì)正在進(jìn)行中淫半,我們一起關(guān)注安卓推送生態(tài)的變化吧。