Monday, February 13, 2012

Android Push Notification推播機制(2)-實務篇

撰寫時間︰2012/02/09 13:53
更新時間︰2012/02/14 13:5752
文章更新次數︰2

以下內容由Google I/O 2010 - Building push applications for Android18:01翻譯擷取

一、前言
前一篇中,
已經簡略的介紹C2DM在Android環境的操作流程,
這一篇將更詳細的介紹其中的細節。

二、文章開始
實際上跟C2DM溝通的過程是這樣的︰

1. [手機端]先由手機上的App跟C2DM伺服器取得一組RegistrationID - 利用開啟Service的方式。
傳送的內容應含有你的App資訊以及你的e-mail帳戶,這個e-mail帳戶將會被App Server傳訊息時使用,手機上是完全用不到的。呼叫方式如下︰

2. [手機端]C2DM會回傳一個含有RegistrationID的Intent給你的App
C2DM會以Broadcast的型態傳送Intent給App,底下是收Intent的方式

3. [手機端]將RegistrationID發送給你的App Server

4. [App Server端]發送文字訊息是App Server的工作,App Server在收到手機App傳來的RegistrationID後,要做以下的動作︰
(1)使用ClientLogin API取得ac2dm的auth token,並安裝至你的App Server中
(2)發送authenticated的HTTP POST給C2DM
POST的內容會含
- authenticated的token
- authenticated的header
- encoded parameter
- collapse_key 用來控制當手機離線時,要有多少訊息被傳遞
- idle parameter (可選擇)用來控制訊息發出的延遲時間
- payload (可選擇)這個payload藉時會被轉成Intetn的extra供手機App使用

5.[App Server端]App Server端會收到3組從C2DM回傳回來的典型的Response︰

(1)200 -跟C2DM的請求成功,同時App Server也會收到從C2DM傳來的ID。App Server屆時會用這組ID來做message發送至手機端的動作。
(2)401 -若收到此值代表你的authenticated token失效了,你必須再抓一個新的authenticated token
(3)503 - 伺服器失效,請在收到header後,重新再試一次。

當然,也會有error的狀況發生︰
(1)如果C2DM發現有人傳出大量或過多的message,很快就會到達使用額度限制。當如果我們這麼做,唯一能做的就是過一段期間後再發message了。
(2)如果你提供的RegistrationID是失效的,或者你的App尚未註冊(unregistration),那麼就必須等到你用App註冊到了一組新的RegistrationID,才能繼續做發送message的動作。
(3)如果發出的message超過上限1K,或者沒有提供collapse key,也必須先修正後,再做出重新發送message的動作。

6.[App Server端]App Server傳送message給手機時,會自動將傳送的訊息轉成一組Broadcast的Intent。
7.[手機端]因為您手機的App已事先設定了相對應的permission宣告(見上圖com.google.android.c2dm.intent.RECEIVE),因此一旦收到從App Server端傳來的Broadcast時,手機裡只有這隻App知道有人在呼叫它,手機裡該App知道它要做事了。

8.[手機端]手機裡的App將手機裝置喚醒,並開始做一些開發者預設App要做的事。

三、總結 
經由以上的機制,我們知道Poll機制不用像Push機制一樣,還要設一個Service在背景執行並消耗手機電力。而你在App Server發出payload的內容,將都會在這個Intetn中被轉成Intent的extra,做你想要做的事情。

四、備註
1.因為一收到broadcast時,會喚醒手機(呼叫WakeLock資源)。因此,當App事情做完後,不要忘了將WakeLock資源釋放掉!

2.無論你重覆發幾次訊息給C2DM,若是用同一組RegistrationID,最後一組訊息永遠會覆蓋舊有的那一組訊息!

3.一隻App有可能會收到多組collapse key,請務必塞對內容至手機App中。

4.手機若在飛航模式下,可接收至多4組訊息(以每臺裝置來看)。
5.手機要看到的message內容應該是從App Server發出,而非從App Server發訊息給C2DM的過程中

6.如果使用者將手機切為[不要資料同步]的狀態時,C2DM不會起作用。

7.App Server端的相關技術文件,請參照A2CM APIClientLogin API

下一篇︰
Android Push Notification推播機制(3)-collapse key

相關文章︰
Android Push Notification推播機制(1)-簡介篇
Android Push Notification推播機制(4)-[狀況1]手機在飛航模式下
Android Push Notification推播機制(5)-Attenuation
Android Push Notification推播機制(6)-[狀況2]手機在待機下
Android Push Notification推播機制(7)-[實例分享]以Chrome to Phone為例
Android Push Notification推播機制(8)-問答篇
官方技術公報 - Android Cloud To Device Messaging


No comments: