APNS推送原理及證書鑒權(quán)

以下所有內(nèi)容均為個(gè)人觀點(diǎn),轉(zhuǎn)載請注明出處<簡書--小蝸牛吱呀之悠悠 >,謝謝!

工作的某一天,線上APP的推送服務(wù)突然失效了,源于解決這個(gè)問題,整理歸納一下APNS推送和證書的底層邏輯。

一、推送的簡單流程

image.png

推送大致流程如上圖所示,簡單來說是服務(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ù)?,F(xiàn)在我們來簡單回顧一下推送證書是如何申請的。
首先,我們需要從鑰匙串中申請一個(gè)CSR文件
申請步驟:打開鑰匙串,如下圖:


iCSR申請.png

填寫信息后就可以生成如下圖所示的CSR文件


CSR文件

然后找到蘋果開發(fā)者網(wǎng)站中創(chuàng)建證書的地方,將CSR上傳,并創(chuàng)建證書,然后將證書下載下來安裝即可。
image.png
    在上述環(huán)節(jié)中,涉及到兩個(gè)東西(CSR文件、.cer后綴的推送證書),這兩個(gè)文件里面是什么?有什么作用?
    蘋果官方有一對密鑰,私鑰在蘋果后臺,公鑰在iOS系統(tǒng)中(出廠后就已經(jīng)攜帶),姑且稱作公鑰(iOS)、私鑰(iOS);

在MAC中請求CSR文件時(shí),會生成一對公鑰(mac)、私鑰(mac)。

生成CSR的時(shí)候,由MAC創(chuàng)建公私鑰,并將公鑰(mac)放入CSR,當(dāng)我們將CSR文件上傳到開發(fā)者平臺時(shí),蘋果會用私鑰(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í)候,會用私鑰(mac)對包進(jìn)行簽名,然后把描述文件一起放到包里。

由于發(fā)布APP需要發(fā)布證書(product.cer),根據(jù)我們前面的介紹,這個(gè)證書也是攜帶了CSR的,并且是被私鑰(iOS)加密的。
2、在完成第一步后,Xcode會將發(fā)布證書、設(shè)備信息、APPID等內(nèi)容一并使用私鑰(iOS)再加密簽名一次

3、最后,將步驟1、步驟2的產(chǎn)物一起組成ipa包,然后發(fā)布到App Store。

4、當(dāng)用戶下載APP安裝時(shí),手機(jī)會用出廠時(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打包過程,會將證書等信息放到包里進(jìn)行加密,推送證書也就是這個(gè)環(huán)節(jié)被放到了包里。那么推送是怎么完成閉環(huán)的呢?接下來我們看下面這張圖:


image.png

完成完整的推送,大致有下面幾個(gè)環(huán)節(jié):

步驟一:啟動(dòng)APP時(shí),通常會去請求推送權(quán)限,當(dāng)用戶點(diǎn)擊允許后,手機(jī)就會拿著設(shè)備標(biāo)識、推送證書發(fā)送給APNS服務(wù)器,蘋果收到這些信息后,會根據(jù)推送證書、設(shè)備標(biāo)識、APP信息去驗(yàn)證是否具有推送權(quán)限,如果有推送權(quán)限,蘋果會將這臺設(shè)備信息放入推送列表中。

步驟二:在蘋果通過權(quán)限校驗(yàn)后,會根據(jù)設(shè)備標(biāo)識和APP標(biāo)識生成一個(gè)deviceToken,并將這個(gè)deviceToken返回給APP。

步驟三:deviceToken送達(dá)手機(jī)后,會在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ù)器會攜帶推送證書和推送的消息體去通知APNS(如果是第三方推送,由服務(wù)器推送消息給第三方后端,由第三方去連接APNS)。

步驟五:APNS收到需要推送的消息后,對攜帶的證書進(jìn)行鑒權(quán),如果通過,則根據(jù)APNS的推送規(guī)則,將消息下發(fā)給手機(jī)。

步驟六:當(dāng)手機(jī)收到來自蘋果的推送消息后,在展示前會先判斷開發(fā)者是否有實(shí)現(xiàn)推送消息攔截,如果沒有,則直接展示;如果有實(shí)現(xiàn)攔截,則交給開發(fā)者處理。

三、證書被刪或者過期

如果無意之中把推送證書刪了,或者是證書過期失效了,這時(shí)候該怎么辦?
首先需要將原有的無效的證書清理干凈,并在開發(fā)者中心找到你APP的標(biāo)識


image.png

進(jìn)入到自己APP的服務(wù)列表里,找到推送服務(wù),重新編輯或者創(chuàng)建證書


image.png

接下來的步驟就和上文中提到的步驟一模一樣了。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容