在當今資訊爆炸的時代,人們對於充斥在身邊的各種資訊、資訊幾乎都有些麻木了。大量無關的甚至是垃圾資訊不斷騷擾人們的神經,因此個人化、社交化的應用也是大行其道。比如一些新聞用戶端,會根據使用者的使用習慣或訂閱要求,每隔一段時間或當特定新聞發生時向使用者發送指定的新聞內容;再比如常用的一些即時通訊軟體如、米聊、GTalk、個信等,都是可以即時地將私密資訊送到使用者的終端。這背後用到的技術就是訊息的推送。
本文討論的訊息推送特指從伺服器端向移動終端裝置進行特定格式資訊流傳遞的過程。 與傳統伺服器端到伺服器端通訊最大的區別就在於移動終端的不確定性。舉個生活中的例子,伺服器端好比是北京的“水立方”遊泳館,聞名遐邇,有明確而且固定的地址(IP或網域名稱),大家要遊覽(訪問)“水立方”可以很方便的找到她。但是反過來,“水立方”要想找到某個具體的“遊客”就很難了,因為每個“遊客”沒有確定的地址(每次登入網路都可能變更IP)。
怎樣才能隨時找到散落各處的“遊客”呢?移動運營服務商提供了一個有效途徑-SMS。通過移動終端的唯一標識(手機號碼),電訊廠商可以在網路允許的情況下,隨時隨地找到某個終端使用者,並且提供語音和簡訊息服務。看來這個問題似乎可以圓滿解決了!可是有兩座大山擋在了開發人員面前。其一,號碼資源作為電訊廠商的壟斷資本不會輕易開放出來,事實上在android手機上要想繞開電訊廠商獲得手機號碼絕不容易;其二,簡訊內容的攔截、解析與匹配本身技術門檻較高,並且日益受到各類安全軟體的監控和限制,對於開發人員來說實在不是一種合適的選擇。
既然此路不易走,有沒有其他便捷的選擇呢?答案是肯定的,而且也很容易實現。我們回頭再看,既然伺服器端找到用戶端不容易,而用戶端找到伺服器端很容易,那麼就可以讓訊息推送的過程反轉過來。首先由用戶端來定時訪問伺服器端,建立某種聯絡(通常為http請求)。之後,伺服器端就可以輕鬆地將資訊通過這種聯絡通道發給用戶端了。這就是通常說的輪詢模式。這種模式比較實現成本較低,但具體到移動終端裝置上,卻存在致命缺陷:高頻的輪詢導致流量和電量消耗極高,低頻的輪詢又會導致訊息的及時性很差。
說了兩種方式,結果都有這樣那樣的缺陷。有沒有更好一些的實現方式呢?的確是有的,而且android的競爭者蘋果已經很好地實現了這種方式-持久化串連。蘋果資訊推送服務(Apple Push Notification Service)提供了蘋果移動終端與伺服器端的長串連,通過這條通路,伺服器端可以即時找到某個移動終端,自然也就可以推送訊息了。同樣地,在android系統上也可以實作類別似蘋果APNS的推送機制。目前主流的實現協議包括:C2DM、XMPP和XQTT等。關於Android上幾種主流持久化串連推送方式的詳細介紹,將會在後續文章中陸續提供。同時,國內外的一些技術公司,也看準了android資訊推送的廣闊市場,將這些協議進行封裝、改造,形成了各具特色的android推送解決方案,比如國外的airpush、pubnub,國內的蝴蝶、個推等。開發人員想要快速獲得android上的資訊推送能力,也可以考慮整合這些廠商的SDK。