qileilove

          blog已經(jīng)轉(zhuǎn)移至github,大家請?jiān)L問 http://qaseven.github.io/

          Android、iOS和Windows Phone中的推送技術(shù)

            推送并不是什么新技術(shù),這種技術(shù)在互聯(lián)網(wǎng)時(shí)代就已經(jīng)很流行了。只是隨著進(jìn)入移動(dòng)互聯(lián)網(wǎng)時(shí)代,推送技術(shù)顯得更加重要。因?yàn)樵谥悄?a target="_self" style="word-break: break-all; color: #202859; line-height: normal !important;">手機(jī)中,推送從某種程度上,可以取代使用多年的短信,而且與短信相比,還可以向用戶展示更多的信息(如圖像、表格、聲音等)。
            推送技術(shù)的實(shí)現(xiàn)通常會(huì)使用服務(wù)端向客戶端推送消息的方式。也就是說客戶端通過用戶名、Key等ID注冊到服務(wù)端后,在服務(wù)端就可以將消息向所有活動(dòng)的客戶端發(fā)送。
            實(shí)際上,在很多移動(dòng)操作系統(tǒng)中,官方都為其提供了推送方案,例如,Google的云推送、IOS、Windows Phone7/8也都提供了類似的推送方案。不過這些推送方案的服務(wù)器都在國外,有一些推送服務(wù)(如Google的云推送)在國內(nèi)由于某些原因不太穩(wěn)定,所以國內(nèi)近幾年涌現(xiàn)出了很多專門為國人打造的推送服務(wù)。
            本文將從各種流行移動(dòng)操作系統(tǒng)入手介紹推送技術(shù)的各種實(shí)現(xiàn)方式。當(dāng)然,我們的主要目的是討論Android的推送技術(shù)。
            一、iOS的推送技術(shù)
            Apple為IOS提供了很完美的推送方案,其基本原理是Apple提供了自己的推送服務(wù)器,叫APNS(Apple Push Notification Service,蘋果推送通知服務(wù)器)。而客戶端設(shè)備(IPhone、IPad等)直接與APNS建立長連接。不過向客戶端設(shè)備發(fā)送的消息并不是由APNS產(chǎn)生的,而是在需要發(fā)送消息的用戶自己提供的服務(wù)器(稱為Provider)中產(chǎn)生的,然后Provider將消息傳送給APNS,最后由APNS將消息傳送給客戶端設(shè)備。也就是說,消息最開始由Provider產(chǎn)生,然后Provider將消息傳送給APNS,最后再由APNS傳送給客戶端設(shè)備。消息傳遞的過程如圖1所示。
            
            在發(fā)送消息到客戶端設(shè)備接收到消息的過程中,始終伴隨這一個(gè)令牌的傳送(device token)。要想使用APNS提供消息服務(wù),應(yīng)用程序需要先向IOS注冊需要提供的一個(gè)必要的信息就是與當(dāng)前設(shè)備有關(guān)的device token,IOS在接收到devicetoken后,會(huì)向APNS查詢這個(gè)device token是否在APNS上注冊了(所有的IOS設(shè)備在第一次使用時(shí)都需要向蘋果服務(wù)器注冊一個(gè)賬號,否則無法從AppleStore下載應(yīng)用,當(dāng)然更無法使用推送服務(wù)了),如果已經(jīng)注冊,APNS會(huì)直接向應(yīng)用程序返回這個(gè)devicetoken。應(yīng)用程序獲得這個(gè)devicetoken后,表示APNS已經(jīng)允許向自己推送消息了,接著還需要將該device token發(fā)送給推送服務(wù)器(Provider)。到這里應(yīng)用程序已經(jīng)成功將自己注冊到APNS中了。現(xiàn)在就可以通過Provider產(chǎn)生要推送的消息,然后Provider會(huì)將消息發(fā)送給APNS服務(wù)器,最后APNS服務(wù)器會(huì)直接向應(yīng)用程序發(fā)送消息。這個(gè)過程比較復(fù)雜,不過看一下圖2的描述就會(huì)對這一過程更加了解了。每一個(gè)流程描述前面的數(shù)字表示發(fā)送的時(shí)間先后順序。
            
            二、Windows Phone的推送技術(shù)
            微軟為Window Phone提供的推送方案與IOS類似,也需要自己準(zhǔn)備推送服務(wù)器(可以稱為Cloud Service)。只是表示設(shè)備的ID變成了Uri。在Window Phone中有一個(gè)Push Client Service(PCS)。所有需要推送服務(wù)的應(yīng)用程序都需要與Push Client Service通信。下面是Window Phone推送的基本步驟,讀者可以與圖3對照來看這一過程。
            第1步:應(yīng)用程序會(huì)向Push Client Service請求一個(gè)Push Notification URI(①)。
            第2步:如果當(dāng)前Window Phone設(shè)備已經(jīng)在微軟服務(wù)器注冊了,Push Client Service會(huì)從MPNS(Microsoft Push Notification Service ,微軟推送通知服務(wù))獲取Push Notification URI,并返回給應(yīng)用程序,表示推送服務(wù)可用(②和③)。
            第3步:應(yīng)用程序需要將Push Notification URI發(fā)送給自己的推送服務(wù)器(Cloud Service)(④)。
            第4步:如果需要推送消息,Cloud Service會(huì)將消息發(fā)送到MPNS,然后MPNS會(huì)將消息發(fā)送給Push Client Service,最后由Push Client Service將消息傳送給應(yīng)用程序(⑤、⑥和③)。
            
          三、Android的推送方案
            Android的推送方案就比較多了,也比較亂。例如,有Google官方提供的C2DM(Android Cloud to Device Messaging);第三方的推送服務(wù)(如極光推送);還有通過各種協(xié)議實(shí)現(xiàn)的推送服務(wù)端程序(如AndroidPN),用戶通過這些服務(wù)端程序可以搭建自己的推送服務(wù)器。這些推送技術(shù)會(huì)在本節(jié)后面的部分詳細(xì)介紹,本節(jié)先來介紹一下Android中經(jīng)常使用的各種推送技術(shù)。當(dāng)然,這些推送技術(shù)也能用于其它的移動(dòng)設(shè)備,但由于Android的官方推送服務(wù)(C2DM)在國內(nèi)使用上有一些問題,所以基于Android的第三方推送服務(wù)較其它系統(tǒng)多,因此這里主要針對Android來介紹。
            通常推送技術(shù)會(huì)使用如下兩種方式實(shí)現(xiàn)。
            1. 輪詢(Pull)方式
            2. 持久連接方式(服務(wù)端Push方式)
            輪詢方式就是客戶端以一定的時(shí)間間隔不斷查詢服務(wù)端是否有新的消息。這種方式必須自己實(shí)現(xiàn)與服務(wù)器之間的通信機(jī)制,例如消息隊(duì)列等。而且還要考慮輪詢的頻率,如果太慢可能導(dǎo)致某些消息的延遲,如果太快,則會(huì)大量消耗網(wǎng)絡(luò)帶寬和電池。所以大多數(shù)推送服務(wù)都不會(huì)使用輪詢方式。
            持久連接方式也就是Push方式,對于客戶端來說,是一種被動(dòng)的方式,而主動(dòng)權(quán)在服務(wù)端,當(dāng)有消息時(shí),服務(wù)端會(huì)向所有注冊到推送服務(wù)器的客戶端推送消息。這種推送方式的好處是可以保證實(shí)時(shí)性,而且客戶端實(shí)現(xiàn)簡單。當(dāng)然,也會(huì)有不足,例如,如果大量的客戶端與服務(wù)端保持長連接時(shí),會(huì)消耗服務(wù)器的資源。不過在未推送消息時(shí),這些長連接就成了空閑連接,通常這種連接主要消耗的是內(nèi)存資源。例如,200萬用戶可能會(huì)消耗數(shù)十GB的內(nèi)存。因此搭建這種推送機(jī)制時(shí)要使用性能好的服務(wù)器。
            持久連接的實(shí)現(xiàn)有很多方式,例如,可以使用XMPP作為通信協(xié)議。XMPP的主要優(yōu)勢是協(xié)議成熟、強(qiáng)大,可擴(kuò)展性強(qiáng)。XMPP更多地用于IM系統(tǒng)中,后面要介紹的AndroidPN也是用了XMPP協(xié)議。
            XMPP也有明顯的缺點(diǎn),例如,協(xié)議很復(fù)雜,如果吃透XMPP協(xié)議可能需要很長時(shí)間,還有就是由于XMPP是基于XML的,從而造成了數(shù)據(jù)冗余、這樣會(huì)造成移動(dòng)設(shè)備費(fèi)流量、耗電等弊病。
            除了XMPP,還可以使用MQTT協(xié)議,這種協(xié)議的主要優(yōu)勢是簡潔、小巧、可擴(kuò)展性強(qiáng),從而帶來了省流量、省電等優(yōu)點(diǎn),而且有C++版的服務(wù)端組件rsmb。缺點(diǎn)是協(xié)議不夠成熟,而且實(shí)現(xiàn)較復(fù)雜,而且rsmb不開源,部署硬件的成本較高。
            盡管C2DM服務(wù)在國內(nèi)可能不太穩(wěn)定或有一些地區(qū)不可用,但還是有必要介紹一下C2DM的原理。不過對于在國內(nèi)使用的應(yīng)用最好使用第三方的推送服務(wù),或自己假設(shè)推送服務(wù)器。
            C2DM和IOS的APNS以及Window Phone的MPNS大同小異。還需要自己準(zhǔn)備一臺推送服務(wù)器,并通過如下步驟實(shí)現(xiàn)消息的推送。
            第1步:移動(dòng)設(shè)備上的C2DM服務(wù)需要與Google官方的C2DM服務(wù)器交互,驗(yàn)證當(dāng)前設(shè)備是否在C2DM服務(wù)器上注冊了,如果已經(jīng)注冊,C2DM服務(wù)器會(huì)返回一個(gè)注冊ID給客戶端的C2DM服務(wù)。(①和②)
            第2步:客戶端的C2DM服務(wù)會(huì)與自己的推送服務(wù)器交互,將賬號和C2DM服務(wù)器返回的注冊ID傳給推送服務(wù)器。(③)
            第3步:如果要推送消息,推送服務(wù)器會(huì)將注冊ID和要推送的消息先發(fā)送到C2DM服務(wù)器,然后C2DM服務(wù)器會(huì)直接將消息推送給客戶端(手機(jī)、平板電腦的設(shè)備)(④和⑤)。
            讀者可以對照圖4來理解這3個(gè)步驟。
            
            除了使用官方的推送方案外,現(xiàn)在國內(nèi)涌現(xiàn)出多個(gè)第三方的推送方案,例如,極光推送(JPush)、百度推送等。讀者也可以用一下,這些同時(shí)通常是免費(fèi)的(可能推送多媒體數(shù)據(jù)需要收費(fèi))。

          posted on 2014-08-27 10:43 順其自然EVO 閱讀(379) 評論(0)  編輯  收藏 所屬分類: android

          <2014年8月>
          272829303112
          3456789
          10111213141516
          17181920212223
          24252627282930
          31123456

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 临高县| 江山市| 开鲁县| 洪湖市| 海门市| 赤壁市| 潜江市| 棋牌| 利津县| 新巴尔虎右旗| 旬邑县| 云浮市| 舞阳县| 游戏| 定兴县| 大新县| 元朗区| 夹江县| 株洲县| 扶风县| 木兰县| 孟州市| 简阳市| 松潘县| 衡山县| 讷河市| 易门县| 中西区| 雷山县| 台中市| 平果县| 德安县| 定兴县| 绥江县| 太仆寺旗| 辽宁省| 湛江市| 长海县| 淅川县| 宜良县| 双江|