Android、iOS和Windows Phone中的推送技術(shù)詳解
推送并不是什么新技術(shù),這種技術(shù)在互聯(lián)網(wǎng)時(shí)代就已經(jīng)很流行了。只是隨著進(jìn)入移動互聯(lián)網(wǎng)時(shí)代,推送技術(shù)顯得更加重要。因?yàn)樵谥悄苁謾C(jī)中,推送從某種程度上,可以取代使用多年的短信,而且與短信相比,還可以向用戶展示更多的信息(如圖像、表格、聲音等)。
推送技術(shù)的實(shí)現(xiàn)通常會使用服務(wù)端向客戶端推送消息的方式。也就是說客戶端通過用戶名、Key等ID注冊到服務(wù)端后,在服務(wù)端就可以將消息向所有活動的客戶端發(fā)送。
實(shí)際上,在很多移動操作系統(tǒng)中,官方都為其提供了推送方案,例如,Google的云推送、IOS、Windows Phone7/8也都提供了類似的推送方案。不過這些推送方案的服務(wù)器都在國外,有一些推送服務(wù)(如Google的云推送)在國內(nèi)由于某些原因不太穩(wěn)定,所以國內(nèi)近幾年涌現(xiàn)出了很多專門為國人打造的推送服務(wù)。
本文將從各種流行移動操作系統(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后,會向APNS查詢這個(gè)device token是否在APNS上注冊了(所有的IOS設(shè)備在第一次使用時(shí)都需要向蘋果服務(wù)器注冊一個(gè)賬號,否則無法從AppleStore下載應(yīng)用,當(dāng)然更無法使用推送服務(wù)了),如果已經(jīng)注冊,APNS會直接向應(yīng)用程序返回這個(gè)devicetoken。應(yīng)用程序獲得這個(gè)devicetoken后,表示APNS已經(jīng)允許向自己推送消息了,接著還需要將該device token發(fā)送給推送服務(wù)器(Provider)。到這里應(yīng)用程序已經(jīng)成功將自己注冊到APNS中了?,F(xiàn)在就可以通過Provider產(chǎn)生要推送的消息,然后Provider會將消息發(fā)送給APNS服務(wù)器,最后APNS服務(wù)器會直接向應(yīng)用程序發(fā)送消息。這個(gè)過程比較復(fù)雜,不過看一下圖2的描述就會對這一過程更加了解了。每一個(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)用程序會向Push Client Service請求一個(gè)Push Notification URI(①)。
第2步:如果當(dāng)前Window Phone設(shè)備已經(jīng)在微軟服務(wù)器注冊了,Push Client Service會從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會將消息發(fā)送到MPNS,然后MPNS會將消息發(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ù)會在本節(jié)后面的部分詳細(xì)介紹,本節(jié)先來介紹一下Android中經(jīng)常使用的各種推送技術(shù)。當(dāng)然,這些推送技術(shù)也能用于其它的移動設(shè)備,但由于Android的官方推送服務(wù)(C2DM)在國內(nèi)使用上有一些問題,所以基于Android的第三方推送服務(wù)較其它系統(tǒng)多,因此這里主要針對Android來介紹。
通常推送技術(shù)會使用如下兩種方式實(shí)現(xiàn)。
1. 輪詢(Pull)方式
2. 持久連接方式(服務(wù)端Push方式)
輪詢方式就是客戶端以一定的時(shí)間間隔不斷查詢服務(wù)端是否有新的消息。這種方式必須自己實(shí)現(xiàn)與服務(wù)器之間的通信機(jī)制,例如消息隊(duì)列等。而且還要考慮輪詢的頻率,如果太慢可能導(dǎo)致某些消息的延遲,如果太快,則會大量消耗網(wǎng)絡(luò)帶寬和電池。所以大多數(shù)推送服務(wù)都不會使用輪詢方式。
持久連接方式也就是Push方 式,對于客戶端來說,是一種被動的方式,而主動權(quán)在服務(wù)端,當(dāng)有消息時(shí),服務(wù)端會向所有注冊到推送服務(wù)器的客戶端推送消息。這種推送方式的好處是可以保證 實(shí)時(shí)性,而且客戶端實(shí)現(xiàn)簡單。當(dāng)然,也會有不足,例如,如果大量的客戶端與服務(wù)端保持長連接時(shí),會消耗服務(wù)器的資源。不過在未推送消息時(shí),這些長連接就成 了空閑連接,通常這種連接主要消耗的是內(nèi)存資源。例如,200萬用戶可能會消耗數(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ù)冗余、這樣會造成移動設(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步:移動設(shè)備上的C2DM服務(wù)需要與Google官方的C2DM服務(wù)器交互,驗(yàn)證當(dāng)前設(shè)備是否在C2DM服務(wù)器上注冊了,如果已經(jīng)注冊,C2DM服務(wù)器會返回一個(gè)注冊ID給客戶端的C2DM服務(wù)。(①和②)
第2步:客戶端的C2DM服務(wù)會與自己的推送服務(wù)器交互,將賬號和C2DM服務(wù)器返回的注冊ID傳給推送服務(wù)器。(③)
第3步:如果要推送消息,推送服務(wù)器會將注冊ID和要推送的消息先發(fā)送到C2DM服務(wù)器,然后C2DM服務(wù)器會直接將消息推送給客戶端(手機(jī)、平板電腦的設(shè)備)(④和⑤)。
讀者可以對照圖4來理解這3個(gè)步驟。

除了使用官方的推送方案外,現(xiàn)在國內(nèi)涌現(xiàn)出多個(gè)第三方的推送方案,例如,極光推送(JPush)、百度推送等。讀者也可以用一下,這些同時(shí)通常是免費(fèi)的(可能推送多媒體數(shù)據(jù)需要收費(fèi))。
- Android消息推送:手把手教你集成小米推送(附demo)
- Android手機(jī)端小米推送Demo解析和實(shí)現(xiàn)方法
- Android中利用App實(shí)現(xiàn)消息推送機(jī)制的代碼
- Android中使用WebSocket實(shí)現(xiàn)群聊和消息推送功能(不使用WebView)
- 使用SignalR推送服務(wù)在Android的實(shí)現(xiàn) SignalA
- Android中使用socket通信實(shí)現(xiàn)消息推送的方法詳解
- Erlang實(shí)現(xiàn)的百度云推送Android服務(wù)端實(shí)例
- Android頂欄定時(shí)推送消息
- android push推送相關(guān)基本問答總結(jié)
- Android小米推送簡單使用方法
相關(guān)文章
android自定義控件ImageView實(shí)現(xiàn)圓形圖片
這篇文章主要為大家詳細(xì)介紹了android自定義控件ImageView實(shí)現(xiàn)圓形圖片,適用于用戶頭像,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-12-12
android獲取情景模式和鈴聲 實(shí)現(xiàn)震動、鈴聲提醒
這篇文章主要介紹了android獲取情景模式和鈴聲,實(shí)現(xiàn)震動、鈴聲提醒,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-12-12
Android實(shí)現(xiàn)顯示系統(tǒng)實(shí)時(shí)時(shí)間
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)顯示系統(tǒng)實(shí)時(shí)時(shí)間,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-05-05
Android編程之繪制文本(FontMetrics)實(shí)現(xiàn)方法
這篇文章主要介紹了Android編程之繪制文本(FontMetrics)實(shí)現(xiàn)方法,結(jié)合實(shí)例形式較為詳細(xì)的分析了Android使用FontMetrics對象繪制文本的相關(guān)技巧,需要的朋友可以參考下2015-12-12
Android編程實(shí)現(xiàn)仿優(yōu)酷圓盤旋轉(zhuǎn)菜單效果的方法詳解【附demo源碼下載】
這篇文章主要介紹了Android編程實(shí)現(xiàn)仿優(yōu)酷圓盤旋轉(zhuǎn)菜單效果的方法,涉及Android界面布局及事件響應(yīng)相關(guān)操作技巧,并附帶demo源碼供讀者下載參考,需要的朋友可以參考下2017-08-08
使用Kotlin實(shí)現(xiàn)文字漸變TextView的代碼
這篇文章主要介紹了使用Kotlin實(shí)現(xiàn)文字漸變TextView的代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-04-04

