iOS:消息推送原理及實(shí)現(xiàn)歸納
一、消息推送原理:
在實(shí)現(xiàn)消息推送之前先提及幾個(gè)于推送相關(guān)概念,如下:
1、Provider:就是為指定IOS設(shè)備應(yīng)用程序提供Push的服務(wù)器,(如果IOS設(shè)備的應(yīng)用程序是客戶(hù)端的話(huà),那么Provider可以理解為服務(wù)端[消息的發(fā)起者]);
2、APNS:Apple Push Notification Service[蘋(píng)果消息推送服務(wù)器];
3、iPhone:用來(lái)接收APNS下發(fā)下來(lái)的消息;
4、Client App:IOS設(shè)備上的應(yīng)用程序,用來(lái)接收iphone傳遞APNS下發(fā)的消息到制定的一個(gè)客戶(hù)端 app[消息的最終響應(yīng)者];
可以分為三個(gè)階段:
階段一:Provider[服務(wù)端]把要發(fā)送的消息,目的IOS設(shè)備標(biāo)識(shí)打包,發(fā)送給APNS;
階段二:APNS在自身的已注冊(cè)Push服務(wù)的IOS設(shè)備列表中,查找有相應(yīng)標(biāo)識(shí)的IOS設(shè)備,并將消息發(fā)送到IOS設(shè)備;
階段三:IOS設(shè)備把發(fā)送的消息傳遞給對(duì)應(yīng)的應(yīng)用程序,并且按照設(shè)定彈出Push通知。
具體過(guò)程,如下:
1、[Client App]注冊(cè)消息推送;
2、[Client App]跟[APNS Service]要deviceToken, Client App接收deviceToken;
3、[Client App]將deviceToken發(fā)送給[Provider]Push服務(wù)端程序;
4、當(dāng)Push服務(wù)端程序滿(mǎn)足發(fā)送消息條件了,[Provider]向[APNS Service]發(fā)送消息;
5、[APNS Service]將消息發(fā)送給[Client App].
二、消息推送實(shí)現(xiàn):
1、生成*.certSigningRequest文件,步驟如下:
[MacBookà應(yīng)用程序à實(shí)用工具à鑰匙串訪問(wèn)à證書(shū)助手à從證書(shū)機(jī)構(gòu)求證書(shū)?à證書(shū)信息(用戶(hù)電子郵箱地址{填寫(xiě)您的郵箱, 如:your@email.com},常用名稱(chēng){任意,如:PushDemo},請(qǐng)求是:{單選,選擇‘存儲(chǔ)到磁盤(pán)’})à繼續(xù)à保存],這時(shí)會(huì)在您指定 的地方生成你指定的文件,默認(rèn)為CertificateSigningRequest.certSigningRequest文件,這里命名 為:PushDemo.certSigningRequest.在此*.certSigningRequest已經(jīng)生成,具體操作步驟如下面兩張圖所示。
如果生成成功,則會(huì)在[鑰匙串訪問(wèn)|登錄|密鑰]欄目中列出與*.certSigningRequest關(guān)聯(lián)的密鑰,這里是PushDemo。
2、新建一個(gè)App ID(在蘋(píng)果開(kāi)發(fā)者賬號(hào)中配置)
(1) 登錄iOS Dev Center,登錄成功后,點(diǎn)擊(iOS Provisioning Portal對(duì)應(yīng)鏈接)。
(2) 創(chuàng)建New App ID[App IDsàManageàNew App ID]( Description{填寫(xiě)您對(duì)此App ID 的描述,如:iShop},Bundle Seed ID(App ID Prefix){選擇綁定App ID前綴,如:默認(rèn)選擇Generate New},Bundle Identifier(App ID Suffix){填寫(xiě)綁定App ID后綴,如:com.yourcorp.iShop})。
這樣就會(huì)生成下面這條記錄。
(3) 配置上一步中生成的App ID,讓其支持消息推送[點(diǎn)擊2-6中的Configureà選中Enable for Apple Push Notification serviceà點(diǎn)擊Configure]。
(4) Generate a Certificate Signing Request(生成部署請(qǐng)求認(rèn)證)[點(diǎn)擊上圖中的2ConfigureàContinueà步驟1生成的*certSigningRequest文件 (這里是iShop. certSigningRequest)à Generateà生成完成后將其下載下來(lái),命名為:aps_developer_identity.cer],雙擊 aps_developer_identity.cer證書(shū){將證書(shū)與密鑰關(guān)聯(lián),并將證書(shū)導(dǎo)入到MacBook中}。
(5) 創(chuàng)建Development Provisioning Profiles[開(kāi)發(fā)許可配置文件](Provisioning| Development|New Profile)。
點(diǎn)擊上圖中Submit,生成Development Provisioning Profiles[開(kāi)發(fā)許可配置文件],這里是:iShopDevprofile.mobileprovision。
下載此開(kāi)發(fā)許可證書(shū)(用于聯(lián)機(jī)調(diào)試)。
總結(jié),到現(xiàn)在為止,我們已經(jīng)生成:A:*.certSigningRequest文件(在步驟(4)中使用,用于生成證書(shū)B(niǎo))、B: aps_developer_identity.cer證書(shū)(在Provider[Push服務(wù)器]服務(wù)端應(yīng)用使用)、 C:*..mobileprovision開(kāi)發(fā)許可配置文件(在Client App客戶(hù)端應(yīng)用聯(lián)機(jī)調(diào)試使用)。
至此,消息推送的配置已經(jīng)全部完成,接下來(lái)的工作就是編寫(xiě)Provider[Push服務(wù)器]服務(wù)端應(yīng)用和Client App客戶(hù)端應(yīng)用的程序。
三、Provider服務(wù)端的實(shí)現(xiàn)
在這里只是簡(jiǎn)單講述Provider服務(wù)端(JAVA實(shí)現(xiàn))步驟如下:
(1) 制作Provider服務(wù)端所需要的*.p12文件:
在上面的實(shí)現(xiàn)的(4) 部分的圖所展示的密鑰、證書(shū),我們并沒(méi)有使用到它,那么為什么要展示出來(lái)呢,猜猜是為什么?為制作*.p12文件?哈哈,您猜對(duì)了,下面我們就利用它來(lái)制 作*.p12文件,步驟:([MacBookà應(yīng)用程序à實(shí)用工具à鑰匙串訪問(wèn)[鑰匙串:登錄,種類(lèi):證書(shū)]à選擇剛剛生成的證書(shū)(Apple Development IOS Services:*******)à菜單à文件à導(dǎo)出項(xiàng)目…à[存儲(chǔ)為:任意文件名(如:iPush),文件格式:默認(rèn)(個(gè)人信息交換 (.p12))]à輸入密碼以進(jìn)行導(dǎo)出[密碼:任意,驗(yàn)證:與密碼同一]à輸入MACBook登錄密碼à允許à最終生成。
(2) 編寫(xiě)Client App客戶(hù)端的關(guān)鍵代碼,如下:
- - ( BOOL )application : (UIApplication * )application didFinishLaunchingWithOptions : ( NSDictionary * )launchOptions
- {
- self.window = [ [ [UIWindow alloc ] initWithFrame : [ [UIScreen mainScreen ]bounds ] ] autorelease ];
- self.window.backgroundColor = [UIColor whiteColor ];
- [self.window makeKeyAndVisible ];
- //消息推送支持的類(lèi)型
- UIRemoteNotificationType types =
- (UIRemoteNotificationTypeBadge
- |UIRemoteNotificationTypeSound
- |UIRemoteNotificationTypeAlert );
- //注冊(cè)消息推送
- [ [UIApplication sharedApplication ]registerForRemoteNotificationTypes :types ];
- return YES;
- }
- //獲取DeviceToken成功
- - ( void )application : (UIApplication * )application
- didRegisterForRemoteNotificationsWithDeviceToken : ( NSData * )deviceToken
- {
- NSLog ( @ "DeviceToken: {%@}",deviceToken );
- //這里進(jìn)行的操作,是將Device Token發(fā)送到服務(wù)端
- }
- //注冊(cè)消息推送失敗
- - ( void )application : (UIApplication * )application
- didFailToRegisterForRemoteNotificationsWithError : ( NSError * )error
- {
- NSLog ( @ "Register Remote Notifications error:{%@}", [errorlocalizedDescription ] );
- }
- //處理收到的消息推送
- - ( void )application : (UIApplication * )application
- didReceiveRemoteNotification : ( NSDictionary * )userInfo
- {
- NSLog ( @ "Receive remote notification : %@",userInfo );
- UIAlertView *alert =
- [ [UIAlertView alloc ] initWithTitle : @ "溫馨提示"
- message : @ "推送成功!"
- delegate : nil
- cancelButtonTitle : @ "確定"
- otherButtonTitles : nil ];
- [alert show ];
- [alert release ];
- }
(3)編寫(xiě)Provider服務(wù)端關(guān)鍵代碼,如下:
- import javapns.back.PushNotificationManager ;
- import javapns.back.SSLConnectionHelper ;
- import javapns.data.Device ;
- import javapns.data.PayLoad ;
- public class MainSend
- {
- public static void main ( String [ ] args ) throws Exception
- {
- try
- {
- //從客戶(hù)端獲取的deviceToken
- String deviceToken = "3a20764942e9cb4c4f6249274f12891946bed26131b686b8aa95322faff0ad46" ;
- System. out. println ( "Push Start deviceToken:" + deviceToken ) ;
- //定義消息模式
- PayLoad payLoad = new PayLoad ( ) ;
- payLoad. addAlert ( "消息推送測(cè)試!" ) ;
- payLoad. addBadge ( 4 ) ;
- payLoad. addSound ( "default" ) ;
- //注冊(cè)deviceToken
- PushNotificationManager pushManager = PushNotificationManager. getInstance ( ) ;
- pushManager. addDevice ( "iPhone", deviceToken ) ;
- //連接APNS
- String host = "gateway.sandbox.push.apple.com" ;
- int port = 2195 ;
- String path = "/Users/iMilo/Work.localized/iShop/project/service/iPush/" ;
- String certificatePath = (path + "src/ipush/iPush.p12" ) ;
- //certificatePath 步驟一中生成的*.p12文件位置
- String certificatePassword = "Love24mm" ;
- pushManager. initializeConnection (host, port, certificatePath, certificatePassword, SSLConnectionHelper. KEYSTORE_TYPE_PKCS12 ) ;
- //發(fā)送推送
- Device client = pushManager. getDevice ( "iPhone" ) ;
- pushManager. sendNotification (client, payLoad ) ;
- //停止連接APNS
- pushManager. stopConnection ( ) ;
- //刪除deviceToken
- pushManager. removeDevice ( "iPhone" ) ;
- System. out. println ( "Push End" ) ;
- }
- catch ( Exception ex )
- {
- ex. printStackTrace ( ) ;
- }
- }
- }
注意:如果Provider服務(wù)端為Objective-C實(shí)現(xiàn)的話(huà),就不需要*.p12證書(shū)。