
三、Android的推送方案
Android的推送方案就比較多了,也比較亂。例如,有Google官方提供的C2DM(Android Cloud to Device Messaging);第三方的推送服務(如極光推送);還有通過各種協議實現的推送服務端程序(如AndroidPN),用戶通過這些服務端程序可以搭建自己的推送服務器。這些推送技術會在本節后面的部分詳細介紹,本節先來介紹一下Android中經常使用的各種推送技術。當然,這些推送技術也能用于其它的移動設備,但由于Android的官方推送服務(C2DM)在國內使用上有一些問題,所以基于Android的第三方推送服務較其它系統多,因此這里主要針對Android來介紹。
通常推送技術會使用如下兩種方式實現。
1. 輪詢(Pull)方式
2. 持久連接方式(服務端Push方式)
輪詢方式就是客戶端以一定的時間間隔不斷查詢服務端是否有新的消息。這種方式必須自己實現與服務器之間的通信機制,例如消息隊列等。而且還要考慮輪詢的頻率,如果太慢可能導致某些消息的延遲,如果太快,則會大量消耗網絡帶寬和電池。所以大多數推送服務都不會使用輪詢方式。
持久連接方式也就是Push方式,對于客戶端來說,是一種被動的方式,而主動權在服務端,當有消息時,服務端會向所有注冊到推送服務器的客戶端推送消息。這種推送方式的好處是可以保證實時性,而且客戶端實現簡單。當然,也會有不足,例如,如果大量的客戶端與服務端保持長連接時,會消耗服務器的資源。不過在未推送消息時,這些長連接就成了空閑連接,通常這種連接主要消耗的是內存資源。例如,200萬用戶可能會消耗數十GB的內存。因此搭建這種推送機制時要使用性能好的服務器。
持久連接的實現有很多方式,例如,可以使用XMPP作為通信協議。XMPP的主要優勢是協議成熟、強大,可擴展性強。XMPP更多地用于IM系統中,后面要介紹的AndroidPN也是用了XMPP協議。
XMPP也有明顯的缺點,例如,協議很復雜,如果吃透XMPP協議可能需要很長時間,還有就是由于XMPP是基于XML的,從而造成了數據冗余、這樣會造成移動設備費流量、耗電等弊病。
除了XMPP,還可以使用MQTT協議,這種協議的主要優勢是簡潔、小巧、可擴展性強,從而帶來了省流量、省電等優點,而且有C++版的服務端組件rsmb。缺點是協議不夠成熟,而且實現較復雜,而且rsmb不開源,部署硬件的成本較高。
盡管C2DM服務在國內可能不太穩定或有一些地區不可用,但還是有必要介紹一下C2DM的原理。不過對于在國內使用的應用最好使用第三方的推送服務,或自己假設推送服務器。
C2DM和IOS的APNS以及Window Phone的MPNS大同小異。還需要自己準備一臺推送服務器,并通過如下步驟實現消息的推送。
第1步:移動設備上的C2DM服務需要與Google官方的C2DM服務器交互,驗證當前設備是否在C2DM服務器上注冊了,如果已經注冊,C2DM服務器會返回一個注冊ID給客戶端的C2DM服務。(①和②)
第2步:客戶端的C2DM服務會與自己的推送服務器交互,將賬號和C2DM服務器返回的注冊ID傳給推送服務器。(③)
第3步:如果要推送消息,推送服務器會將注冊ID和要推送的消息先發送到C2DM服務器,然后C2DM服務器會直接將消息推送給客戶端(手機、平板電腦的設備)(④和⑤)。
讀者可以對照圖4來理解這3個步驟。
除了使用官方的推送方案外,現在國內涌現出多個第三方的推送方案,例如,極光推送(JPush)、百度推送等。讀者也可以用一下,這些同時通常是免費的(可能推送多媒體數據需要收費)。