IOS推送功能的實現(javapns)


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM