APNS push 推送

第一步:證書創建

IOS的推送證書,有有效期限制,一般爲一年。當我們證書過期的時候,就需要重新生成證書了。有一段時間沒有上蘋果網站了,昨天上去一看,此奧,改版了,下邊我們將重新生成一個正式環境的push推送的證書。

1、先打開鑰匙串(應用程序-實用工具-鑰匙串訪問),請求一個證書



常用名稱寫爲:2013.04.27_push_production_***。並保存到磁盤上。


2、進入打開蘋果網站的證書標籤頁面,選擇 Identifiers標籤下邊的App IDs子標籤,顯示下邊圖片。紅色圈中的是我要重新生成push簽名的證書。點擊此證書。



3、證書詳情標籤,羅列出了所有的功能狀態,最後的Push Notifications顯示可以配置,並不是Enabled可以狀態,所以點擊Setting功能重新上傳證書。



4、證書設置頁面中,最下邊的Push Notifications 如下圖所示。



其中:Development SSL Certificate是測試環境證書,Production SSL Certificate爲正式環境證書,我們生成正式環境的證書,點擊後面的Create Certificate。


5、Create Certificate頁面如下。點擊下邊的continue。



6、選擇上傳的證書,我們第一步已經生成了一個證書,上傳此證書。



7、上傳成功後,將會顯示下邊的圖片。有可能在生成證書的過程中會有loading框一直在轉轉轉,這時候重新進入此頁面即可。其實此時證書已經生成了。



此時,push證書已經生成,上邊會標註過期時間,push的證書有效期爲一年。點擊Download下載此證書。


8、雙擊剛纔下載的證書,會自動把此證書加入到鑰匙串的簽名中


第二步:導出後臺使用證書

php 後臺需要 pem 證書,java 和 .NET 後臺需要 .p12 證書

模式一:.p12 證書的創建

1、打開鑰匙串,選擇剛剛安裝好的 push 證書,如下圖標示,紅色圈中的,既是我剛纔添加的證書,展開此證書



先右鍵點擊 Apple Production IOS PushServices:com.***.***,先導出一個.p12文件。命名爲cert.p12。在導出的過程中會讓輸入導出密碼,輸入相應的密碼即可,並輸入自己的郵箱。

模式二:pem 證書的創建,有兩種方案

方案一:

1、打開鑰匙串,選擇剛剛安裝好的 push 證書,如下圖標示,紅色圈中的,既是我剛纔添加的證書,展開此證書



先右鍵點擊 Apple Production IOS PushServices:com.***.***,先導出一個.p12文件。命名爲cert.p12。在導出的過程中會讓輸入導出密碼,輸入相應的密碼即可,並輸入自己的郵箱。


2、在2012.04.27_push_producation_***上點擊右鍵,導出一個.p12的文件,命名爲key.p12,與上邊相同在導出的過程中會讓輸入導出密碼,輸入相應的密碼即可。



3、到此爲止,我們已經有了兩個.p12文件,把他們放到同一個文件夾(aaa)下,需要把兩個.p12文件轉換成.pem文件。

a.先打開終端,切換到文件夾aaa下執行

[cpp] view plain copy
  1. openssl pkcs12 -clcerts -nokeys -out cert.pem -in cert.p12  

在執行的時候,將會讓輸入密碼,輸入剛纔設置的密碼即可生成一個cert.pem文件。

b.再執行:

[cpp] view plain copy
  1. openssl pkcs12 -nocerts -out key.pem -in key.p12  

此時要注意在終端中的提示,第一次輸入的密碼是生成證書時候的密碼,第二次第三次輸入密碼是設置key.pem的新密碼。

c.如果需要對 key不進行加密,執行下邊語句

[cpp] view plain copy
  1. openssl rsa -in key.pem -out key.unencrypted.pem  

d.然後就可以合併兩個.pem文件,這個ck.pem就是服務端需要的證書了。

[cpp] view plain copy
  1. cat cert.pem key.unencrypted.pem > ck.pem  

方案二:

cd  進入證書所在目錄

.cer文件轉換成.pem文件:

$ openssl x509 -in aps_developer_identity.cer -inform der

-out PushCert.pem

把私鑰Push.p12文件轉換成.pem文件:

$ openssl pkcs12 -nocerts -out PushKey.pem -in Push.p12

Enter Import Password:

MAC verified OK

Enter PEM pass phrase:

Verifying – Enter PEM pass phrase:

你首先需要爲.p12文件輸入passphrase密碼短語,這樣OpenSSL可以讀它。然後你需要鍵入一個新的密碼短語來加密PEM文件。還是使用”pushchat”來作爲PEM的密碼短語。你需要選擇一些更安全的密碼短語。

注意:如果你沒有鍵入一個PEM passphraseOpenSSL將不會返回一個錯誤信息,但是產生的.pem文件裏面將不會含有私鑰。

最後。把私鑰和證書整合到一個.pem文件裏:

$ cat PushCert.pem PushKey.pem > ck.pem

爲了測試證書是否工作,執行下面的命令:

$ telnet gateway.sandbox.push.apple.com 2195

Trying 17.172.232.226…

Connected to gateway.sandbox.push-apple.com.akadns.net.

Escape character is ‘^]’.

它將嘗試發送一個規則的,不加密的連接到APNS服務。如果你看到上面的反饋,那說明你的MAC能夠到達APNS。按下Ctrl+C 關閉連接。如果得到一個錯誤信息,那麼你需要確保你的防火牆允許2195端口。

然後再次連接,這次用我們的SSL證書和私鑰來設置一個安全的連接:

$ openssl s_client -connect gateway.sandbox.push.apple.com:2195

-cert PushChatCert.pem -key PushChatKey.pem

Enter pass phrase for PushChatKey.pem:

你會看到一個完整的輸出,讓你明白OpenSSL在後臺做什麼。如果連接是成功的,你可以鍵入一些字符。當你按下回車後,服務就會斷開連接。如果在建立連接時有問題,OpenSSL將會給你一個錯誤消息,

ck.pem文件就是我們需要得到php連接APNS 的文件,將ck.pempush.php放入同一目錄上傳到服務器。

注意:上面兩種方式的簡單命令描述如下

生成php端push證書
1.openssl x509 -in aps_production.cer -inform DER -out aps_production_identity.pem -outform PEM
2.openssl pkcs12 -nocerts -out PushChatKey.pem -in PushChat.p12
//去除PEM pass phrase密碼
openssl rsa -in PushChatKey.pem -out apns-pro-key-noenc.pem
3. cat aps_production_identity.pem apns-pro-key-noenc.pem > ck.pem

第二種方式
 1.     openssl pkcs12 -clcerts -nokeys -out cert.pem -in Certificates.p12
   2.     openssl pkcs12 -nocerts -out key.pem -in Certificates.p12
   3.     openssl rsa -in key.pem -out key.unencrypted.pem
   4.     cat cert.pem key.unencrypted.pem > ck.pem

第三步:客戶端代碼
1、首先在項目的AppDelegate.m中加入以下兩個代理方法
複製代碼
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { 
    NSString *token = [NSString stringWithFormat:@"%@", deviceToken];
    //獲取終端設備標識,這個標識需要通過接口發送到服務器端,服務器端推送消息到APNS時需要知道終端的標識,APNS通過註冊的終端標識找到終端設備。
    NSLog(@"My token is:%@", token);   
}  
- (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error {   
    NSString *error_str = [NSString stringWithFormat: @"%@", error];   
    NSLog(@"Failed to get token, error:%@", error_str);   
}
複製代碼

2、在AppDelegate.m的(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中加入

註冊消息通知推送能力;加入當應用程序處於未啓動狀態時,判斷是否由遠程消息通知觸發;加入清除消息推送通知標記。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章