IOS推送功能的實現(javapns)

來源:互聯網
上載者:User
文章目錄
  • (3)混合方式
IOS的推送實現由這樣幾步來完成:
  1. 建立Push SSL Certification
  2. IOS用戶端註冊Push功能並獲得DeviceToken
  3. 使用Provider向APNS發送Push訊息
  4. IOS用戶端接收處理由APNS發來的訊息
建立Push SSL Certification

    登入developer.apple.com,建立新的App ID,要求此ID的Bundle Identifier不包含萬用字元,否則不能啟用Push以及IAP功能。例如 com.soso.sosoimage。

    在App IDs列表頁面,點擊剛建立的app id右面的Configure連結,進入Configure App ID介面,選中"Enable for App Push Notification service"。點擊Development Push SSL Certificate一行的Configure按鈕,彈出"Apple Push Notification service SSL Certificate Assistant"對話方塊,依對話方塊操作,類似於建立開發或發布用的Certificate。

    最終將Development Push SSL Certificate下載並安裝到本地Keychain Access。匯出成p12檔案,備用。匯出時需要設定密碼,不得為空白。

    在developer.apple.com,建立一個新的Provisioning Profile,使用我們剛剛建立的支援Push功能的App ID。下載並安裝到本地。

 

IOS用戶端註冊Push功能並獲得DeviceToken

    建立本地工程,info.plist中設定Bundle identifier為剛剛建立的Bundle Id。Com.soso.sosoimage。設定Code Signing Identity為剛剛建立的Provisioning Profile。

    程式第一次執行的時候,調用如下代碼.

[[UIApplication sharedApplication] registerForRemoteNotificationTypes:(UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeSound)];

三個參數分別代表訊息(橫幅或提醒,由使用者Setting決定,程式不可更改)、數字標記、聲音。

在AppDelegate.m中添加兩個方法.

//iPhone 從APNs伺服器擷取deviceToken後回調此方法- (void)application:(UIApplication *)app didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken{    NSString* dt = [[deviceToken description] stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"<>"]];    NSLog(@"deviceToken:%@", dt);}//註冊push功能失敗 後 返回錯誤資訊,執行相應的處理- (void)application:(UIApplication *)app didFailToRegisterForRemoteNotificationsWithError:(NSError *)err{    NSLog(@"Push Register Error:%@", err.description);}

擷取DeviceToken後,將其傳給Provider。

使用Provider向APNS發送Push訊息

Provider,將推送資訊發送給APNS(蘋果推送伺服器)的程式。有很多開源的實現,我們使用javapns ( http://code.google.com/p/javapns/ )。
首先,Provider要有目標DeviceToken,這是發送目標,由用戶端傳給Provider之後存在某處。
安裝javapns,需要匯入的jar為bcprov-jdk15-146.jar, log4j-1.2.15.jar, JavaPNS_2.3_Alpha_5.jar。
將前面匯出的P12檔案放在Provider的工程目錄下。
Provider向APNS發送訊息可以參考javapns中NotificationTest.java。也可以參考如下例子。

(1)使用戶端表徵圖顯示數字標記
Push.badge(2, keystore, password, false, "7bb8d508e32df651c6c239439737dbd40a88d2461ad2ac1e5dbe49ecea5ccc67");

其中,2為要顯示的數字;

String keystore = "PushCertificates.p12";     //P12檔案的路徑;String password = "sosoimage";                //P12檔案的密碼;

false,指的是使用測試環境,使用正式產品環境應傳入true.
"7bb8d508e32df651c6c239439737dbd40a88d2461ad2ac1e5dbe49ecea5ccc67"為用戶端獲得並傳給Provider的DeviceToken,此參數還可以傳入String[]對象,以同時向多個用戶端Push訊息。

(2)使用戶端顯示橫幅或提醒

Provider可以向用戶端Push一條Message,但用戶端有許可權決定這條Message的顯示方式(無、橫幅、提醒)。

Push.alert("A Message", keystore, password, )false, "7bb8d508e32df651c6c239439737dbd40a88d2461ad2ac1e5dbe49ecea5ccc67");
(3)混合方式

可以在一個Push訊息裡附帶多種資訊,Message, 標記,聲音,可以使用如下代碼.

PushNotificationPayload payload = PushNotificationPayload.complex();payload.addAlert("A Message");payload.addBadge(2);payload.addSound("test.aiff");Push.payload(payload, , keystore, password, false, "7bb8d508e32df651c6c239439737dbd40a88d2461ad2ac1e5dbe49ecea5ccc67");

上面的代碼都有可能會有相應的Exception拋出來,需要處理。更多的使用方式可以參考 http://code.google.com/p/javapns/ 

IOS用戶端接收處理由APNS發來的訊息

(1)當程式未啟動,使用者接收到訊息。需要在AppDelegate中的didFinishLaunchingWithOptions得到訊息內容。代碼如下,

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{    ...        NSDictionary* payload = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];    if (payload)     {    ...    }    ...}

(2)當程式在前台運行,接收到訊息不會有訊息提示(提示框或橫幅)。當程式運行在後台,接收到訊息會有訊息提示,點擊訊息後進入程式,AppDelegate的didReceiveRemoteNotification函數會被調用(需要自己重寫),訊息做為此函數的參數傳入,代碼如下

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)payload{     ...}

(3)無論在哪個函數傳入,訊息總是一個NSDictionary對象,處理方式可以參考如下代碼

- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)payload {    NSLog(@"remote notification: %@",[payload description]);    NSString* alertStr = nil;            NSDictionary *apsInfo = [payload objectForKey:@"aps"];        NSObject *alert = [apsInfo objectForKey:@"alert"];        if ([alert isKindOfClass:[NSString class]])        {               alertStr = (NSString*)alert;        }        else if ([alert isKindOfClass:[NSDictionary class]])        {                NSDictionary* alertDict = (NSDictionary*)alert;                alertStr = [alertDict objectForKey:@"body"];        }            application.applicationIconBadgeNumber = [[apsInfo objectForKey:@"badge"] integerValue];            if ([application applicationState] == UIApplicationStateActive && alertStr != nil)        {        UIAlertView* alertView = [[UIAlertView alloc] initWithTitle:@"Pushed Message" message:alertStr delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];        [alertView show];        }}

 

來自:http://blog.csdn.net/worldmatrix/article/details/7634596

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.