史上最全解析Android消息推送解決方案
前言
-
消息推送在Android開發中應用的場景是越來越多了,比如說電商產品進行活動宣傳、資訊類產品進行新聞推送等等,如下圖:
推送消息截圖
-
本文將介紹Android中實現消息推送的7種主流解決方案
目錄
目錄
1.定義
在用戶未打開App時,App主動向用戶推送服務器最新消息。如下圖:
消息推送的本質是:App將服務器更新的信息推送給用戶
2.作用
- 產品的角度:功能需要,比如說資訊類產品的新聞推送、工具類產品的公告推送等等
- 運營的角度:活動運營需要,比如說電商類產品的促銷活動;召回用戶 / 提高活躍度等等
作為開發者,不要有需求就接,應該多思考、多理解用戶 / 功能的使用場景,有助于我們更好地去選擇合適的開發方式
3.儲備知識
3.1 操作系統有自身的消息推送功能(系統級別)
- 系統級別:任何時候都可以推送給用戶,且不會被系統殺死
- Android的消息推送服務稱為:C2DM(Cloudto Device Messaging)
將在下面詳細描述
3.2 推送的本質與原理
-
消息推送的本質是:App將服務器更新的信息推送給用戶,即App獲取服務器信息,再推送給用戶
-
App從服務器獲取最新消息有兩種基本方式(原理):Push和Pull
-
主動獲取方式(Pull)
客戶端隔固定時間 主動 向服務器獲取信息,看是否有更新的信息;若有更新信息,則發送到客戶端
-
被動接受方式(Push)
當服務器有更新信息時 主動 發送到客戶端
-
-
對比:Push方式比Pull方式更優越。因為采用Pull方式時客戶端需要不停地去監測服務器的變化,更費客戶端的資源(CPU資源、網絡流量、系統電量)
4. 解決方案
經總結,Android中實現消息推送的有7種主流解決方案,接下來將一一介紹。
4.1 C2DM
- 定義:Cloud to Device Messaging,云端推送
Android系統級別的消息推送服務-Google出品
- 原理:基于Push方式,C2DM服務負責處理諸如消息排隊等事務,并向運行于目標設備上的應用程序分發這些消息。如下圖:
C2DM原理
- 優點:C2DM提供了一個簡單的、輕量級的機制,允許服務器可以通知移動應用程序直接與服務器進行通信,以便于從服務器獲取應用程序更新和用戶數據。
- 缺點:
- 依賴于Google官方提供的C2DM服務器,但在國內使用Google服務需國內或許不能訪問,成本較大;
- 需要用戶手機安裝Google服務。但由于Android機型、系統的碎片化 & 國內環境,國內的Android系統都自動去除Google服務,假如要使用C2DM服務,這意味著用戶還得去安裝Google服務,成本較大。
4.2 輪詢
- 原理:基于Pull方式,應用程序隔固定時間 主動 與服務器進行連接并查詢是否有新的消息
- 缺點:
- 成本大,需要自己實現與服務器之間的通信,例如消息排隊等;
- 到達率不確定,考慮輪詢的頻率:太低可能導致消息的延遲;太高,更費客戶端的資源(CPU資源、網絡流量、系統電量)和服務器資源(網絡帶寬)
4.3 SMS
- 定義:短信發送
- 原理:基于Push方式,通過攔截SMS消息并且解析消息內容來了解服務器的意圖,并獲取其顯示內容進行處理。
- 優點:可實現完全的實時操作
- 缺點:成本相對較高。因為目前來說,很難找到免費的短消息發送網關來實現這種方案,只能通過向運營商繳納相應的短信費用
4.4 MQTT協議
- 定義:輕量級的消息發布/訂閱協議
- 原理:基于Push方式,wmqtt.jar 是IBM提供的MQTT協議的實現,原理如下圖:
MQTT協議原理
更多關于MQTT協議:
- 項目實例源
- 一個采用PHP書寫的服務器端
- Jar包下載地址 ,并加入自己的Android應用程序中。
- 拓展:RSMB是從MQTT協議引申出來的另外一種解決方案:簡單的MQTT代理
4.5 XMPP協議
-
定義:Extensible Messageing and Presence Protocol,可擴展消息與存在協議,是基于可擴展標記語言(XML)的協議,是目前主流的四種IM協議之一
其他三種:
- 即時信息和空間協議(IMPP)
- 空間和即時信息協議(PRIM)
- 即時通訊和空間平衡擴充的進程開始協議SIP(SIMPLE)
-
原理:XMPP中定義了三個角色,分別是客戶端、服務器和網關
客戶端
- 通過 TCP/IP與XMPP 服務器連接,然后在之上傳輸與即時通訊相關的指令(XML);
- 解析組織好的 XML 信息包;
- 理解消息數據類型。
- XMPP的核心:XML流傳輸協議(在網絡上分片斷發送XML的流協議),也是即時通訊指令的傳遞基礎,即XMPP用TCP傳的是XML流
- 與即時通訊相關的指令,在以前要么用2進制的形式發送(比如QQ),要么用純文本指令加空格加參數加換行符的方式發送(比如MSN)。
- XMPP傳輸的即時通訊指令的邏輯與以往相仿,只是協議的形式變成了XML格式的純文本。
服務器
- 監聽客戶端連接,并直接與客戶端應用程序通信(客戶端信息記錄)
- 與其他 XMPP 服務器通信;
網關:與異構即時通信系統進行通信
異構系統包括SMS(短信),MSN,ICQ等
通信能夠在這三者的任意兩個之間雙向發生。
原理流程
原理流程
-
優點:
- 開源:可通過修改其源代碼來適應我們的應用程序。
- 簡單:XML易于解析和閱讀;將復雜性從客戶端轉移到了服務器端
- 可拓展性強:繼承了在XML環境中靈活的發展性,可進一步對協議進行擴展,實現更為完善的功能。
GTalk、QQ、IM等都用這個協議
-
缺點:如果將消息從服務器上推送出去,則不管消息是否成功到達客戶端手機上。
-
源碼實例:有一個很棒的基于XMPP協議的java開源Android push notification:Androidpn 項目地址 ,大家有興趣可以去看看
4.6 使用第三方平臺
現今主流的推送平臺分為
- 手機廠商類:小米推送、華為推送。
- 第三方平臺類:友盟推送、極光推送、云巴(基于MQTT)
- BAT大廠的平臺推送:阿里云移動推送、騰訊信鴿推送、百度云推送
具體每種的推送平臺的優缺點和分類請點擊:
4.7 自己搭建
如果你的產品對于消息推送具備較高的功能和性能要求,同時對安全性要求非常高的話,自己搭建可能是最好的方式,但這種方式無疑成本是最高的。
5. 總結
- 經過上面的詳細講解,相信大家現在對Android中消息推送的解決方案已經非常了解
- 解決方案沒有優劣,要具具體使用場景而定。但一般來說, 個人建議使用第三方平臺推送,成本低+抵達率高
- 接下來,我會繼續講解Android開發中關于消息推送的其他知識
來自:http://www.jianshu.com/p/b61a49e0279f