国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

IOS基于APNS消息推送原理與實現(xiàn)(JAVA后臺)

2019-11-14 20:16:05
字體:
供稿:網(wǎng)友

Push的原理:

Push 的工作機制可以簡單的概括為下圖

 

圖中,PRovider是指某個iphone軟件的Push服務(wù)器,這篇文章我將使用.net作為Provider。

APNS 是Apple Push Notification Service(Apple Push服務(wù)器)的縮寫,是蘋果的服務(wù)器。

上圖可以分為三個階段。

第一階段:Push服務(wù)器應(yīng)用程序把要發(fā)送的消息、目的iPhone的標(biāo)識打包,發(fā)給APNS。 

第二階段:APNS在自身的已注冊Push服務(wù)的iPhone列表中,查找有相應(yīng)標(biāo)識的iPhone,并把消息發(fā)到iPhone。 

第三階段:iPhone把發(fā)來的消息傳遞給相應(yīng)的應(yīng)用程序, 并且按照設(shè)定彈出Push通知。

 

 

從上圖我們可以看到。

1、首先是應(yīng)用程序注冊消息推送。

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)用程序。

無論是iPhone客戶端跟APNS,還是Provider和APNS都需要通過證書進(jìn)行連接的。下面介紹一下所用到證書的制作。

一、CSR文件

 

1、生成Certificate Signing Request(CSR)

    

2、填寫你的郵箱和常用名稱,并選擇保存到硬盤。

   

點擊繼續(xù):

 

這樣就在本地生成了一個PushTest.certSigningRequest文件。

 

 

二、SSL certificate文件

 

1、用你付過費的帳號登錄到iOS Provisioning Portal,并創(chuàng)建Certificates(已創(chuàng)建可省略),如下圖:

       點擊Submit  創(chuàng)建Certificate完畢。

2、新建一個App ID  點擊New App ID 輸入Description,Bundle Identifier,點擊Submit,新建App ID完畢。

找到新建的App ID 點擊右側(cè)的Configure:

 Development Push SSL Certificate ,與Production Push SSL Certificate 區(qū)別在于一個是用于開發(fā)的推送證書,一個是用于發(fā)布產(chǎn)品的推送證書。兩個證書獲取到的終端deviceToken是不一樣的,用兩個證書生成的P12證書用于java后臺連接APNS的服務(wù)器地址也是不同的,Development Push SSL Certificate 對應(yīng)連接的服務(wù)器地址是:gateway.sandbox.push.apple.com。Production Push SSL Certificate  對應(yīng)連接的服務(wù)器地址是:gateway.push.apple.com。

點擊Development Push SSL Certificate一行后的Configure:  點擊Continue:

 

選擇前面生成好的PushTest.certSigningRequest文件,點擊Generate,出現(xiàn)如下所示的頁面:

點擊Continue:

 

 點擊Download,下載生成的支持推送服務(wù)的證書(命名為:aps_development-6.cer)。

 

點擊Done,你會發(fā)現(xiàn)狀態(tài)變成了Enabled:  

到現(xiàn)在為止,我們已經(jīng)生成了兩個文件:

1、PushTest.certSigningRequest

2、aps_development-6.cer(下載生成的支持推送服務(wù)的證書。)

雙擊aps_development-6.cer注冊到你的鑰匙串中,這樣你的鑰匙串中就會有  

三、準(zhǔn)備profile證書,因為推送消息只能在真機上測試,所以要建一個profile證書  點擊"new profile"為上面新建的APP ID建個profile ,成功之后下載pushtestdescDevprofile.mobileprovision 雙擊將其加入到xcode 的Provisioning Profiles 中。

四、生成JAVA后臺用于連接APNS的證書:

打開鑰匙串   選中Apple Development IOS Push Services:com.easecom.zhwgpushtestdesc,右鍵將其導(dǎo)出。 導(dǎo)出用于JAVA后臺連接APNS的P12證書。  輸入p12 證書的密碼,本文中我用的是123456。記住這個密碼,JAVA后臺使用p12證書的時候要用到。  輸入訪問鑰匙串的密碼:系統(tǒng)登陸密碼。

導(dǎo)出PushTest.p12證書完畢。

到現(xiàn)在為止,我們已經(jīng)生成了四個文件:

1、PushTest.certSigningRequest

2、aps_development-6.cer(下載生成的支持推送服務(wù)的證書。)

3、pushtestdescDevprofile.mobileprovision 4、PushTest.p12

至此IOS消息推送(JAVA后臺)證書全部制作完畢。

下面開始上代碼:

五、IOS端代碼:

1、首先在項目的AppDelegate.m中加入以下兩個代理方法

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken {      NSString *token = [NSString stringWithFormat:@"%@", deviceToken]; 

    //獲取終端設(shè)備標(biāo)識,這個標(biāo)識需要通過接口發(fā)送到服務(wù)器端,服務(wù)器端推送消息到APNS時需要知道終端的標(biāo)識,APNS通過注冊的終端標(biāo)識找到終端設(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方法中加入注冊消息通知推送能力;加入當(dāng)應(yīng)用程序處于未啟動狀態(tài)時,判斷是否由遠(yuǎn)程消息通知觸發(fā);加入清除消息推送通知標(biāo)記。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

  //判斷是否由遠(yuǎn)程消息通知觸發(fā)應(yī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,小紅圈才會消除。             [UIApplication sharedApplication].applicationIconBadgeNumber = badge;         }     }

    //消息推送注冊     [[UIApplication sharedApplication] registerForRemoteNotificationTypes:UIRemoteNotificationTypeSound|UIRemoteNotificationTypeAlert|UIRemoteNotificationTypeBadge];

} 3、在項目AppDelegate.m中加入消息接收處理代理方法。

//處理收到的消息推送 - (void)application:(UIApplication *)application  didReceiveRemoteNotification:(NSDictionary *)userInfo {

    //在此處理接收到的消息。     NSLog(@"Receive remote notification : %@",userInfo); } 六、JAVA后臺代碼:

public static void main(String[] args) throws Exception   {         try         {             //從客戶端獲取的deviceToken,在此為了測試簡單,寫固定的一個測試設(shè)備標(biāo)識。            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");             //注冊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后臺連接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();         }  } }

至此大功告成,測試通過。

以上在Iphone4,IPAD2設(shè)備測試通過,Iphone3g,3gs需要打PushDoctor(推送醫(yī)生)補丁才能測試通過。


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 嘉黎县| 绍兴县| 丁青县| 关岭| 昭平县| 互助| 南澳县| 华容县| 砀山县| 张家港市| 克什克腾旗| 东台市| 大足县| 南康市| 石门县| 隆回县| 张掖市| 佳木斯市| 游戏| 阿瓦提县| 裕民县| 甘德县| 苍南县| 定兴县| 若尔盖县| 武定县| 宁阳县| 霍州市| 浪卡子县| 德阳市| 明水县| 蓬安县| 延川县| 北票市| 十堰市| 宁乡县| 平江县| 庐江县| 观塘区| 凤庆县| 唐河县|