Android 使用GCM(Google Cloud Messaging)推送消息

       關於android實現推送方式解決方案我想你們已經不會以爲陌生了,若是你們有興趣,能夠了解如下四個解決方案: html

      1. C2DM(Android Cloud to Device Messageing) 雲端推送功能 java

       Android從2.2版本開始添加了Cloud to Device Messaging(C2DM)框架,在系統中支持了Push的功能,這對於須要用到Pash功能的開發者來講是一個好消息,可是C2DM有如下幾個制約要求: android

      <1>設備須要Android2.2及以上的系統版本 shell

      <2>使用D2DM功能的Android設備上須要添加Google帳戶 macos

      <3>須要註冊使用C2DM功能的用戶郵箱帳號 api

      <4>依賴於Google官方提供的C2DM服務器(這是主要的制約因素,因爲國內的網絡環境,這個服務可用的狀況少之又少,並且要想很好地使用C2DM,最好APP Server還要在國外)    。   瀏覽器

      因爲國內的網絡環境,C2DM在國內不太推行,目前谷歌已經推出Google Cloud Messaging(GCM)來取代C2DM了,若是你們想要對C2DM深刻了解,可用本身去查查資料。 tomcat

     2. XMPP(The Extensible Messaging and Presence Protocol)協議 服務器

     XMPP協議也叫可拓展通信和表示協議,是用於即時消息和在線現場探測的一種基於XML協議。其實上述所說到的C2DM服務器底層也是採用XMPP協議進行封裝的,而XMPP又是相似於http的一種數據傳輸協議,XMPP在國內開發者的使用中仍是很多的。 網絡

      3. MQTT協議

      MQTT協議是一個輕量級的消息發佈/訂閱協議。在目前看來,也算是移動終端實現消息推送的優先解決方案。

      4. RSMB(Really Small Message Broker)協議

      RSMB是一個簡單MQTT代理,缺省打開1883端口,在應用程序當中接收來自服務器的消息並傳送給指定的設備,你們能夠在這裏瞭解一下RSMB:https://www.ibm.com/developerworks/community/groups/service/html/communityview?communityUuid=d5bedadd-e46f-4c97-af89-22d65ffee070

      關於Android端實現消息推送功能各個協議的優缺點比價你們能夠查看這個連接:

        http://blog.csdn.net/shagoo/article/details/7899466

      好了,言歸正傳,如今開始測試Google官方的GCMDemo,爲了測試這個小demo,着實費了很多功夫,期間遇到一些錯誤,在國內可參考的資料寥寥無幾,Google Group上卻是也有些資料,但因爲國內網絡環境,想打開諸如此類的網頁,還須要我的作一些操做。。。

      這是google提供的GCM官方文檔,你們能夠去看看,跟着操做一下:http://developer.android.com/google/gcm/demo.html

       前期準備工做:

        (1)建立項目,而且記錄下Project Nunber和ApiKey。

         在這裏(https://code.google.com/apis/console) 建立你的Google項目(若是已經存在,能夠跳過這一步)

         

       建立完成後記錄下你的Project Number,好比:

https://code.google.com/apis/console/#project:123456789
       123456789 即爲你的Project Number,這個待會兒會用到。接着建立一個Server Key:

        

      在這裏輸入你的IP地址(可選,不輸也能夠):

      

        點擊建立以後以下圖所示,記錄下ApiKey:

       

      注:爲了保護筆者谷歌帳號信息以及保證圖的來源一致性,此處以上的圖均爲谷歌官方提供的,給你們提供的不便,敬請諒解,此處如下的截圖纔是筆者本身的。   

      接下來要裝上Google Cloud Messaging for Android,打開SDKManager,更新便可:

      

      這樣,在你的Adnroid sdk安裝目錄下(sdk目錄/extras/google/)就會有gcm這個文件夾了。

      最後在測試過程當中須要用到如下幾個工具:

      a.Ant1.8(固然低於1.8的版本也能夠,但也不能保證)

      b.Tomcat 6 或者Jetty,這裏我用的是Tomcat 7

      c.JDK1.6及以上

      d.模擬器2.2及以上,而且裝有Google Apis。

      e.Google帳號,由於須要在Android設備上添加谷歌帳號後才能使用GCM的功能。

     這樣準備工做已經完成。

     接下來開始測試GCMDemo:

      第一步:須要找gcm目錄下(/gcm/samples/gcm-demo-server/WebContent/WEB-INF/classes/api.key)api.key這個文件,把你剛纔記錄下的ApiKey替換掉裏邊的文本。

      而後在終端下先定位到tomcat安裝路徑/bin目錄下,執行$ sudo sh startup.sh,開啓tomcat服務,接着定位到samples/gcm-demo-server路徑,在終端輸入$ ant war命令:

sunmatoMacBook-Pro:gcm-demo-server sunei$ ant war
Buildfile: /Users/sunei/android/android-sdk-macosx/extras/google/gcm/samples/gcm-demo-server/build.xml

init:
    [mkdir] Created dir: /Users/sunei/android/android-sdk-macosx/extras/google/gcm/samples/gcm-demo-server/build/classes
    [mkdir] Created dir: /Users/sunei/android/android-sdk-macosx/extras/google/gcm/samples/gcm-demo-server/dist

compile:
    [javac] Compiling 7 source files to /Users/sunei/android/android-sdk-macosx/extras/google/gcm/samples/gcm-demo-server/build/classes

war:
      [war] Building war: /Users/sunei/android/android-sdk-macosx/extras/google/gcm/samples/gcm-demo-server/dist/gcm-demo.war

BUILD SUCCESSFUL
Total time: 1 second
        找到 samples/gcm-demo-server/dist/下有一個gcm-demo.war文件,拷貝到Tomcat安裝目錄/wepapps/下,而後打開瀏覽器,在地址欄輸入你剛纔"你的IP地址/gcm-demo/home",這時候網頁左上角就會返回「No devices rigistered」。

       第二步:使用App Engine For Java:

       若是沒有App Engine For Java的能夠點此連接下載:https://developers.google.com/appengine/downloads?hl=zh-CN

       下載並解壓後,找到並打開這個文件samples/gcm-demo-appengine/src/com/google/android/gcm/demo/server/ApiKeyInitializer.java,而後用你剛纔記錄的ApiKey替換掉ATTRIBUTE_ACCESS_KEY的默認值:

static final String ATTRIBUTE_ACCESS_KEY = "AIzaSyA8Ahe4X1jlocT_9xOYeUBb1TB9lsJN5vg";
       定位到samples/gcm-demo-appengine,運行命令:$ ant -Dsdk.dir=/Users/sunei/android/appengine-java-sdk-1.7.2/appengine-java-sdk-1.7.2 runserver -Dserver.host=172.16.2.93。前段爲你剛解壓App Engine for java後獲得的路徑(注意:不是解壓後獲得的appengine根目錄,還要再往下一層)

sunmatoMacBook-Pro:gcm-demo-appengine sunei$ ant -Dsdk.dir=/Users/sunei/android/appengine-java-sdk-1.7.2/appengine-java-sdk-1.7.2 runserver -Dserver.host=172.16.2.93
Buildfile: /Users/sunei/android/android-sdk-macosx/extras/google/gcm/samples/gcm-demo-appengine/build.xml

init:
    [mkdir] Created dir: /Users/sunei/android/android-sdk-macosx/extras/google/gcm/samples/gcm-demo-appengine/WebContent/WEB-INF/classes
    [mkdir] Created dir: /Users/sunei/android/android-sdk-macosx/extras/google/gcm/samples/gcm-demo-appengine/dist
...
...
BUILD SUCCESSFUL
Total time: 17 seconds
        第三步:設置你的設備

        找到並打開samples/gcm-demo-client/src/com/google/android/gcm/demo/app/CommonUtilities.java,作如下替換,保存修改:

        

static final String SERVER_URL = "http://172.16.2.93:8080/gcm-demo";//這是你待會兒要訪問的地址
static final String SENDER_ID = "123456789";//這是你剛纔記錄的project number
        接着定位到 samples/gcm-demo-client,執行命令:$ android update project --name GCMDemo -p . --target android-16(這裏注意一下:後面的版本最低爲15,也就是說不能低於15),結果以下:

sunmatoMacBook-Pro:gcm-demo-client sunei$ android update project --name GCMDemo -p . --target android-16
Updated and renamed default.properties to project.properties
Updated local.properties
Added file ./build.xml
Added file ./proguard-project.txt
       而後使用ant命令來建立GCMDemo的.apk文件:$ ant clean debug

sunmatoMacBook-Pro:gcm-demo-client sunei$ ant clean debug
Buildfile: /Users/sunei/android/android-sdk-macosx/extras/google/gcm/samples/gcm-demo-client/build.xml

-check-env:
 [checkenv] Android SDK Tools Revision 21
 [checkenv] Installed at /Users/sunei/android/android-sdk-macosx

-setup:
     [echo] Project Name: GCMDemo
  [gettype] Project Type: Application

-pre-clean:

clean:
[getlibpath] Library dependencies:
[getlibpath] No Libraries
   [subant] No sub-builds to iterate on

-set-mode-check:

-set-debug-files:

-check-env:
 [checkenv] Android SDK Tools Revision 21
 [checkenv] Installed at /Users/sunei/android/android-sdk-macosx

-setup:
     [echo] Project Name: GCMDemo
  [gettype] Project Type: Application

-set-debug-mode:

-debug-obfuscation-check:
...
...
debug:

BUILD SUCCESSFUL
Total time: 6 seconds
       這時候你可使用命令$emulator -avd my_avd來打開你的模擬器(my_avd爲你模擬器的名字),也能夠經過其餘方式手動打開。

      接着把剛纔建立的GCMDemo.apk安裝到模擬器中,使用命令:$ ant installd

    

sunmatoMacBook-Pro:gcm-demo-client sunei$ ant installd
Buildfile: /Users/sunei/android/android-sdk-macosx/extras/google/gcm/samples/gcm-demo-client/build.xml

-set-mode-check:

-set-debug-files:

install:
     [echo] Installing /Users/sunei/android/android-sdk-macosx/extras/google/gcm/samples/gcm-demo-client/bin/GCMDemo-debug.apk onto default emulator or device...
     [exec] 698 KB/s (48923 bytes in 0.068s)
     [exec] * daemon not running. starting it now on port 5037 *
     [exec] * daemon started successfully *
     [exec] 	pkg: /data/local/tmp/GCMDemo-debug.apk
     [exec] Success

installd:

BUILD SUCCESSFUL
Total time: 9 seconds
       這樣,就成功地把GCMDemo安裝到模擬器上了,這時候咱們來看網頁端依舊是"No devices registered"(這裏之因此有上面那句話是由於以前測試在設備沒註冊的時候就點擊發送消息按鈕)。

      

      在打開模擬器上GCMDemo以前,先肯定你的設備是否已經添加了google帳號,由於設備添加了google帳號以後才能使用GCM的功能(若是你的模擬器版本在android 4.0.4及以上,那麼添加帳號就是可選的,也就是能夠省掉添加帳號這一環節),添加了帳號截圖以下:


       這裏筆者使用的是android 4.1.2版本的,以前模擬器也已經添加了谷歌帳號。

      最後讓咱們進入GCMDemo,當咱們點擊進入之後,將把該設備(當前模擬器)執行添加操做,成功添加截圖以下:

      而後咱們再來看看網頁端:

      當咱們點擊發送消息以後,來看看網頁端的變化和模擬器可否接收穫得消息:

      這樣,你的設備(模擬器)就能成功地接收到server那邊推送過來的消息了!你們能夠嘗試一下,若是有上面問題,歡迎你們留言,共同窗習,共同進步!謝謝!

相關文章
相關標籤/搜索