前段時間作的項目須要添加一個推送的功能,如今應用裏邊加入推送也很廣泛,因此查了查相關的資料,總結了如下幾種方案!php
【1】使用XMPP協議(Openfire + Spark + Smack)java
簡介:基於XML協議的通信協議,前身是Jabber,目前已由IETF國際標準化組織完成了標準化工做。
優勢:協議成熟、強大、可擴展性強、目前主要應用於許多聊天系統中,且已有開源的Java版的開發實例androidpn。
缺點:協議較複雜、冗餘(基於XML)、費流量、費電,部署硬件成本高。linux
這種方法須要服務端配合,須要整合openfire服務器,咱們的服務端用的php,而這個須要用Java,客戶端的代碼也須要花一段時間去研究,因爲時間有限並無使用這種方法。不過在後來的開發中,想在程序里加入相似於微信的語音聊天的功能,因此對於這種方式又進行了一段開發,之後我會寫一篇文章介紹一下。android
【2】使用MQTT協議git
簡介:輕量級的、基於代理的「發佈/訂閱」模式的消息傳輸協議。
優勢:協議簡潔、小巧、可擴展性強、省流量、省電,目前已經應用到企業領域(參考:http://mqtt.org/),且已有C++版的服務端組件rsmb。github
【3】使用第三方推送服務服務器
1.Google 雲推送服務微信
鑑於國內的特殊狀況,大部分國產手機都砍掉了Google服務,因此這種實現方式不太現實app
2. 百度雲推送服務(http://open.baidu.com/)eclipse
這個推送方案實施起來比較簡單,直接集成相關的sdk,就能夠實現推送,並且服務端的sdk有PHP,Java,Python版本,也能夠直接經過url推送相關消息
3. 極光推送(https://www.jpush.cn/)
這個文檔比較全,號稱3分鐘快速Demo,集成起來相對就簡單多了
今天主要介紹一下第二種推送方案,以前查資料的時候沒有找到百度雲推送和極光推送,也是後來一個偶然的機會發現百度推出了雲推送服務,今天總結一下,也但願之後各位朋友在開發中少走彎路,
1.首先下載rsmb包,並解壓,找到對應服務器的文件夾,個人是linux_ia32,這個支持多種服務器
(下載地址:http://www.alphaworks.ibm.com/tech/rsmb,或者 http://pan.baidu.com/share/link?shareid=305439419&uk=137542493)
2.把目錄及裏面的文件上傳到服務器上,(個人是linux服務器)進入到用命令行進入到該目錄 而後自行 ./broker 如此這般便啓動了推送服務,
3.準備推送頁面(經過網頁進行推送測試)下載PHP端的推送代碼 (http://pan.baidu.com/share/link?shareid=311569022&uk=137542493),解壓進入 etc目錄更改 config.php裏的IP地址爲你的服務器IP地址
4.打開對應的url既能夠看到以下的頁面
Server status顯示爲 Online說明服務器正常啓動了,
5.下面開始準備android客戶端(下載地址https://github.com/tokudu/AndroidPushNotificationsDemo )
下載-->解壓-->導入eclipse-->修改PushService裏的MQTT_HOST爲你的服務器的IP地址-->運行
啓動推送服務,而後在上邊的網頁上把那一串字符輸入到上邊的輸入框,下邊輸入要推送的內容
不幸的是報錯了,錯誤以下
08-05 13:56:34.472: E/AndroidRuntime(30976): java.lang.VerifyError: com/tokudu/demo/PushService
08-05 13:56:34.472: E/AndroidRuntime(30976): at com.tokudu.demo.PushActivity$1.onClick(PushActivity.java:32)
08-05 13:56:34.472: E/AndroidRuntime(30976): at android.view.View.performClick(View.java:4240)
08-05 13:56:34.472: E/AndroidRuntime(30976): at android.view.View$PerformClick.run(View.java:17721)
08-05 13:56:34.472: E/AndroidRuntime(30976): at android.os.Handler.handleCallback(Handler.java:730)
08-05 13:56:34.472: E/AndroidRuntime(30976): at android.os.Handler.dispatchMessage(Handler.java:92)
08-05 13:56:34.472: E/AndroidRuntime(30976): at android.os.Looper.loop(Looper.java:137)
08-05 13:56:34.472: E/AndroidRuntime(30976): at android.app.ActivityThread.main(ActivityThread.java:5103)
08-05 13:56:34.472: E/AndroidRuntime(30976): at java.lang.reflect.Method.invokeNative(Native Method)
08-05 13:56:34.472: E/AndroidRuntime(30976): at java.lang.reflect.Method.invoke(Method.java:525)
08-05 13:56:34.472: E/AndroidRuntime(30976): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:737)
08-05 13:56:34.472: E/AndroidRuntime(30976): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
08-05 13:56:34.472: E/AndroidRuntime(30976): at dalvik.system.NativeStart.main(Native Method)
這個錯誤是由於少了個jar包,只要加入jar包就能夠了(下載地址 http://pan.baidu.com/share/link?shareid=455455739&uk=137542493)
推送成功
【e】在後續的開發中遇到了個錯誤,在此提出來但願各位朋友避免出現此錯誤
1.當推送服務啓動的時間過長時,通常啓動幾個月以後,可能會出現客戶端鏈接不上服務,可能會致使程序沒法運行,此時須要從新啓動推送服務就可解決
歡迎加QQ羣 Android技術交流分享(167449133) 討論!!!