android消息推送

最近的一個項目要涉及到從服務端往客戶端推送消息,相似於滴滴打車的司機端,有新的訂單時就往司機的手機推送訂單信息。php

最開始的想法時本身來實現服務端到客戶端的推送,具體以下:html

  1. 客戶端啓動時連上服務端,註冊本身的設備id,用戶id等信息,並經過socket與服務端維持一個長鏈接服務器

  2. 服務端在有新的消息時經過這個長鏈接往客戶端推送消息網絡

這個方案看似簡單,但仔細推敲起來有許多細節不可控,好比須要考慮各類網絡環境,客戶端與服務端程序的穩定性,實際上要本身來實現一個穩定的消息推送服務是要花比較長時間的,雖然也有一些現成的方案,好比Google提供的C2DM(Cloudto Device Messaging)服務,採用MQTT協議實現Android推送,採用XMPP協議實現Android推送等(這些網上均可以找到相應的資料),但對於咱們如今的項目來講仍是須要本身搭建消息推送的服務端和客戶端。socket

而後在網上找了一下原來已經有各類如今的免費的方案了,好比百度推送,極光推送等等,而且文檔和demo都比較齊全,這種方案的具體機制以下(以百度推送爲例):spa

 1. 客戶端啓動時鏈接上百度推送的服務器,百度推送服務會生成註冊設備的設備id,用戶id等信息,並經過ocket與百度推送服務端維持一個長鏈接。.net

 2.客戶端把獲取到的百度推送服務生成的設備id,用戶id等信息以及本身自己在系統中的用戶id(通常這種系統都有個登陸的過程的),經過http請求傳到服務端進行綁定orm

3. 服務端在有新的消息時,經過http請求把消息發送到百度服務端htm

4.百度服務端再把消息經過第1步創建的長鏈接推送到對應的客戶端上blog

最後再與同事溝通後,考慮到百度推送有時不夠穩定,不能保證每次推送都能送到,並且有些可能會有丟失的現象,因而只使用百度推送推送打招呼的信息,而後客戶端再經過http請求直接到服務器上去取新消息,這樣即便中間有一個新消息遺漏了致使沒往客戶端發送打招呼信息,但下一次有新的信息時仍是能夠取到上次遺漏的信息的,因而整個過程變成以下:

1. 客戶端啓動時鏈接上百度推送的服務器,百度推送服務會生成註冊設備的設備id,用戶id等信息,並經過ocket與百度推送服務端維持一個長鏈接。

 2.客戶端把獲取到的百度推送服務生成的設備id,用戶id等信息以及本身自己在系統中的用戶id(通常這種系統都有個登陸的過程的),經過http請求傳到服務端進行綁定

3. 服務端在有新的消息時,經過http請求發一個打招呼的信息到百度服務端

4.百度服務端再把打招呼消息經過第1步創建的長鏈接推送到對應的客戶端上

5.客戶端再發起一個http請求去服務端獲取最新的消息列表

但這種機制相對來講就沒有那麼實時,而且對服務端的壓力也比較大,象滴滴打車這種確定是不適合的,但對於咱們項目是足夠了。

若是要本身搭建消息推送的機制可參考如下文章:

Android消息推送完美解決方案全析

Android推送通知機制分析

Android消息推送機制

移動手機消息推送機制[轉載]

若是想使用百度推送,可參考百度的文檔:

http://developer.baidu.com/wiki/index.php?title=docs/cplat/push/scene

相關文章
相關標籤/搜索