地址:http://www.cnblogs.com/qq78292959/archive/2012/07/16/2593651.html
iOS消息推送的工作機(jī)制可以簡(jiǎn)單的用下圖來(lái)概括:
Provider是指某個(gè)iPhone軟件的Push服務(wù)器示辈,APNS是Apple Push Notification Service的縮寫蜈块,是蘋果的服務(wù)器。
上圖可以分為三個(gè)階段:
第一階段:應(yīng)用程序把要發(fā)送的消息雳刺、目的iPhone的標(biāo)識(shí)打包,發(fā)給APNS鳍贾。
第二階段:APNS在自身的已注冊(cè)Push服務(wù)的iPhone列表中尽超,查找有相應(yīng)標(biāo)識(shí)的iPhone额嘿,并把消息發(fā)送到iPhone。
第三階段:iPhone把發(fā)來(lái)的消息傳遞給相應(yīng)的應(yīng)用程序吨述,并且按照設(shè)定彈出Push通知岩睁。
從上圖我們可以看到:
1、應(yīng)用程序注冊(cè)消息推送揣云。
2捕儒、iOS從APNS Server獲取device token,應(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)用程序矿咕。
無(wú)論是iPhone客戶端和APNS抢肛,還是Provider和APNS,都需要通過(guò)證書進(jìn)行連接碳柱。
下面我介紹一下幾種用到的證書捡絮。
一、CSR文件
1莲镣、生成Certificate Signing Request(CSR)
2福稳、填寫你的郵箱和常用名稱,并選擇保存到硬盤瑞侮。
點(diǎn)擊繼續(xù):
這樣就在本地生成了一個(gè)Push.certSigningRequest文件的圆。
二、p12文件
1半火、導(dǎo)出密鑰越妈。
2、輸入你的密碼钮糖。
這樣就生成了一個(gè)Push.p12文件叮称。
三、SSL certificate文件
1藐鹤、用你付過(guò)費(fèi)的帳號(hào)登錄到iOS Provisioning Portal瓤檐,并新建一個(gè)App ID,這個(gè)過(guò)程可以參考:iOS應(yīng)用的真機(jī)調(diào)試娱节,這樣就會(huì)生成下面這條記錄:
2挠蛉、點(diǎn)擊右側(cè)的Configure:
3、點(diǎn)擊Development Push SSL Certificate一行后的Configure:
4肄满、點(diǎn)擊Continue:
5谴古、選擇前面生成好的Push.certSigningRequest文件质涛,點(diǎn)擊Generate,出現(xiàn)如下所示的頁(yè)面:
6掰担、點(diǎn)擊Continue:
7汇陆、點(diǎn)擊Download,并將文件命名為aps_developer_identity.cer带饱。
8毡代、點(diǎn)擊Done,你會(huì)發(fā)現(xiàn)狀態(tài)變成了Enabled:
注意:有的App ID的Apple Push Notification service列是灰色的勺疼,并且不允許使用Configure按鈕教寂,這是因?yàn)锳PNS不支持帶通配符的App ID。
到現(xiàn)在為止执庐,我們已經(jīng)生成了三個(gè)文件:
1酪耕、Push.certSigningRequest
2、Push.p12
3轨淌、aps_developer_identity.cer
在項(xiàng)目的AppDelegate中的didFinishLaunchingWithOptions方法中加入下面的代碼:
Ios代碼
[[UIApplication?sharedApplication]?registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert?|?UIRemoteNotificationTypeSound?|?UIRemoteNotificationTypeBadge)];
通過(guò)registerForRemoteNotificationTypes方法迂烁,告訴應(yīng)用程序,能接受push來(lái)的通知递鹉。
在項(xiàng)目的AppDelegate中添加下面的方法來(lái)獲取deviceToken:
Ios代碼
-?(void)application:(UIApplication?*)app?didRegisterForRemoteNotificationsWithDeviceToken:(NSData?*)deviceToken?{
NSString?*token?=?[NSString?stringWithFormat:@"%@",?deviceToken];
NSLog(@"My?token?is:%@",?token);
}
-?(void)application:(UIApplication?*)app?didFailToRegisterForRemoteNotificationsWithError:(NSError?*)error?{
NSString?*error_str?=?[NSString?stringWithFormat:?@"%@",?error];
NSLog(@"Failed?to?get?token,?error:%@",?error_str);
}
獲取到的deviceToken盟步,我們可以提交給后臺(tái)應(yīng)用程序,發(fā)送通知的后臺(tái)應(yīng)用程序除了需要知道deviceToken之外梳虽,還需要一個(gè)與APNS連接的證書。
這個(gè)證書可以通過(guò)我們前面生成的兩個(gè)文件中得到灾茁。
1窜觉、將aps_developer_identity.cer轉(zhuǎn)換成aps_developer_identity.pem格式
Shell代碼
openssl?x509?-in?aps_developer_identity.cer?-inform?DER?-out?aps_developer_identity.pem?-outform?PEM
2、將p12格式的私鑰轉(zhuǎn)換成pem
Shell代碼
openssl?pkcs12?-nocerts?-out?Push_Noenc.pem?-in?Push.p12
3北专、創(chuàng)建p12文件
Shell代碼
openssl?pkcs12?-export?-in?aps_developer_identity.pem?-inkey?Push_Noenc.pem?-certfile?Push.certSigningRequest?-name"aps_developer_identity"-out?aps_developer_identity.p12
這樣我們就得到了在.net或java等后臺(tái)應(yīng)用程序中使用的證書文件:aps_developer_identity.p12
如果后臺(tái)應(yīng)用是php的話禀挫,那么可以按照iOS消息推送機(jī)制中pem文件的生成這篇文章中的方法來(lái)生成php后臺(tái)應(yīng)用程序中使用的證書文件:ck.pem
分類:Iphone