1. 程式人生 > >iOS 和 Android 推送功能實現

iOS 和 Android 推送功能實現

坦率得說,@郝培強 的回答是回答了IOS為啥要做統一的push機制,而非說明push是怎麼做的,這點很重要,但是也很容易理解,統一的push機制有助於大大節省系統開銷

至於手機的push機制,基本上有3種做法:
1. 採用socket常連線機制(郝培強答案的評論裡有人用到了http常連線這個詞,是不恰當的,因為http協議本身,是一個典型的請求-返回的偶連線模式,所有http下的推送基本都是依賴輪詢實現)。採用這種方式,其實要求TCP/IP一直處在連通的方式,對於3G來說的話,耗電開銷太大。同時,要處理關於斷線重連以及IP註冊的問題(手機端得是socket server),所以這種方式採用的比較少,我個人所做過或者見過的案例中,只有我在順豐做的專案裡採用了這種方式,因為他們是效率和服務質量第一的要求,快遞員隨身攜帶多塊備用電池(他們還只是使用GPRS,沒有3G耗電厲害) 多數情況下,是一個所謂的push-alert機制以保證push協議的可複用性

2. 輪詢機制:這種方式是主流,包括IOS採用的也是一樣,輪詢有兩個要點,第一是伺服器負荷問題,第二是輪詢間隔決定推送的及時性,兩者基本處在一個矛盾體中。當然,輪詢間隔可以不是固定的數值,可以通過演算法形成動態值,以期達到最優

3. 控制通道push:不利用tcpip,而是利用底層的行動通訊的控制通道進行push(就是呈現我們手機是哪家訊號,是否有電話呼入,是否註冊在網的那個通道),簡訊也是走的這個通道,我們通常可以看到的通過簡訊push-alert機制,或者BB的push機制都是這樣的機制。而BB這樣的做法,是一定要和運營商深度合作才能夠實現的,這也是BB目前銷售運營模式的要點。

===========================
@鍾錕 既然很多人提及,我就加以小段,說說輪詢
輪詢不一定是定時定週期的輪詢,可以和特定的演算法,操作,結合,在一些應用的情況下,可以讓人感覺到是及時的更新,這並不難。好的輪詢一定是掌控網路聯接控制,系統訊息捕獲的,例如螢幕解鎖時插入一次輪詢,使用WIFI時降低輪詢週期等等,這些東西都是第三方開發者無法做到的,所以IOS的推送一定是要apple自己來提供比較好。

而云服務相比推送通知來說,要相對簡單一些,因為雲服務的推送的內容,很多是在特定應用啟動以後才需要使用的,可以在應用內部做文章,所以輪詢可以做得更方便一些(拿通訊錄為例,可以在啟動通訊錄的時候插入一個雲端輪詢同步,甚至可以在手指滑動或者搜尋的時候加入雲端查詢同步),這樣會讓人感覺及時性很高。而通知通常是在應用執行之前到達,使用者的行為更不好判斷,情況更多,所以麻煩一些。
簡單說個輪詢演算法的思路:
設定一個最小的輪詢間隔,例如5秒,也就是說不能無休止的新增輪詢密度,這個數字一般感覺是使用者在此係統和使用環境下2~3次正常單次操作-響應過程的時間,這樣對於一般的使用者體驗來說會比較能夠接受。
再設定一個基本輪詢週期,例如15分鐘
然後可以開始設定一堆的rule,用來插入輪詢,降低或升高輪詢週期
例如解鎖螢幕,插入一次輪詢,
手機處在使用狀態,輪詢週期降到3分鐘一次
1分鐘內發生過3次高密度推送的,暫時降低輪詢週期到30秒
啟動特定應用(例如註冊了推送的應用),插入一次輪詢

等等,只要不違反最小輪詢間隔即可,這些RULE需要很長一段時間根據應用的實際情況進行優化,以最大程度提升使用者感受,新的RULE可以加入,老的RULE可以去除,RULE的引數可以調整。