要如何開發出能接收Server通知訊息(如活動消息、聊天訊息)的Android App呢?Google提供了Google Cloud Messaging(GCM)服務,能將您想要推送給客戶端裝置的訊息交給GCM伺服器來處理,Google的推播伺服器會將收到的訊息推播給Android客戶端裝置,接收到訊息的裝置可以將訊息處理後並顯示在通知欄,達成通知使用者的目的。



注意,這篇文章已經過時!

Google Cloud Messaging 運作機制

使用GCM來實作Android推播功能,運作方式如下圖,可以分為三個部份:

一、註冊API Key(紫色部份)

如果要使用Google API,一定要先到Google Developers Console中拿到API Key。

若在Console上還沒有專案,必須先新增一個。

接著到這個專案中,將Google Cloud Messaging for Android的API設定為啟用。

然後替這個專案加入一個能讓App Server使用的Public API Key,並將API Key存到App Server中,再將Client ID(或是Project number)存到要接收推播的Android App中,作為Sender ID。

做這個部份的用意是要讓App Server有權限能夠存取Google伺服器,並且能夠使用GCM。將Client ID存入Android App中,是為了提供給下一個部份使用。

二、Android客戶端裝置註冊GCM(藍色部份)

為了使GCM能夠辨識出訊息要傳給哪些裝置,必須讓這些裝置先向GCM註冊。因此Android裝置必須提供Client ID(Sender ID)給GCM,來要求使用GCM的功能(提供Sender ID是為了要讓GCM知道是由哪個上個部份提到的Console專案所發出的通知訊息)。如果GCM同意讓Android裝置使用它的功能,會回傳一個獨特的,代表這個Android裝置的Registration ID。這個Registration ID應該要交由App Server來儲存,讓App Server知道底下有哪些Android裝置能夠進行訊息推播。

三、App Server推播訊息給Android裝置(橘色部份)

一旦App Server有了第一部份和第二部份所拿到的Public API Key和Registration ID,就可以向GCM傳送要推播給指定Android裝置的訊息。GCM在接收到App Server傳來的訊息後,會去判斷傳入的Registration ID(s)對應到哪個(哪些)裝置,在不固定的時間內將訊息推送出去。換句話說,Android裝置並不一定會「立刻」收到App Server所發出的訊息。

事實上,Android裝置也可以傳送訊息給GCM,然後反推給App Server,只不過傳送的方式並非一般的HTTP,實際上也不是那麼常使用,所以就不針對這個部份討論。

實作支援GCM的App Server

要向GCM發送訊息,必須透過下面這個HTTPS連線網址:

在傳送Request的時候,Header必須包含以下屬性:

資料要以POST的方式傳送,資料格式須為Json,且Json格式如下:

發送給GCM Request後,GCM將回傳一個Json回來,格式如下:

success欄位為推播能夠成功的裝置數量,failure欄位為推播失敗的裝置數量。

PHP範例下載

實作支援GCM的Android Client

以下是實作GCM的Android Client,必須注意的項目:

  • 需要加入到Android專案的檔案有:GcmBroadcastReceiver.java, MagicLenGCM.java。
  • 需要加入到Android專案的Library有:google-play-services_lib。
  • Android Target必須包含Google API。
  • Android Client必須執行在有安裝Google Play App並且已經設置Google帳戶的Android環境。

以下是每個檔案中,需要新增或是修改的程式碼。

AndroidManifest.xml

permission

application

以上的「org.magiclen.gcmclient」記得改成自己的package名稱。

MagicLenGCM.java

GcmBroadcastReceiver.java

使用MagicLenGCM可以很快地完成GCM註冊以及取得Registration ID的功能。在GcmBroadcastReceiver內可以使用MagicLenGCM的sendLocalNotification,將接收到的推播訊息顯示在本地端的通知欄中。