標籤:
APNs全名是Apple Push Notification Service。用iPhone的應該都習慣了,每次安裝完一個新應用啟動後,幾乎都會彈出個警告框,“XXX應用”想要給您發送推播通知。這個警告框的許可權申請就是為了APNs推送,使用者授權後,應用供應商就可以通過APNs給使用者推送訊息。
APNs的工作機制簡單來說可以分為兩步,第一步是註冊推送服務從APNs擷取device token來告知應用供應商服務端,第二步是應用供應商服務端通過APNs給裝置推送訊息,device token是作為裝置的唯一標示。
就是device token產生的一個過程。我們以第一次安裝啟動360兒童衛士應用為例,首先應用會彈出個警告框,請求使用者允許發送推播通知,使用者允許後–>兒童衛士會向系統註冊推送服務,系統接到註冊請求後就會自動連接APNs伺服器請求擷取裝置令牌(即device token)–>APNs伺服器產生包含device id的device token並下發給裝置–>兒童衛士接受到device token,儲存在本地同時發送給兒童衛士伺服器,到此第一步就完成了。
就是推送訊息的示圖了,裝置通過device token和APNs伺服器保持串連狀態。還以360兒童衛士為例,當孩子到家了,兒童衛士伺服器就需要發到達提醒給家長。這時兒童衛士伺服器就會通過device token作為目的裝置標示來推送加密的到達提醒訊息給APNs,APNs解密後再根據device token推送給指定裝置。這樣,一次推送就完成了。
瞭解了APNs工作機制,很明顯能夠看到device token在其中起了至關重要的串聯指向作用。如果device token錯誤或缺失,推送就無法傳遞的目標裝置了。所以測試也罷開發也好,都很有必要瞭解一下device token的一些特性:
1.每個device token都是唯一的,只會對應一台裝置。
2.device token與裝置系統相關(注意不是和裝置綁定的!詳解見後文),同一裝置系統上不同應用擷取的token是同一個。
3.應用卸載重新安裝,擷取到的device token不會變化,而且不會再彈出推送許可權申請的彈窗,會自動繼承前一次安裝的設定資訊。這個特性容易引發一些安全問題,使用者卸載重新安裝一個應用後,還沒有登入應用,就可能接到上次登入帳號的推送訊息了。我使用iPhone QQ和Skype都碰到過這種情況。用戶端沒有辦法處理這個問題,因為被卸載時用戶端是沒法做出反應來通知伺服器的。蘋果有一個feedback的機制可以解決這個問題,蘋果為每個應用程式維護了一個不斷更新的推送失敗的裝置列表。服務端可以去定期檢查並更新推送裝置列表,這樣能解決大部分問題,也能減少不必要的報文開銷。
4.第三點用戶端不能處理,但退出登入通知伺服器就是用戶端的工作了。使用者退出登入用戶端時,用戶端應該告知伺服器,停止對這個裝置繼續推送使用者退出登入帳號的訊息了。這點應該不算device token的特性了,是一個標準處理方法。
相信很多人都有這樣一個疑問,作為一個裝置推送的唯一標示,device token是否會變化或者到期呢?蘋果在這點上有些含糊其辭,只是在官方文檔上建議開發人員在每次啟動應用時應該都向APNs擷取device token並上傳給伺服器。從這句話來看,device token是會變化的,不然不用每次啟動都去擷取。因為蘋果官方沒有給出明確的device token變化的情況,所以以下列舉的都是一些前人總結的經驗,主要援引了stackoverflow上關於這個問題一個回答,回答者稱是和蘋果的一個工程師交流及自己實驗得出的結果。
1.升級系統device token有可能變化,確認的是升級到iOS5會變化,猜測是升級大的系統版本後device token會變化。
2.抹掉所有內容和設定,reset裝置後,device token會變化。
3.恢複一個非原生備份後,device token會變化。
4.device token會到期,這個眾說紛紜,有說是半年的,有說一年,有說兩年的,不過會到期應該是確鑿的。
5.備份或者恢複原生備份,device token不會變化。
所以保險起見,按照蘋果的每次啟動應用時檢查device token並發送到伺服器是比較穩妥的做法。
來源:http://blogs.360.cn/360qtest/2014/03/24/%E8%8B%B9%E6%9E%9Capns-device-token%E7%89%B9%E6%80%A7%E5%92%8C%E8%BF%87%E6%9C%9F%E6%9B%B4%E6%96%B0/
蘋果APNs’ device token特性和到期更新