此文主要以證書生成配置爲主,實現簡單推送,部分截圖與內容來自於互聯網,若對大家有所幫助,還請給個贊O(∩_∩)O~~。如有誤,請指出,一起探討。
一、 推送原理
Provider是指某個iPhone軟件的Push服務器。APNS 是Apple Push Notification Service(Apple Push服務器)的縮寫,是蘋果的服務器。上圖可以分爲三個階段。
* 第一階段:Push服務器應用程序把要發送的消息、目的iPhone的標識打包,發給APNS。
* 第二階段:APNS在自身的已註冊Push服務的iPhone列表中,查找有相應標識的iPhone,並把消息發到iPhone。
* 第三階段:iPhone把發來的消息傳遞給相應的應用程序, 並且按照設定彈出Push通知。
1. 應用程序註冊消息推送。
2. IOS跟APNS Server要deviceToken。應用程序接受deviceToken。
3. 應用程序將deviceToken發送給PUSH服務端程序。
4. 服務端程序向APNS服務發送消息。
5. APNS服務將消息發送給iPhone應用程序。無論是iPhone客戶端跟APNS,還是Provider和APNS都需要通過證書進行連接的。
二、 證書的創建
1. 創建本地請求證書文件–CertificateSigningRequest
- 鑰匙串訪問 –> 證書助理 –> 從證書頒發機構請求證書;
- 填寫郵箱和名稱(可以隨意填寫) –> 存儲到磁盤
- 選擇繼續-保存至桌面即可(此文件可長期重複使用,只作爲本機器的一個識別作用)
2. 進入蘋果開發者網站,生成證書以及profiles
依次選擇Member Center - Certificates, Identifiers &Profiles - Certificates
選擇當前要設置通知的APP IDs
這裏我以新建一個APP IDs爲例,若公司已有項目APP IDs,則略過此步
選擇右上角”+”號創建一個APPID
填寫name以及Bundle ID
Bundle ID需要與Xcode裏項目Bundle ID一致
勾選push notification 並完成提交
找到剛創建好的APP IDs,可以看到下面的通知選項處提示Configurable,表示證書還沒配置,點擊Edit進行編輯
這裏看到推送證書分爲2個版本,一個開發模式,一個生產模式,即我們在開發測試時使用開發模式證書,發佈上線後採用生產模式證書,兩個都要創建(本次只作開發模式演示,當然創建生產版證書的步驟也是一樣的)
Choose File選擇最開始創建在桌面的Request文件
創建證書OK後 下載到本地
開發版和生產版證書都創建好後,此時這裏已經都是啓用狀態了。
生成XCODE使用的provisioning文件,該文件用於真機調試:
生成過程:
進入developer.apple.com,選擇member center - Certificates, Identifiers & Profiles - Provisioning Profiles,然後選擇創建Provisioning file,接着選擇iOS App Development ,下一步選擇AppId,選中之前建立的支持push的appid,接着下一步選擇支持push的certificate,下一步勾選需要支持的device id,最後一步設置provisioning文件的文件名,這樣provisioning文件就生成了。
3. 生成服務端使用的證書文件
- 首先雙擊前面保存的cer文件,此時會打開“鑰匙串訪問”軟件,裏面會出現一個Apple Development IOS push services證書,一個公用密鑰和一個專用祕鑰,祕鑰的名稱與證書助理中填寫的名稱一致。
- 選中證書,導出爲 apns-dev-cert-development.p12 文件
- 選中專有祕鑰,導出爲apns-dev-key-development.p12文件
- 通過終端命令將這些文件轉換爲PEM格式:
- 設置密碼,建議所有都爲一個密碼
openssl pkcs12 -clcerts -nokeys -out apns-dev-cert-development.pem -in apns-dev-cert-development.p12
openssl pkcs12 -nocerts -out apns-dev-key-development.pem -in apns-dev-key-development.p12
- 最後, 需要將兩個pem文件合併成一個apns-dev.pem文件,此文件在連接到APNS時需要使用:
“`
cat apns-dev-cert-development.pem apns-dev-key-noenc-development.pem > apns-dev-development.pem
####4. 測試證書
執行下面命令:
telnet gateway.sandbox.push.apple.com 2195(apns的測試環境)
telnet gateway.push.apple.com 2195(apns的正式環境)
它將嘗試發送一個規則的,不加密的連接到APNS。如果你看到下面的反饋,那說明你的MAC能夠到達APNS。按下Ctrl+C關閉連接。如果得到一個錯誤信息,那麼你需要確保你的防火牆允許2195端口,一般這裏都不會出現什麼問題。
![終端顯示](http://upload-images.jianshu.io/upload_images/1085368-a72adc48d5be13db.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
下面我們使用生成的SSL證書和私鑰來設置一個安全的鏈接去鏈接蘋果服務器,執行命令如下:
openssl s_client -connect gateway.sandbox.push.apple.com:2195 -cert apns-dev-cert-development.pem -key apns-dev-key-development.pem
“`
執行之後需要輸入密碼,就是上面我們設置的密碼即可。
如果鏈接是成功的,你可以隨便輸入一個字符,按下回車,服務器就會斷開鏈接,如果建立連接時有問題,OpenSSL會給你返回一個錯誤信息。
輸出結果如下,則說明是正確鏈接了,把上述合併的apns-dev-development.pem給服務端使用。
如果有錯誤,請檢查是否導出正確的推送證書。