百度云推送應用場景
1.名詞解釋
API Key - 應用標識,終端上的綁定和服務端推送消息時都要用到。
Secret Key - 應用私鑰,服務端推送消息時用到。
app id - 應用ID,就是百度開發者中心的應用基本信息中的應用ID。客戶端綁定調用返回值中可獲得。
channel id - 推送通道ID,通常指一個終端,如一臺android系統手機。客戶端綁定調用返回值中可獲得。
user id - 應用的用戶ID,一個應用在多個端可以都屬于同一用戶。user id和channel id配合可以唯一指定一個應用的特定終端。如果應用不是基于百度賬戶的賬戶體系,單獨用user就通常指定了一個應用的特定終端。客戶端綁定調用返回值中可獲得。
2.單播消息推送
描述
開發者向應用的特定終端或特定用戶推送消息。 特定終端對于應用來說,就是安裝了應用的一臺具體的設備。 而一個用戶可能有多個端,在某些應用場景下,我們希望消息是針對用戶的——應用的同一個用戶在他的所有終端上都能收到消息,這時候我們就需要向特定用戶推送消息。
解決思路
(1)向應用的特定終端推送消息
一個channel id指定一個終端,因此在這種需求下,開發者需要通過服務端API,向一個特定channel id推送消息。在推送之前,客戶端應用通過綁定接口的返回值獲取到channel id,并通過網絡等手段發送給開發者,開發者需自行維護channel id。
例如,Android客戶端,在調用了startWork之后,自定義消息 receiver將會收到返回值,其中包含了channel id、user id等信息。
(2)向應用的特定用戶推送消息
云推送用user id來表示用戶,因此在這種需求下,開發者需要通過服務端API,向一個特定user id推送消息。和channel id獲取方式類似,客戶端應用通過綁定接口的返回值獲取到user id。開發者需要自行維護user id。
應用場景舉例
在線問答應用。用戶A用手機發表一個問題,問題的解答并不是實時的。假設在第二天用戶B發表了第一個解答,這時需要將答案單獨推送給A。
解決方案
用戶A發表問題時,記錄問題id及其對應的A的user id(或channel id)。用戶B發表解答時,通過服務端API向問題id對應的user id(或channel id)推送解答。
3.用戶分組的消息推送
描述
開發者向應用的符合特定分類條件的若干用戶的集合推送消息。廣播是分組推送的特例,它向應用的所有用戶(同時也是所有端)推送消息。
解決思路
云推送通過Tag(標簽)這種技術方式來實現用戶分組的功能。例如,對于分類信息的應用,一個用戶觀看了體育欄目,就給該用戶打一個Tag——sport。6月的某一天NBA總決賽熱火奪冠了,則向sport這個Tag推送一條及時的奪冠新聞。
Tag的設置有兩種方法:
(1)客戶端設置
這是最常見的設置方式,因為和用戶直接交互的客戶端最真實的收集了用戶的喜好、習慣等信息。這些信息往往是用戶分組的依據。在客戶端程序中,一旦用戶觸發了開發者預先設定的分組條件(如:觀看了體育欄目,設置了年齡,團購了電影票等),則調用客戶端API進行Tag設置(對應的Tag:sport,80s,movie),如Android端的setTags接口。
(2)服務端設置
如果開發者自己維護了用戶的分組信息,或者存在已發布的還不具備某分組設置功能的終端版本,也可以通過服務端API給特定用戶設置Tag,如PHP接口setTag。
廣播功能和Tag無關,不需要開發者進行分組的任何操作就已經具備。
推送Tag消息的方法:
(3)通過管理控制臺推送
若要推送廣播消息,選中上圖中的所有人即可。
(4)通過服務端API推送
如PHP接口
- public function pushMessage (
- $push_type,
- $messages,
- $message_keys,
- $optional = NULL )
push_type為2,且正確設置tag_name 參數。詳情參考PHP-SDK使用手冊。
應用場景舉例
閱讀應用。對不同閱讀喜好的人群推送不同類別的新圖書廣告。
解決方案
應用提供喜好設置頁面,用戶勾選不同的類別,觸發對應Tag的設置。或者用戶閱讀了某個類別的圖書,觸發對應Tag的設置。在服務端,給特定類別圖書的Tag推送新書廣告。
4.使用自己的賬戶系統或百度賬戶
描述
開發者可以使用自己的賬戶體系開發應用,或者應用就是無賬戶的。開發者也可選擇使用百度賬戶作為應用賬戶系統的接入。
解決思路
(1)使用自己的賬戶系統或者無賬戶系統
這兩種情況,云推送都是無法理解賬戶信息的,所以對于云推送來說都屬于無賬戶體系。
云推送通過終端標識(channel id)和應用標識(APIKey)來唯一確定一個應用的一個特定端。應用的每個端都是不同的用戶,擁有不同的user id。 客戶端的綁定方式,用Android API舉例:
PushManager.startWork(Context, LOGIN_TYPE_API_KEY, apiKey)
(2)使用百度賬戶系統
云推送和百度賬戶系統是連通的,應用的所有用戶將使用百度的user id作為唯一標識。不同的端使用同一個用戶百度賬戶登錄,獲得的user id是一樣的。這種方式可以實現對用戶的多個端做消息推送。
百度賬戶的客戶端綁定使用用戶AccessToken作為驗證憑證,用戶AccessToken的獲得需要百度賬戶登錄界面的輔助,具體使用可以參看客戶端SDK demo或者百度賬號連接官方文檔。
同樣的,客戶端的綁定方式,用Android API舉例:
PushManager.startWork(Context, LOGIN_TYPE_ACCESS_TOKEN, UserAccessToken)
(2) 百度賬號連接官方文檔
5.單服務單通道的端上實現
云推送的Android SDK,是通過后臺service和socket長連接機制來實現的。從消息時效性、耗電量、網絡流量等因素考慮,這是目前最好的實現方式。
在同一臺設備安裝了多個使用推送的應用的情況下,如果每個應用都執行獨立的后臺service,且各自建立獨立的長連接,這無疑是系統資源的巨大浪費。內存使用、耗電量、網絡流量等關鍵因素都將以接近與應用數正比的倍數增長。
在這個背景下,云推送實現了單服務單通道的機制。同一臺設備上,云推送服務的資源消耗不受集成該服務的應用數量影響。任何時刻,只會運行一個后臺service和維持一個socket長連接。
應用的初始化、tag等接口調用,將通過intent方式發送到后臺運行的service處理。service接收到推送消息時,將根據消息中指定的發送對象,通過intent,以指定目標應用包名的方式,發送私有消息給應用。應用無法接收到不屬于自己的消息,也無法通過冒充截獲。
示意圖: