IOS 基於APNS消息推送原理與實現(JAVA後臺)--轉

Push的原理:
Push 的工做機制能夠簡單的歸納爲下圖
 
圖中,Provider是指某個iPhone軟件的Push服務器,這篇文章我將使用.net做爲Provider。
APNS 是Apple Push Notification Service(Apple Push服務器)的縮寫,是蘋果的服務器。
上圖能夠分爲三個階段。
第一階段:Push服務器應用程序把要發送的消息、目的iPhone的標識打包,發給APNS。
第二階段:APNS在自身的已註冊Push服務的iPhone列表中,查找有相應標識的iPhone,並把消息發到iPhone。
第三階段:iPhone把發來的消息傳遞給相應的應用程序, 而且按照設定彈出Push通知。
 
從上圖咱們能夠看到。
一、首先是應用程序註冊消息推送。
二、 IOS跟APNS Server要deviceToken。應用程序接受deviceToken。
三、應用程序將deviceToken發送給PUSH服務端程序。
四、 服務端程序向APNS服務發送消息。
五、APNS服務將消息發送給iPhone應用程序。
不管是iPhone客戶端跟APNS,仍是Provider和APNS都須要經過證書進行鏈接的。下面介紹一下所用到證書的製做。
1、CSR文件

一、生成Certificate Signing Request(CSR)
 
 
二、填寫你的郵箱和經常使用名稱,並選擇保存到硬盤。
 
點擊繼續:
 
這樣就在本地生成了一個PushTest.certSigningRequest文件。


2、SSL certificate文件

一、用你付過費的賬號登陸到iOS Provisioning Portal,並建立Certificates(已建立可省略),以下圖:
 
 
 
 
 
 
 
 
點擊Submit
 
 
建立Certificate完畢。
二、新建一個App ID
點擊New App ID
 
 
輸入Description,Bundle Identifier,點擊Submit,新建App ID完畢。
 
 
 
找到新建的App ID 點擊右側的Configure:
 
 
Development Push SSL Certificate ,與Production Push SSL Certificate 區別在於一個是用於開發的推送證書,一個是用於發佈產品的推送證書。兩個證書獲取到的終端deviceToken是不同的,用兩個證書生成的P12證書用於JAVA後臺鏈接APNS的服務器地址也是不一樣的,Development Push SSL Certificate 對應鏈接的服務器地址是:gateway.sandbox.push.apple.com。Production Push SSL Certificate  對應鏈接的服務器地址是:gateway.push.apple.com。
點擊Development Push SSL Certificate一行後的Configure:
 
 
點擊Continue:
 
 
選擇前面生成好的PushTest.certSigningRequest文件,點擊Generate,出現以下所示的頁面:
 
點擊Continue:
 
點擊Download,下載生成的支持推送服務的證書(命名爲:aps_development-6.cer)。

點擊Done,你會發現狀態變成了Enabled:
 
 
到如今爲止,咱們已經生成了兩個文件:
一、PushTest.certSigningRequest
二、aps_development-6.cer(下載生成的支持推送服務的證書。)
雙擊aps_development-6.cer註冊到你的鑰匙串中,這樣你的鑰匙串中就會有
 
3、準備profile證書,由於推送消息只能在真機上測試,因此要建一個profile證書
 
點擊"new profile"爲上面新建的APP ID建個profile ,成功以後下載pushtestdescDevprofile.mobileprovision
 
 
雙擊將其加入到xcode 的Provisioning Profiles 中。
4、生成JAVA後臺用於鏈接APNS的證書:
打開鑰匙串
 
 
 
選中Apple Development IOS Push Services:com.easecom.zhwgpushtestdesc,右鍵將其導出。
 
 
導出用於JAVA後臺鏈接APNS的P12證書。
 
輸入p12 證書的密碼,本文中我用的是123456。記住這個密碼,JAVA後臺使用p12證書的時候要用到。
 
 
輸入訪問鑰匙串的密碼:系統登錄密碼。
 
 
導出PushTest.p12證書完畢。
到如今爲止,咱們已經生成了四個文件:
一、PushTest.certSigningRequest
二、aps_development-6.cer(下載生成的支持推送服務的證書。)
三、pushtestdescDevprofile.mobileprovision
四、PushTest.p12
至此IOS消息推送(JAVA後臺)證書所有制做完畢。
下面開始上代碼:
5、IOS端代碼:
一、首先在項目的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);   
}

二、在AppDelegate.m的(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions方法中加入註冊消息通知推送能力;加入當應用程序處於未啓動狀態時,判斷是否由遠程消息通知觸發;加入清除消息推送通知標記。xcode

 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
  //判斷是否由遠程消息通知觸發應用程序啓動
    if ([launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]!=nil) {
        //獲取應用程序消息通知標記數(即小紅圈中的數字)
        int badge = [UIApplication sharedApplication].applicationIconBadgeNumber;
        if (badge>0) {
           //若是應用程序消息通知標記數(即小紅圈中的數字)大於0,清除標記。
            badge--;
          //清除標記。清除小紅圈中數字,小紅圈中數字爲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);
}

6、JAVA後臺代碼:服務器

public static void main(String[] args) throws Exception 
{
        try
        {
            //從客戶端獲取的deviceToken,在此爲了測試簡單,寫固定的一個測試設備標識。
           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);//消息推送標記數,小紅圈中顯示的數字。
            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服務的*.p12文件位置
            String certificatePassword = "123456";//p12文件密碼。
            pushManager.initializeConnection(host, port, certificatePath, certificatePassword, SSLConnectionHelper.KEYSTORE_TYPE_PKCS12);
            //發送推送
            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設備測試經過,Iphone3g,3gs須要打PushDoctor(推送醫生)補丁才能測試經過。
相關文章
相關標籤/搜索