什么是APNs
先說一下遠程推送,一般我們有自己的服務器,在這個過程中是Provider的角色,如圖,推送從我們的服務器到我們的APP的過程就是要通過APNs來發送
APNs(Apple Push Notification service)是遠程推送功能的核心,通過APNs客戶端和蘋果服務器建立一個長連接,推送也是通過這個長連接發送到客戶端上
deviceToken
deviceToken是設備的一個標識符,屬於你這款APP裝在你這個設備上的標識符,即每個APP在每一個不同的設備上都有着不同的deviceToekn,通過注冊遠程推送服務,APNs會返回給你的APP的deviceToken,如圖
在項目的AppDelegate里面有一個方法,如果成功注冊了便可以接收到deviceToken
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
deviceToken不是唯一確定的,當你的設備更新了系統然后deviceToken就會改變
安全架構
為了保證安全性,APNs用連接信任(connection trust)和token信任(token trust)來控制通信入口,你要用APNs則必須用通過這兩種驗證。
連接信任
連接信任第一個作用是保證APNs連接的provider是蘋果已經同意可通信的,然后第二個是保證與APNs連接的設備的合法性,第二步是APNs處理的,你所要處理的是provider與APNs之間的連接安全性。
服務器與APNs之間的連接信任
每個服務器都必須要有唯一的provider證書和私鑰,都是用來驗證連接的。provider證書就是在開發者官網申請的。
服務器通過TLS驗證和APNs連接,HTTPS中用的也是TLS協議,即四步握手,首先初始化TLS連接,即provider(服務器)發送請求給APNs,APNs服務器返回APNs證書(即公鑰)給provider,然后服務端收到后生成provider證書后再返回給APNs,APNs收到后驗證后即可以建立TLS連接,不過APNs用的不是HTTPS,而是HTTP/2,具體過程如下圖
APNs與設備之間的連接信任
設備和provider一樣,都有私鑰和設備證書,當設備激活了就保存在鑰匙串(keychain)中,但是這部分的連接信任你是不用管的,由APNs負責,也是通過TLS來驗證,過程和provider和APNs相同
Token信任
Token信任就是保證通知從合法的起點推送到合法的終點,Token信任即要用到上面說的deviceToken,deviceToken提供給provider,然后之后你的provider每次發送要推送的通知都要攜帶deviceToken,這就是token信任
APNs會用token鑰匙去保證通知來源(即你的服務器)的合法性,用包含在deviceTokenl里面的device ID去確定目標設備的身份,過程如下圖
參考資料
圖全部來自官方文檔,很多關鍵詞都是我自行翻譯