蘋果APNs’ device token特性和過期更新

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并發送到服務器是比較穩妥的做法。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 本文是翻譯的 APNs 的官方說明 自己英文不是太好,花了不少時間來翻譯,其實之前我是看不進去的。后來發現,只要你...
    KyleBing閱讀 1,857評論 0 0
  • 來源:崔江濤的博客 概述在多數移動應用中任何時候都只能有一個應用程序處于活躍狀態,如果其他應用此刻發生了一些用戶感...
    李棲桐閱讀 939評論 0 0
  • 什么是APNS? 蘋果推送通知服務(APNs)是推送通知的網關,iPhone ipad 對于應用程序在后臺運行有諸...
    CoderZS閱讀 1,478評論 0 11
  • 概述 在多數移動應用中任何時候都只能有一個應用程序處于活躍狀態,如果其他應用此刻發生了一些用戶感興趣的那么通過通知...
    莫離_焱閱讀 6,571評論 1 8
  • 我兩天前已經跟領導說本周末我有重要的事情,加不了班了 可是,他今天在群里讓我明天加班,然后我在群里@了他,又跟他說...
    Anna娜閱讀 323評論 1 1