以下所有內(nèi)容均為個(gè)人觀點(diǎn),轉(zhuǎn)載請注明出處<簡書--小蝸牛吱呀之悠悠 >,謝謝陨收!
工作的某一天,線上APP的推送服務(wù)突然失效了鸵赖,源于解決這個(gè)問題务漩,整理歸納一下APNS推送和證書的底層邏輯。
一它褪、推送的簡單流程
推送大致流程如上圖所示饵骨,簡單來說是服務(wù)端將消息發(fā)送給APNS,然后由APNS將消息推送給手機(jī)茫打,在手機(jī)收到消息后進(jìn)行進(jìn)一步的處理居触,最后展示出來妖混。這個(gè)流程包括了第三方推送(個(gè)推、極光轮洋、友盟等)制市,只是第三方推送在圖中第一第二環(huán)節(jié)增加了處理,代替我們自己的服務(wù)端去和蘋果交互弊予。另外祥楣,圖中所示的Extension環(huán)節(jié)是推送消息在手機(jī)展示前,由APP開發(fā)者進(jìn)行處理的最后一環(huán)節(jié)汉柒,可以修改展示的內(nèi)容荣堰,包括文字、增加圖片等竭翠,如果想要進(jìn)一步了解這個(gè)環(huán)節(jié)的實(shí)現(xiàn)步驟,可以參考我另一篇文章iOS極光推送帶圖片模式
二薇搁、各環(huán)節(jié)具體做了什么事情
前面我們簡單介紹了一下推送的基本流程斋扰,這一節(jié)我們具體聊聊每一個(gè)環(huán)節(jié)到底做了什么,是如何將消息一個(gè)環(huán)節(jié)一個(gè)環(huán)節(jié)成功傳遞的啃洋。
1传货、推送證書的原理
我們都知道,要實(shí)現(xiàn)iOS的消息推送宏娄,需要準(zhǔn)備好推送證書问裕,并且開啟推送服務(wù)。現(xiàn)在我們來簡單回顧一下推送證書是如何申請的孵坚。
首先粮宛,我們需要從鑰匙串中申請一個(gè)CSR文件
申請步驟:打開鑰匙串,如下圖:
填寫信息后就可以生成如下圖所示的CSR文件
然后找到蘋果開發(fā)者網(wǎng)站中創(chuàng)建證書的地方卖宠,將CSR上傳巍杈,并創(chuàng)建證書,然后將證書下載下來安裝即可扛伍。
在上述環(huán)節(jié)中筷畦,涉及到兩個(gè)東西(CSR文件、.cer后綴的推送證書)刺洒,這兩個(gè)文件里面是什么鳖宾?有什么作用?
蘋果官方有一對密鑰逆航,私鑰在蘋果后臺(tái)鼎文,公鑰在iOS系統(tǒng)中(出廠后就已經(jīng)攜帶),姑且稱作公鑰(iOS)纸泡、私鑰(iOS)漂问;
在MAC中請求CSR文件時(shí)赖瞒,會(huì)生成一對公鑰(mac)、私鑰(mac)蚤假。
生成CSR的時(shí)候栏饮,由MAC創(chuàng)建公私鑰,并將公鑰(mac)放入CSR磷仰,當(dāng)我們將CSR文件上傳到開發(fā)者平臺(tái)時(shí)袍嬉,蘋果會(huì)用私鑰(iOS)對公鑰(mac)進(jìn)行簽名,生成.cer證書文件灶平。也就是說伺通,CSR攜帶公鑰(mac),.cer證書包含了加密后的CSR和一些其他的權(quán)限信息逢享。
那推送證書在推送的過程是怎么發(fā)揮作用的呢罐监?在理解這個(gè)問題之前,我們先了解一下app是怎么安裝到手機(jī)上的瞒爬。
2弓柱、APP安裝時(shí)簽名、驗(yàn)簽過程
1侧但、首先矢空,在使用Xcode對APP進(jìn)行打包的時(shí)候,會(huì)用私鑰(mac)對包進(jìn)行簽名禀横,然后把描述文件一起放到包里屁药。
由于發(fā)布APP需要發(fā)布證書(product.cer),根據(jù)我們前面的介紹柏锄,這個(gè)證書也是攜帶了CSR的酿箭,并且是被私鑰(iOS)加密的。
2绢彤、在完成第一步后七问,Xcode會(huì)將發(fā)布證書、設(shè)備信息茫舶、APPID等內(nèi)容一并使用私鑰(iOS)再加密簽名一次
3械巡、最后,將步驟1饶氏、步驟2的產(chǎn)物一起組成ipa包讥耗,然后發(fā)布到App Store。
4疹启、當(dāng)用戶下載APP安裝時(shí)古程,手機(jī)會(huì)用出廠時(shí)就攜帶的公鑰(iOS)對ipa包解密(步驟2的產(chǎn)物兩次解密),得到步驟1的產(chǎn)物喊崖、發(fā)布證書挣磨、設(shè)備信息等內(nèi)容雇逞。
到這里,一個(gè)ipa包被拆解為這些內(nèi)容:用私鑰(mac)對.app包簽名后的描述文件茁裙、用私鑰(iOS)對CSR簽名的證書塘砸。
5、用公鑰(iOS)對證書解簽晤锥,得到CSR掉蔬,并從CSR文件中拿到公鑰(mac)
6、用步驟5得到的公鑰(mac)再去解簽描述文件矾瘾,得到.app包女轿。
在上述過程中,公私鑰(iOS)主要起到蘋果授權(quán)的作用壕翩,公私鑰(mac)主要起到校驗(yàn)包是否被篡改的作用蛉迹。
3、推送是如何通信鑒權(quán)的
了解了APP安裝的流程后放妈,我們知道婿禽,在APP打包過程,會(huì)將證書等信息放到包里進(jìn)行加密大猛,推送證書也就是這個(gè)環(huán)節(jié)被放到了包里。那么推送是怎么完成閉環(huán)的呢淀零?接下來我們看下面這張圖:
完成完整的推送挽绩,大致有下面幾個(gè)環(huán)節(jié):
步驟一:啟動(dòng)APP時(shí),通常會(huì)去請求推送權(quán)限驾中,當(dāng)用戶點(diǎn)擊允許后唉堪,手機(jī)就會(huì)拿著設(shè)備標(biāo)識(shí)、推送證書發(fā)送給APNS服務(wù)器肩民,蘋果收到這些信息后唠亚,會(huì)根據(jù)推送證書、設(shè)備標(biāo)識(shí)持痰、APP信息去驗(yàn)證是否具有推送權(quán)限灶搜,如果有推送權(quán)限,蘋果會(huì)將這臺(tái)設(shè)備信息放入推送列表中工窍。
步驟二:在蘋果通過權(quán)限校驗(yàn)后割卖,會(huì)根據(jù)設(shè)備標(biāo)識(shí)和APP標(biāo)識(shí)生成一個(gè)deviceToken,并將這個(gè)deviceToken返回給APP患雏。
步驟三:deviceToken送達(dá)手機(jī)后鹏溯,會(huì)在APP中的下述方法告知開發(fā)者
-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken
當(dāng)這個(gè)方法回調(diào)時(shí)攜帶deviceToken后,根據(jù)接入推送服務(wù)的不同淹仑,可以分為自己服務(wù)器和第三方服務(wù)器丙挽。如果是自己的服務(wù)器實(shí)現(xiàn)推送(七魚)肺孵,則將deviceToken直接傳給后端即可;如果是接入了第三方SDK颜阐,則傳給第三方服務(wù)商的后端平窘,后續(xù)的推送則由第三方完成
步驟四:當(dāng)服務(wù)器有消息需要推送給APP時(shí),服務(wù)器會(huì)攜帶推送證書和推送的消息體去通知APNS(如果是第三方推送瞬浓,由服務(wù)器推送消息給第三方后端初婆,由第三方去連接APNS)。
步驟五:APNS收到需要推送的消息后猿棉,對攜帶的證書進(jìn)行鑒權(quán)磅叛,如果通過,則根據(jù)APNS的推送規(guī)則萨赁,將消息下發(fā)給手機(jī)弊琴。
步驟六:當(dāng)手機(jī)收到來自蘋果的推送消息后,在展示前會(huì)先判斷開發(fā)者是否有實(shí)現(xiàn)推送消息攔截杖爽,如果沒有敲董,則直接展示;如果有實(shí)現(xiàn)攔截慰安,則交給開發(fā)者處理腋寨。
三、證書被刪或者過期
如果無意之中把推送證書刪了化焕,或者是證書過期失效了萄窜,這時(shí)候該怎么辦?
首先需要將原有的無效的證書清理干凈撒桨,并在開發(fā)者中心找到你APP的標(biāo)識(shí)
進(jìn)入到自己APP的服務(wù)列表里查刻,找到推送服務(wù),重新編輯或者創(chuàng)建證書
接下來的步驟就和上文中提到的步驟一模一樣了凤类。