安卓推送、android文本推送、安卓富媒体推送解决方案
? ? ? ? 在開發Android和iPhone應用程序時,我們往往需要從服務器不定的向手機客戶端即時推送各種通知消息,iPhone上已經有了比較簡單的和完美的推送通知解決方案,可是Android平臺上實現起來卻相對比較麻煩,最近由于項目需要,利用十幾天的時間對Android的推送通知服務進行了初步的研究。
?
?????? Android Cloud to Device Messaging (C2DM)是一個用來幫助開發者從服務器向Android應用程序發送數據的服務。該服務提供了一個簡單的、輕量級的機制,允許服務器可以通知移動應用程序直接與服務器進行通信,以便于從服務器獲取應用程序更新和用戶數據。C2DM服務負責處理諸如消息排隊等事務并向運行于目標設備上的應用程序分發這些消息。
C2DM操作過程圖:
?
?
但是經過一番研究發現,這個服務存在很大的問題:
1)C2DM內置于Android的2.2系統上,無法兼容老的1.6到2.1系統;
2)C2DM需要依賴于Google官方提供的C2DM服務器,由于國內的網絡環境,這個服務經常不可用,如果想要很好的使用,我們的App Server必須也在國外,這個恐怕不是每個開發者都能夠實現的;
有了上述兩個使用上的制約,導致我最終放棄了這個方案.
?
?
?????? 下面我來介紹幾種常見的方案:
1)SMS(Push):在Android平臺上,你可以通過攔截SMS消息并且解析消息內容來了解服務器的意圖。這是一個不錯的想法,我就見過采用這個方案的應用程序。這個方案的好處是,可以實現完全的實時操作。但是問題是這個方案的成本相對比較高,你很難找到免費的短消息發送網關,關于這個方案的實現。
2)持久連接(Push):這個方案可以解決由輪詢帶來的性能問題,但是還是會消耗手機的電池。Apple的推送服務之所以工作的很好,是因為每一臺手機僅僅保持一個與服務器之間的連接,事實上C2DM也是這么工作的。不過這個方案也存在不足,就是我們很難在手機上實現一個可靠的服務。Android操作系統允許在低內存情況下殺死系統服務,所以你的通知服務很可能被操作系統Kill掉了。這種解決方案的局限性也很大,采用這個方案,我們目前只能發送文字消息。
3)輪詢(Pull):應用程序應當階段性的與服務器進行連接并查詢是否有新的消息到達,你必須自己實現與服務器之間的通信,例如消息排隊等。而且你還要考慮輪詢的頻率,如果太慢可能導致某些消息的延遲,如果太快,則會大量消耗服務器的資源。
不過我們可以通過良好的設計來彌補,以便于讓該方案可以有效的工作。??
?
?
安卓開發者如何自己搭建服務器?
?????? androidpn目前它是開源的,對于其簡單的推送功能它還是能夠實現的。我們可以修改其源代碼來適應我們的應用程序。
事實上Google官方的C2DM服務器底層也是采用XMPP協議進行的封裝。XMPP(可擴展通訊和表示協議)是基于可擴展標記語言(XML)的協議,它用于即時消息(IM)以及在線探測。這個協議可能最終允許因特網用戶向因特網上的其他任何人發送即時消息。經過源代碼研究我發現,該服務器端基本是在另外一個開源工程openfire基礎上修改實現的,不過比較郁悶的是androidpn的文檔是由韓語寫的,所以整個研究過程基本都是讀源碼。
這是androidpn的項目主頁:http://sourceforge.net/projects/androidpn/
androidpn實現意圖如下圖所示:
androidpn服務器端也是java語言實現的,基于openfire開源工程,不過它的Web部分采用的是spring框架,這一點與 openfire是不同的。Androidpn服務器包含兩個部分,一個是偵聽在5222端口上的XMPP服務,負責與客戶端的 XMPPConnection類進行通信,作用是用戶注冊和身份認證,并發送推送通知消息。另外一部分是Web服務器,采用一個輕量級的HTTP服務器, 負責接收用戶的Web請求。服務器架構如下:
?
最上層包含四個組成部分,分別是SessionManager,Auth Manager,PresenceManager以及Notification Manager。SessionManager負責管理客戶端與服務器之間的會話,Auth Manager負責客戶端用戶認證管理,Presence Manager負責管理客戶端用戶的登錄狀態,NotificationManager負責實現服務器向客戶端推送消息功能。
?
這個解決方案的最大優勢就是簡單,我們不需要象C2DM那樣依賴操作系統版本,也不會擔心某一天Google服務器不可用。利用XMPP協議我們還可以進一步的對協議進行擴展,實現更為完善的功能。 采用這個方案,我們目前只能發送文字消息,不過對于推送來說一般足夠了,因為我們不能指望通過推送得到所有的數據,一般情況下,利用推送只是告訴手機端服務器發生了某些改變,當客戶端收到通知以后,應該主動到服務器獲取最新的數據,這樣才是推送服務的完整實現。 XMPP協議書相對來說還是比較簡單的,值得我們進一步研究。
?
但是在經過一段時間的測試,我發現關于androidpn也存在一些不足之處:
1.?比如時間過長時,就再也收不到推送的信息了。
2.?性能上也不夠穩定。
? ?3. 如果將消息從服務器上推送出去,就不再管理了,不管消息是否成功到達客戶端手機上。
?
等等,總之,androidpn也有很多的缺點。如果我們要使用androidpn,則還需要做大量的工作。
?
?利用現成的推送平臺
????? 最后一種簡單的解決方案是使用第三方的推送平臺,對于我們開發者來說也比較輕松。
第三方平臺有商用的也有免費的,我們可以根據實現情況使用。關于國內的第三方平臺,我感覺目前比較不錯的就是快推,它是國內僅有的免費富媒體推送平臺,有兩種推送形式:通知欄和窗口。其他富媒體推送目前都是收費的,對于我這種IT屌絲階層傷不起。關于詳細情況,大家可以查看它的主頁,這里不再詳細描述:http://www.tiantianfl.net/
?
?
快推通知欄顯示:你好,張三
?
?
?
快推窗口顯示:你好,張三
總結
以上是生活随笔為你收集整理的安卓推送、android文本推送、安卓富媒体推送解决方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Win10如何给桌面文件夹自定义图标】
- 下一篇: 更改文件夹目录、硬盘、U盘的图标