首先是簡單了解APNS的推送機(jī)制
蘋果官方給出的對ios推送機(jī)制的解釋,見圖:

Provider就是我們自己程序的后臺服務(wù)器,APNS是Apple Push Notification Service的縮寫,也就是蘋果的推送服務(wù)器。上圖可以分為三個階段:第一階段:應(yīng)用程序的服務(wù)器端把要發(fā)送的消息、目的iPhone的標(biāo)識打包,發(fā)給APNS。第二階段:APNS在自身的已注冊Push服務(wù)的iPhone列表中,查找有相應(yīng)標(biāo)識的iPhone,并把消息發(fā)送到iPhone。第三階段:iPhone把發(fā)來的消息傳遞給相應(yīng)的應(yīng)用程序,并且按照設(shè)定彈出Push通知。
APNS推送通知的詳細(xì)工作流程
下面這張圖是說明APNS推送通知的詳細(xì)工作流程:

根據(jù)圖片我們可以概括一下:
1、應(yīng)用程序注冊APNS消息推送。
2、iOS從APNS Server獲取devicetoken,應(yīng)用程序接收device token。
3、應(yīng)用程序?qū)evice token發(fā)送給程序的PUSH服務(wù)端程序。
4、服務(wù)端程序向APNS服務(wù)發(fā)送消息。
5、APNS服務(wù)將消息發(fā)送給iPhone應(yīng)用程序。
一、 CSR文件
首先我們要有生成一個Certificate Signing Request(也就是CSR)的請求文件。
在應(yīng)用程序里的使用工具中找到鑰匙串訪問。選擇從證書頒發(fā)機(jī)構(gòu)請求證書

填上你的郵箱和常用名,常用名要記一下,一會會用到。然后選擇保存到磁盤,保存位置在桌面,點擊存儲。
到這里點擊完成后我們會在桌面上看到一個CertificateSigningRequest.certSigningRequest的請求文件,也就是我們說的CSR文件。在我們生成CSR文件的同時,會在鑰匙串訪問中生成一對秘鑰,名稱為剛才我們填寫的常用名.
二、 下載開發(fā)證書和發(fā)布證書
到https://developer.apple.com/devcenter/ios/index.action登錄后,在右側(cè)的ios Developer Program里點擊iOS Provisioning Portal。
進(jìn)入下一級頁面后在左側(cè)選擇Certificates
這里不詳細(xì)介紹生成 Cer證書的步驟了,默認(rèn)大家都會了。生成后下載對應(yīng)的證書到我們的桌面,可以新建一個文件夾,存儲對應(yīng)的開發(fā)證書和生產(chǎn)證書,然后雙擊它們會在鑰匙串內(nèi)生成證書。
三、 導(dǎo)出證書所對應(yīng)的private key生成P12文件

至此我們一共生成了三個文件。一個是CSR請求文件,一個是aps_development .cer的SSL證書文件,還有一個剛才生成的Push.p12秘鑰文件?,F(xiàn)在我們的準(zhǔn)備工作已經(jīng)做完了。要開始對生成的文件進(jìn)行處理了。原因上面已經(jīng)解釋過,因為我們的服務(wù)鏈接蘋果服務(wù)器也是需要證書的,但是我們直接生成的證書windows系統(tǒng)(我們一般的服務(wù)器都是win系統(tǒng)的)是不識別的,所以我們需要生成一個后綴為pem的帶證書帶秘鑰的文件。
四、 處理證書
1、把.cer的SSL證書轉(zhuǎn)換為.pem文件,執(zhí)行命令:
openssl x509 -in aps_development.cer -inform der -out PushChatCert.pem
在桌面上會生成一個PushChatCert.pem文件

2、把私鑰Push.p12文件轉(zhuǎn)化為.pem文件:
openssl pkcs12 -nocerts -out PushChatKey.pem -in Push.p12
這里需要我們輸入密碼,這個密碼也就是我們導(dǎo)出p12文件時的密碼,也就是我們上面導(dǎo)出P12文件時設(shè)置的密碼,可以不設(shè)置。然后,桌面上又會生成一個PushChatKey.pem文件。

3、對生成的這兩個pem文件再生成一個pem文件,來把證書和私鑰整合到一個文件里:
cat PushChatCert.pem PushChatKey.pem > ck.pem
生成ck.pem文件
這樣,我們的文件就制作完了。下面進(jìn)入測試階段
為了測試證書是否工作,執(zhí)行下面的命令:
telnet gateway.sandbox.push.apple.com 2195
它將嘗試發(fā)送一個規(guī)則的,不加密的連接到APNS服務(wù)。如果你看到上面的反饋,那說明你的MAC能夠到達(dá)APNS。按下Ctrl+C關(guān)閉連接。如果得到一個錯誤信息,那么你需要確保你的防火墻允許2195端口。一般這里都不會出現(xiàn)什么問題。
下面我們要使用我們生成的SSL證書和私鑰來設(shè)置一個安全的鏈接去鏈接蘋果服務(wù)器:
openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert PushChatCert.pem -key PushChatKey.pem
執(zhí)行完這一句命令后需要我們輸入密語
Enter pass phrase for PushChatKey.pem:
我們輸入abcabc按回車
你會看到一個完整的輸出,讓你明白OpenSSL在后臺做什么。如果鏈接是成功的,你可以隨便輸入一個字符,按下回車,服務(wù)器就會斷開鏈接,如果建立連接時有問題,OpenSSL會給你返回一個錯誤信息。
當(dāng)你在最后的時候你看到這樣說明你已經(jīng)成功了:
CONNECTED(00000003)
depth=1 /C=US/O=Entrust, Inc./OU=www.entrust.net/rpa isincorporated by reference/OU=(c) 2009 Entrust, Inc./CN=Entrust CertificationAuthority - L1C
verify error:num=20:unable to get local issuercertificate
verify return:0