推送是解決輪詢所造成的流量消耗和電量消耗的一個比較好的解決方案,在Android上,雖然Google提供了GCM(之前為C2DM),但在國內基本等於沒用,各大Android應用基本都自己架設推送Server或是使用第三方推送平台,例如新浪微博使用第三方推送平台“個推”(非廣告)。今天要學習的是蘋果提供的推送服務APNs(Apple Push Notification services)基本原理和工作流程。
蘋果的推送服務APNs基本原理簡單來說就是蘋果利用自己專門的推送服務器(APNs)接收來自我們自己應用服務器的需要被推送的信息,然後推送到指定的iOS設備上,然後由設備通知到我們的應用程序,設備以通知或者聲音的形式通知用戶有新的消息。推送的前提是裝有我們應用的設備需要向APNs服務器注冊,注冊成功後APNs服務器會返給我們一個device_token,拿到這個token後我們將這個token發給我們自己的應用服務器,當有需要被推送的消息時,我們的應用服務器會將消息按指定的格式打包,然後結合設備的device_token一並發給APNs服務器,由於我們的應用和APNs維持一個基於TCP的長連接,APNs將新消息推送到我們設備上,然後在屏幕上顯示出新消息來。整個過程基本就這樣,下面我們看一下設備注冊APNs的流程圖:
上圖完成了如下步驟:
1.Device連接APNs服務器並攜帶設備序列號
2.連接成功,APNs經過打包和處理產生device_token並返回給注冊的Device
3.Device攜帶獲取的device_token向我們自己的應用服務器注冊
4.完成需要培推送的Device在APNs服務器和我們自己的應用服務器注冊
執行順序如下所示:
這裡要提到的一點是,我們的設備和APNS服務器之間的通訊是基於SSL協議的TCP流通訊,二者之間維持一個長連接,當從APNS服務器注冊成功後,一定要將device_token發送給我們的應用服務器,因為在推送過程中,首相是由我們的應用服務器(上圖中Provider)將需要推送的消息結合device_token按指定格式(後面會提到)打包然後發送給APNS服務器,然後由APNS服務器推送給我們的設備。
好了,注冊設備的過程完成了,接下來就是如何推送了:
推送的過程經過如下步驟:
1.首先,安裝了具有推送功能的應用,我們的設備在有網絡的情況下會連接蘋果推送服務器,連接過程中,APNS會驗證device_token,連接成功後維持一個長連接;
2.Provider(我們自己的服務器)收到需要被推送的消息並結合被推送設備的device_token一起打包發送給APNS服務器;
3.APNS服務器將推送信息推送給指定device_token的設備;
4.設備收到推送消息後通知我們的應用程序並顯示和提示用戶(聲音、彈出框)
比較直觀的流程參照下圖:
上圖顯示了我們的應用服務器將消息推送到我們的App的完整路徑,其實真正完成推送的是APNS服務器,我們自己的應用服務器只是將需要推送的消息告訴蘋果服務器,至於如何維護消息隊列或如何保證消息能被推送到指定的設備上,這些都由蘋果APNS給我們做完了。
上面提到了將device_token和推送消息打包的過程,那麼,接下來就看看這個信息包結構是怎樣的:
上圖顯示的這個消息體就是我們的服務器(Provider)發送給APNS服務器的消息結構,APNS驗證這個結構正確並提取其中的信息後,再將消息推送到指定的設備。這個結構體包括五個部分,第一個部分是命令標示符,第二個部分是我們的device_token的長度,第三部分是我們的device_token字符串,第四部分是推送消息體(Payload)的長度,最後一部分也就是真正的消息內容了,裡面包含了推送消息的基本信息,比如消息內容,應用Icon右上角顯示多少數字以及推送消息到達時所播放的聲音等。接下來我們拆解看一下Payload(消息體)的結構:
這其實就是個JSON結構體,alert標簽的內容就是會顯示在用戶手機上的推送信息,badge顯示的數量(注意是整型)是會在應用Icon右上角顯示的數量,提示有多少條未讀消息等,sound就是當推送信息送達是手機播放的聲音,傳defalut就標明使用系統默認聲音,如果傳比如“beep.wav”就會播放在我們應用工程目錄下名稱為beep.wav的音頻文件,比如當手機鎖屏時QQ在後台收到新消息時的滴滴聲。
有這麼一種情況,當我們將應用從設備卸載後,推送的消息改如何處理呢。我們知道,當我們將應用從設備卸載後,我們是收不到Provider給我們推送的消息的,但是,如何讓APNS和Provider都知道不去向這台卸載了應用的設備推送消息呢?針對這個問題,蘋果也已經幫我們解決了,那就是Feedback service。他是APNS的一部分,APNS會持續的更新Feedback service的列表,當我們的Provider將信息發給APNS推送到我們的設備時,如果這時設備無法將消息推送到指定的應用,就會向APNS服務器報告一個反饋信息,而這個信息就記錄在feedback service中。按照這種方式,Provider應該定時的去檢測Feedback service的列表,然後刪除在自己數據庫中記錄的存在於反饋列表中的device_token,從而不再向這些設備發送推送信息。連接Feedback service的過程同樣使用Socket的方式,連接上後,直接接收由APNS傳輸給我們的反饋列表,傳輸完成後斷開連接,然後我們根據這個最新的反饋列表在更新我們自己的數據庫,刪除那些不再需要推送信息的設備的device_token。從Feedback service讀取的數據結構如下:
結構中包含三個部分,第一部分是一個時間戳,記錄的是設備失效後的時間信息,第二個部分是device_token的長度,第三部分就是失效的device_token,我們所要獲取的就是第三部分,跟我們的數據庫進行對比後,刪除對應的device_token,下次不再向這些設備發送推送信息。
本篇主要介紹了蘋果推送機制APNS的基本原理和響應的組件及服務,下篇將介紹如何在我們自己的項目中集成APNS服務實現消息的推送!