馬慶
【摘 要】隨著移送互聯(lián)網(wǎng)的快速發(fā)展,移動智能終端發(fā)生來巨大的變革,徹底改變了過彈出一個窗口通知用戶有事情發(fā)生,通知的內(nèi)容可以是未接電話的提示,可以是日歷的提醒,或者是接收到的彩信。推送功能是最早在Email中被采用的,用來提示用戶有新的信息。當今移動互聯(lián)網(wǎng)時代的智能終端對于推送功能更加地普及,已經(jīng)不再只是僅僅用在推送郵件了,而更多地用在移動終端的APP中了。本文將圍繞 Hybrid App 的 websocket 消息推送進行一系列的探索。
【關(guān)鍵詞】WebSocket;消息推送;混合應(yīng)用
中圖分類號: TP311.52 文獻標識碼: A 文章編號: 2095-2457(2017)17-0023-002
Research on Message Push of Hybrid Mobile Application Based on WebSocket Model
MA Qing
(Hunan Software Vocational College,Xiangtan Hunan 411100,China)
【摘 要】With the rapid development of the transfer of the Internet,mobile smart terminal to a huge change, completely changed the pop-up window to inform the user something happened,the contents of the notice can be missed calls,can be reminders of the calendar, or receive To the MMS.Push function is the first in the Email was used to prompt the user to have new information. Today's mobile Internet era of intelligent terminals for the push function is more popular,is no longer just used to push mail,and more used in the mobile terminal APP.This article will be around the Hybrid app websocket message push a series of exploration.
【關(guān)鍵詞】WebSocket;Message push;Hybrid application
0 引言
目前主流的移動操作系統(tǒng)(Android、iOS)的 webview 都已經(jīng)支持websocket,所以對于混合移動應(yīng)用,webscoket也將成為消息推送的選擇?;旌蠎?yīng)用一般使用 Cordova之類的中間件,以WebView作為用戶界面層,以 Javascript作為基本邏輯,以及和中間件通訊,再由中間件訪問底層 API 的方式,進行應(yīng)用開發(fā)。
1 移動應(yīng)用消息推送一般模式
1.1 使用GCM(Google Cloude Messaging)
Android自帶的推送GCM可以向Android應(yīng)用程序發(fā)送數(shù)據(jù)。它是一個輕量級的消息,告訴Android應(yīng)用程序有新的數(shù)據(jù)要從服務(wù)器獲取,或者它可能是一個消息,其中包含了4KB的payload data(像即時通訊這類應(yīng)用程序可以直接使用該payload消息)。GCM服務(wù)處理排隊的消息,并把消息傳遞到目標設(shè)備上運行的Android應(yīng)用程序。
優(yōu)點:Google提供的服務(wù)、原生、簡單,無需實現(xiàn)和部署服務(wù)端。
缺點:1)要求Android 2.2以上,對于不少2.2以前的系統(tǒng)沒法推送;
2)國內(nèi)服務(wù)不穩(wěn)定。而且不少國內(nèi)的終端廠商紛紛把Google的服務(wù)去掉,替換上自己的。
3)需要用戶綁定Google賬號,但不少國內(nèi)用戶沒有Google賬號。
1.2 使用XMPP協(xié)議
XMPP是一種基于XML的協(xié)議,它繼承了在XML環(huán)境中靈活的發(fā)展性,有很強的可擴展性。包括上面講的GCM服務(wù)器底層也是采用XMPP協(xié)議封裝的。
優(yōu)點:協(xié)議成熟、強大、可擴展性強、目前主要應(yīng)用于許多聊天系統(tǒng)中,且已有開源的Java版的開發(fā)實例androidpn。
缺點:協(xié)議較復(fù)雜、冗余(基于XML)、費流量、費電,部署硬件成本高。
Androidpn(Android Push Notification)就是基于XMPP開源組件的一套整合方案,服務(wù)端基于Openfire、客戶端基于Smack。
1)Androidpn服務(wù)端重啟后客戶端不會重連,這個非常悲劇。
2)由于服務(wù)器不保存消息,造成了如果客戶端當前離線就收不到消息。
3)Androidpn發(fā)送完消息就不管了,所以沒有消息回執(zhí)報表之類,造成沒法做應(yīng)用后續(xù)的數(shù)據(jù)分析用戶體驗的改善,這對于企業(yè)級的應(yīng)用是個致命傷。
XMPP協(xié)議比較費電費流量,這個對當前智能機的消耗太大,在窄帶網(wǎng)絡(luò)和不穩(wěn)定的(手機)網(wǎng)絡(luò)都不是最優(yōu)的選擇。但總體來說,XMPP協(xié)議還是比較成熟的。
1.3 使用MQTT協(xié)議
輕量級的、基于代理的“發(fā)布/訂閱”模式的消息傳輸協(xié)議。
優(yōu)點:協(xié)議簡潔、小巧、可擴展性強、省流量、省電,目前已經(jīng)應(yīng)用到企業(yè)領(lǐng)域
缺點:不夠成熟、實現(xiàn)較復(fù)雜、服務(wù)端組件rsmb不開源,部署硬件成本較高。endprint
1.4 HTTP輪循方式
定時向HTTP服務(wù)端接口(Web Service API)獲取最新消息。
優(yōu)點:實現(xiàn)簡單、可控性強,部署硬件成本低。
缺點:實時性差。
2 Websocket 接口簡介
WebSocket 的實現(xiàn)分為客戶端和服務(wù)端兩部分,客戶端(通常為瀏覽器)發(fā)出 WebSocket 連接請求,服務(wù)端響應(yīng),實現(xiàn)類似 TCP 握手的動作,從而在瀏覽器客戶端和 WebSocket 服務(wù)端之間形成一條 HTTP 長連接快速通道。兩者之間后續(xù)進行直接的數(shù)據(jù)互相傳送,不再需要發(fā)起連接和響應(yīng)。同時兩者都可以關(guān)閉這個長連接。我們正是利用了混合移動應(yīng)用的 webview 可以支持 websocket 的這個特性來實現(xiàn)服務(wù)器端對客戶端的一個消息推送。Websocket 針對客戶端而言,性能,資源使用以及及時性要比傳統(tǒng)的輪詢更好。
3 混合移動解決方案
3.1 瀏覽器發(fā)出握手請求
首先瀏覽器以標準的HTTP Get方式向服務(wù)器發(fā)出握手請求,在請求的頭信息中加入了Websocket協(xié)議所需要的一些信息。示例如下:
GET /WSHandler.ashx HTTP/1.1
Connection:Upgrade
Host:localhost:1550
Origin:http://localhost:1550
Sec-WebSocket-Key:A3IIMlEc9ARZWlO9ShrePw==
Sec-WebSocket-Version:13
Upgrade:websocket
然后服務(wù)器響應(yīng)握手請求服務(wù)器在獲得這些頭信息后,經(jīng)過處理,以HTTP方式進行回復(fù),回復(fù)時也在頭信息的部分加入了Websocket協(xié)議所需要的信息。示例如下:
HTTP/1.1 101 Switching Protocols
Upgrade: Websocket
Sec-WebSocket-Accept lJYdhpEDwO4BMgu0meIY94nJIYs=
Connection: Upgrade
經(jīng)過這樣的一個握手過程之后,瀏覽器與服務(wù)器之間就建立起了一條TCP通道。
數(shù)據(jù)幀在Websocket協(xié)議中,數(shù)據(jù)使用一系列的幀來傳輸。Websocket協(xié)議有著諸多的優(yōu)點:(1)支持SSL,安全性高;(2)整體性能高,無論是服務(wù)器的負載還是網(wǎng)絡(luò)帶寬的成本都大大降低;(3)默認采用80或443端口進行數(shù)據(jù)傳輸,一般不會被封堵;(4)可以支持跨域連接;(5)在W3C中定義了Javascript API,客戶端編程更加方便。
混合應(yīng)用一般使用 Cordova 之類的中間件,以 WebView 作為用戶界面層,以 Javascript 作為基本邏輯,以及和中間件通訊,再由中間件訪問底層 API 的方式,進行應(yīng)用開發(fā)。開發(fā)時可能不采用或者大部分不采用原生語言,但是卻有所有原生應(yīng)用的特性。而開發(fā)消息推送功能時,我們就既可以使用 Native App 的系統(tǒng)自帶推送如 GCM 和 APNS,又可以使用基于 html5 的 websocket 推送。對于混合應(yīng)用的 websocket 消息推送,其基本原理如下:
Hybrid app websocket由于開發(fā)周期短,跨平臺性好,維護成本低,一般可以用于混合應(yīng)用的消息推送。一旦推送服務(wù)器出現(xiàn)異常,我們的消息推送將變得非常被動。 但是 GCM 和 APNS 也是使用長連接進行消息推送,而且一個手機上的所有 app 共用一個長連接,對于手機性能將會有極大的幫助。
圖1 Hybrid app websocket 工作流程
4 總結(jié)
隨著手機性能的不斷改善,hybrid app 的性能幾乎接近原生app的體驗,最重要的是還可以跨平臺,所以hybrid app越來越受到開發(fā)者的青睞,尤其是前端開發(fā)者。他們既能利用熟悉的html5,css3,angular js作為主體開發(fā)語言,又能適時利用Cordova plugin調(diào)用底層的 API,這樣既節(jié)約了開發(fā)成本,又能體驗原生開發(fā)的樂趣。本文就利用Cordova跨移動平臺框架,開發(fā)了一組調(diào)用local notification的android plugin,前端代碼不需要改變,我們只需要編寫iOS端的local notification就可以適配一下ios平臺。利用這種方法,我們同樣可以擴展更多plugin。而websocket作為HTML5的新特性,它不像傳統(tǒng)的輪詢查詢服務(wù)端的方式而是主動push的方式向客戶端推送消息,websocket這種長連接的特性不僅適合消息推送,對于實時在線聊天功能也是非常適合。本文就結(jié)合了websocket和Cordova的特性開發(fā)了混合移動的消息推送。
【參考文獻】
[1]基于Web服務(wù)的勞動保障管理信息系統(tǒng)設(shè)計與實現(xiàn)[J].陳軍.科學(xué)大眾(科學(xué)教育),2012(08).
[2]張楓蕾.移動大互聯(lián)時代 APP營銷三重價值[J].廣告人,2012(02).
[3]基于Web Services的電子圖書一體化查詢平臺設(shè)計[J].杜治波.情報探索,2012(07).
[4]WebSocket在Web實時通信領(lǐng)域的研究[J].李代立,陳榕.電腦知識與技術(shù),2010(28).
[5]孫清國,朱瑋,劉華軍,張鵬.Web應(yīng)用中的服務(wù)器推送技術(shù)研究綜述[J].計算機系統(tǒng)應(yīng)用,2008(11).
[6]Approximate covering detection among content-based subscriptions using space filling curves[J].Zhenhui Shen,Srikanta Tirthapura.Journal of Parallel and Distributed Computing,2012 (12).
[7]Use of RSS feeds to push online content to users[J].Dan Ma.Decision Support Systems,2012(1).
[8]An MID-Based Load Balancing Approach for Topic-Based Pub-Sub Overlay Construction[J].Ruisheng Shi,F(xiàn)uqiang Liu,Yang Zhang,Bo Cheng,Junliang Chen. Tsinghua Science & Technology,2011(6).
[9]A dynamic and fast event matching algorithm for a content-based publish/subscribe information dissemination system in Sensor-Grid[J]. Mohammad Mehedi Hassan,Biao Song,Eui-Nam Huh. The Journal of Supercomputing,2010(3).
[10]An Efficient Publish-subscribe Protocol for Collaborative Content Delivery-Ex-PUSH.Mallick S,Kushwaha D S.2012 International Symposium on Cloud and Services Computing.2012.
[11]Towards Effectively Identifying RESTful Web Services. Zhao Y,Dong L,Lin R, et al. 2014 IEEE International Conference on Web Services, 2014.endprint