APNs全名是Apple Push Notification Service革娄。用iPhone的應(yīng)該都習(xí)慣了,每次安裝完一個(gè)新應(yīng)用啟動(dòng)后,幾乎都會(huì)彈出個(gè)警告框,“XXX應(yīng)用”想要給您發(fā)送推送通知焙压。這個(gè)警告框的權(quán)限申請(qǐng)就是為了APNs推送,用戶授權(quán)后抑钟,應(yīng)用提供商就可以通過APNs給用戶推送消息冗恨。
APNs的工作機(jī)制簡(jiǎn)單來說可以分為兩步,第一步是注冊(cè)推送服務(wù)從APNs獲取device token來告知應(yīng)用提供商服務(wù)端味赃,第二步是應(yīng)用提供商服務(wù)端通過APNs給設(shè)備推送消息,device token是作為設(shè)備的唯一標(biāo)示虐拓。
上圖就是device token生成的一個(gè)過程心俗。我們以第一次安裝啟動(dòng)360兒童衛(wèi)士應(yīng)用為例,首先應(yīng)用會(huì)彈出個(gè)警告框蓉驹,請(qǐng)求用戶允許發(fā)送推送通知城榛,用戶允許后–>兒童衛(wèi)士會(huì)向系統(tǒng)注冊(cè)推送服務(wù),系統(tǒng)接到注冊(cè)請(qǐng)求后就會(huì)自動(dòng)連接APNs服務(wù)器請(qǐng)求獲取設(shè)備令牌(即device token)–>APNs服務(wù)器生成包含device id的device token并下發(fā)給設(shè)備–>兒童衛(wèi)士接受到device token态兴,保存在本地同時(shí)發(fā)送給兒童衛(wèi)士服務(wù)器狠持,到此第一步就完成了。
上圖就是推送消息的示圖了瞻润,設(shè)備通過device token和APNs服務(wù)器保持連接狀態(tài)喘垂。還以360兒童衛(wèi)士為例,當(dāng)孩子到家了绍撞,兒童衛(wèi)士服務(wù)器就需要發(fā)到達(dá)提醒給家長(zhǎng)正勒。這時(shí)兒童衛(wèi)士服務(wù)器就會(huì)通過device token作為目的設(shè)備標(biāo)示來推送加密的到達(dá)提醒消息給APNs,APNs解密后再根據(jù)device token推送給指定設(shè)備傻铣。這樣章贞,一次推送就完成了。
了解了APNs工作機(jī)制非洲,很明顯能夠看到device token在其中起了至關(guān)重要的串聯(lián)指向作用鸭限。如果device token錯(cuò)誤或缺失,推送就無法送達(dá)目標(biāo)設(shè)備了两踏。所以測(cè)試也罷開發(fā)也好败京,都很有必要了解一下device token的一些特性:
1.每個(gè)device token都是唯一的,只會(huì)對(duì)應(yīng)一臺(tái)設(shè)備缆瓣。
2.device token與設(shè)備系統(tǒng)相關(guān)(注意不是和設(shè)備綁定的喧枷!詳解見后文),同一設(shè)備系統(tǒng)上不同應(yīng)用獲取的token是同一個(gè)隧甚。
3.應(yīng)用卸載重新安裝车荔,獲取到的device token不會(huì)變化,而且不會(huì)再?gòu)棾鐾扑蜋?quán)限申請(qǐng)的彈窗戚扳,會(huì)自動(dòng)繼承前一次安裝的設(shè)置信息忧便。這個(gè)特性容易引發(fā)一些安全問題,用戶卸載重新安裝一個(gè)應(yīng)用后帽借,還沒有登錄應(yīng)用珠增,就可能接到上次登錄帳號(hào)的推送消息了。我使用iPhone QQ和Skype都碰到過這種情況砍艾〉俳蹋客戶端沒有辦法處理這個(gè)問題,因?yàn)楸恍遁d時(shí)客戶端是沒法做出反應(yīng)來通知服務(wù)器的脆荷。蘋果有一個(gè)feedback的機(jī)制可以解決這個(gè)問題凝垛,蘋果為每個(gè)應(yīng)用程序維護(hù)了一個(gè)不斷更新的推送失敗的設(shè)備列表。服務(wù)端可以去定期檢查并更新推送設(shè)備列表蜓谋,這樣能解決大部分問題梦皮,也能減少不必要的報(bào)文開銷。
4.第三點(diǎn)客戶端不能處理桃焕,但退出登錄通知服務(wù)器就是客戶端的工作了剑肯。用戶退出登錄客戶端時(shí),客戶端應(yīng)該告知服務(wù)器观堂,停止對(duì)這個(gè)設(shè)備繼續(xù)推送用戶退出登錄帳號(hào)的消息了让网。這點(diǎn)應(yīng)該不算device token的特性了,是一個(gè)標(biāo)準(zhǔn)處理方法型将。
相信很多人都有這樣一個(gè)疑問寂祥,作為一個(gè)設(shè)備推送的唯一標(biāo)示,device token是否會(huì)變化或者過期呢七兜?蘋果在這點(diǎn)上有些含糊其辭丸凭,只是在官方文檔上建議開發(fā)者在每次啟動(dòng)應(yīng)用時(shí)應(yīng)該都向APNs獲取device token并上傳給服務(wù)器。從這句話來看腕铸,device token是會(huì)變化的惜犀,不然不用每次啟動(dòng)都去獲取。因?yàn)樘O果官方?jīng)]有給出明確的device token變化的情況狠裹,所以以下列舉的都是一些前人總結(jié)的經(jīng)驗(yàn)虽界,主要援引了stackoverflow上關(guān)于這個(gè)問題一個(gè)回答,回答者稱是和蘋果的一個(gè)工程師交流及自己實(shí)驗(yàn)得出的結(jié)果涛菠。
1.升級(jí)系統(tǒng)device token有可能變化莉御,確認(rèn)的是升級(jí)到iOS5會(huì)變化撇吞,猜測(cè)是升級(jí)大的系統(tǒng)版本后device token會(huì)變化。
2.抹掉所有內(nèi)容和設(shè)置礁叔,reset設(shè)備后牍颈,device token會(huì)變化。
3.恢復(fù)一個(gè)非本機(jī)的備份后琅关,device token會(huì)變化煮岁。
4.device token會(huì)過期,這個(gè)眾說紛紜涣易,有說是半年的画机,有說一年,有說兩年的新症,不過會(huì)過期應(yīng)該是確鑿的步氏。
5.備份或者恢復(fù)本機(jī)的備份,device token不會(huì)變化徒爹。
所以保險(xiǎn)起見戳护,按照蘋果的每次啟動(dòng)應(yīng)用時(shí)檢查device token并發(fā)送到服務(wù)器是比較穩(wěn)妥的做法。
來源:http://blogs.#/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/