Push的原理:
Push 的工作機(jī)制可以簡(jiǎn)單的概括為下圖
圖中,PRovider是指某個(gè)iphone軟件的Push服務(wù)器,這篇文章我將使用.net作為Provider。
APNS 是Apple Push Notification Service(Apple Push服務(wù)器)的縮寫,是蘋果的服務(wù)器。
上圖可以分為三個(gè)階段。
第一階段:Push服務(wù)器應(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要deviceToken。應(yīng)用程序接受deviceToken。
3、應(yīng)用程序?qū)eviceToken發(fā)送給PUSH服務(wù)端程序。
4、 服務(wù)端程序向APNS服務(wù)發(fā)送消息。
5、APNS服務(wù)將消息發(fā)送給iPhone應(yīng)用程序。
無(wú)論是iPhone客戶端跟APNS,還是Provider和APNS都需要通過(guò)證書(shū)進(jìn)行連接的。下面介紹一下所用到證書(shū)的制作。
一、CSR文件
1、生成Certificate Signing Request(CSR)
2、填寫你的郵箱和常用名稱,并選擇保存到硬盤。
點(diǎn)擊繼續(xù):
這樣就在本地生成了一個(gè)PushTest.certSigningRequest文件。
二、SSL certificate文件
1、用你付過(guò)費(fèi)的帳號(hào)登錄到iOS Provisioning Portal,并創(chuàng)建Certificates(已創(chuàng)建可省略),如下圖:
點(diǎn)擊Submit
創(chuàng)建Certificate完畢。
2、新建一個(gè)App ID 點(diǎn)擊New App ID
輸入Description,Bundle Identifier,點(diǎn)擊Submit,新建App ID完畢。
找到新建的App ID 點(diǎn)擊右側(cè)的Configure:
Development Push SSL Certificate ,與Production Push SSL Certificate 區(qū)別在于一個(gè)是用于開(kāi)發(fā)的推送證書(shū),一個(gè)是用于發(fā)布產(chǎn)品的推送證書(shū)。兩個(gè)證書(shū)獲取到的終端deviceToken是不一樣的,用兩個(gè)證書(shū)生成的P12證書(shū)用于java后臺(tái)連接APNS的服務(wù)器地址也是不同的,Development Push SSL Certificate 對(duì)應(yīng)連接的服務(wù)器地址是:gateway.sandbox.push.apple.com。Production Push SSL Certificate 對(duì)應(yīng)連接的服務(wù)器地址是:gateway.push.apple.com。
點(diǎn)擊Development Push SSL Certificate一行后的Configure: 點(diǎn)擊Continue:
選擇前面生成好的PushTest.certSigningRequest文件,點(diǎn)擊Generate,出現(xiàn)如下所示的頁(yè)面:
點(diǎn)擊Continue:
點(diǎn)擊Download,下載生成的支持推送服務(wù)的證書(shū)(命名為:aps_development-6.cer)。
點(diǎn)擊Done,你會(huì)發(fā)現(xiàn)狀態(tài)變成了Enabled:
到現(xiàn)在為止,我們已經(jīng)生成了兩個(gè)文件:
1、PushTest.certSigningRequest
2、aps_development-6.cer(下載生成的支持推送服務(wù)的證書(shū)。)
雙擊aps_development-6.cer注冊(cè)到你的鑰匙串中,這樣你的鑰匙串中就會(huì)有
三、準(zhǔn)備profile證書(shū),因?yàn)橥扑拖⒅荒茉谡鏅C(jī)上測(cè)試,所以要建一個(gè)profile證書(shū) 點(diǎn)擊"new profile"為上面新建的APP ID建個(gè)profile ,成功之后下載pushtestdescDevprofile.mobileprovision
雙擊將其加入到xcode 的Provisioning Profiles 中。
四、生成JAVA后臺(tái)用于連接APNS的證書(shū):
打開(kāi)鑰匙串 選中Apple Development IOS Push Services:com.easecom.zhwgpushtestdesc,右鍵將其導(dǎo)出。
導(dǎo)出用于JAVA后臺(tái)連接APNS的P12證書(shū)。
輸入p12 證書(shū)的密碼,本文中我用的是123456。記住這個(gè)密碼,JAVA后臺(tái)使用p12證書(shū)的時(shí)候要用到。
輸入訪問(wèn)鑰匙串的密碼:系統(tǒng)登陸密碼。
導(dǎo)出PushTest.p12證書(shū)完畢。
到現(xiàn)在為止,我們已經(jīng)生成了四個(gè)文件:
1、PushTest.certSigningRequest
2、aps_development-6.cer(下載生成的支持推送服務(wù)的證書(shū)。)
3、pushtestdescDevprofile.mobileprovision 4、PushTest.p12
至此IOS消息推送(JAVA后臺(tái))證書(shū)全部制作完畢。
下面開(kāi)始上代碼:
五、IOS端代碼:
1、首先在項(xiàng)目的AppDelegate.m中加入以下兩個(gè)代理方法
- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken { NSString *token = [NSString stringWithFormat:@"%@", deviceToken];
//獲取終端設(shè)備標(biāo)識(shí),這個(gè)標(biāo)識(shí)需要通過(guò)接口發(fā)送到服務(wù)器端,服務(wù)器端推送消息到APNS時(shí)需要知道終端的標(biāo)識(shí),APNS通過(guò)注冊(cè)的終端標(biāo)識(shí)找到終端設(shè)備。 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方法中加入注冊(cè)消息通知推送能力;加入當(dāng)應(yīng)用程序處于未啟動(dòng)狀態(tài)時(shí),判斷是否由遠(yuǎn)程消息通知觸發(fā);加入清除消息推送通知標(biāo)記。
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//判斷是否由遠(yuǎn)程消息通知觸發(fā)應(yīng)用程序啟動(dòng)
if ([launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]!=nil) {
//獲取應(yīng)用程序消息通知標(biāo)記數(shù)(即小紅圈中的數(shù)字)
int badge = [UIApplication sharedApplication].applicationIconBadgeNumber; if (badge>0) {
//如果應(yīng)用程序消息通知標(biāo)記數(shù)(即小紅圈中的數(shù)字)大于0,清除標(biāo)記。
badge--;
//清除標(biāo)記。清除小紅圈中數(shù)字,小紅圈中數(shù)字為0,小紅圈才會(huì)消除。 [UIApplication sharedApplication].applicationIconBadgeNumber = badge; } }
//消息推送注冊(cè) [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeSound|UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeBadge];
} 3、在項(xiàng)目AppDelegate.m中加入消息接收處理代理方法。
//處理收到的消息推送 - (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
//在此處理接收到的消息。 NSLog(@"Receive remote notification : %@",userInfo); } 六、JAVA后臺(tái)代碼:
public static void main(String[] args) throws Exception { try { //從客戶端獲取的deviceToken,在此為了測(cè)試簡(jiǎn)單,寫固定的一個(gè)測(cè)試設(shè)備標(biāo)識(shí)。 String deviceToken = "df779eda 73258894 5882ec78 3ac7b254 6ebc66fe fa295924 440d34ad 6505f8c4"
System.out.println("Push Start deviceToken:" + deviceToken); //定義消息模式 PayLoad payLoad = new PayLoad(); payLoad.addAlert("this is test!"); payLoad.addBadge(1);//消息推送標(biāo)記數(shù),小紅圈中顯示的數(shù)字。 payLoad.addSound("default"); //注冊(cè)deviceToken PushNotificationManager pushManager = PushNotificationManager.getInstance(); pushManager.addDevice("iPhone", deviceToken); //連接APNS String host = "gateway.sandbox.push.apple.com"; //String host = "gateway.push.apple.com"; int port = 2195;
String certificatePath = "c:/PushTest.p12";//前面生成的用于JAVA后臺(tái)連接APNS服務(wù)的*.p12文件位置 String certificatePassWord = "123456";//p12文件密碼。 pushManager.initializeConnection(host, port, certificatePath, certificatePassword, SSLConnectionHelper.KEYSTORE_TYPE_PKCS12); //發(fā)送推送 Device client = pushManager.getDevice("iPhone"); System.out.println("推送消息: " + client.getToken()+"/n"+payLoad.toString() +" "); pushManager.sendNotification(client, payLoad); //停止連接APNS pushManager.stopConnection(); //刪除deviceToken pushManager.removeDevice("iPhone"); System.out.println("Push End"); } catch (Exception ex) { ex.printStackTrace(); } } }
至此大功告成,測(cè)試通過(guò)。
以上在Iphone4,IPAD2設(shè)備測(cè)試通過(guò),Iphone3g,3gs需要打PushDoctor(推送醫(yī)生)補(bǔ)丁才能測(cè)試通過(guò)。
|
新聞熱點(diǎn)
疑難解答
圖片精選
網(wǎng)友關(guān)注