iOS遠程通知與本地通知的相關處理方案

最近的項目,須要對遠程通知進行處理,首先我就不說那些配置證書的流程,以及一些的前期準備工做吧ios

首先我說下處理通知的三種狀況。app

一:app處於前臺的時候收到遠程通知;二:app處理與後臺的時候收到通知;三:app退出了收到通知。這個三種狀況,首先你得知道這三種狀況下,app是如何處理的。fetch

在第一種狀況下:app收到遠程通知會在appdelegate 中處理收到遠程通知的。會直接調用這個方法spa

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
 if (application.applicationState == UIApplicationStateActive) {
 
    }
    else if(application.applicationState == UIApplicationStateInactive)
    {
           
    }
    completionHandler(UIBackgroundFetchResultNewData);
}

在這裏處理收到遠程通知的方法code

在第二種狀況下:app處於後臺狀況下收到遠程通知,會在通知欄中顯示通知的消息。當你點擊通知中心的消息,app就會啓動,而後會調用上面這個方法進行處理。orm

-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
{
 if (application.applicationState == UIApplicationStateActive) {
 
    }
    else if(application.applicationState == UIApplicationStateInactive)
    {
           
    }
    completionHandler(UIBackgroundFetchResultNewData);
}

第三種狀況:在app未啓動的時候收到通知是這樣處理的。當app未啓動的時候,當收到遠程通知的會在通知欄中顯示。當你點擊通知的時候,app就會啓動,這樣就得你手動去判斷是否有通知,手動去調用收到通知如何處理的方法。注意當你app加載到homeViewController的時候在處理,否則的話會形成加載錯誤,處理不成功,那就須要延遲加載,延遲處理收到通知這個方法。下面這段代碼是在AppDelegate中加的get

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
/**
     *  第一次啓動時調用,判斷是否有推送
     */
    NSDictionary *notificationDict = [launchOptions valueForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
    
    if(notificationDict)
    {
        //有推送消息,處理推送的消息
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(4* NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
            [self application:application didReceiveRemoteNotification:notificationDict];
        });
//         [UMFeedback didReceiveRemoteNotification:notificationDict];
        
    }
}

最近咱們這個項目遇到個需求就是當App在前臺的收到通知如何處理?須要在通知欄中顯示。不能在收到通知在app前段有個彈框,這樣就須要咱們的就是講收到的遠程通知轉換成本地通知。這種處理的方法就是將收到的通知轉換成本地通知。這樣的話就會在通知欄中顯示。值得注意的就是我轉換成本地通知連續發兩條通知,當你下拉通知欄,通知消息就會消失,系統自動給你處理了,不會顯示兩條通知消息。it

我是使用下面這個方法生成本地處理的io

// 設置本地通知
- (void)registerLocalNotification:(NSInteger)alertTime
                          withDic:(NSDictionary*)userInfo
                         withBody:(NSString*)body{
    
    UILocalNotification *notification = [[UILocalNotification alloc] init];
    // 設置觸發通知的時間
    NSDate *fireDate = [NSDate dateWithTimeIntervalSinceNow:alertTime];

    notification.fireDate = fireDate;
    notification.repeatCalendar=[NSCalendar currentCalendar];
    // 時區
    notification.timeZone = [NSTimeZone defaultTimeZone];
    // 設置重複的間隔

    // ios8後,須要添加這個註冊,才能獲得受權
    if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) {
        // 通知重複提示的單位,能夠是天、周、月
        notification.repeatInterval = NSCalendarUnitDay;
    } else {
        // 通知重複提示的單位,能夠是天、周、月
        notification.repeatInterval = NSDayCalendarUnit;
    }

    
    // 通知參數
    
    [notification setUserInfo: userInfo];
    
    notification.alertBody = body;

    notification.soundName = @"msg.caf";

       // 執行通知註冊
    [[UIApplication sharedApplication] scheduleLocalNotification:notification];

}

而後若是在前臺收到通知,且轉成本地通知,此時將app退出。若是這時將app退出的換點擊通知的,啓動app,那樣的話就會丟失信息。所以咱們須要像app未啓動收到遠程通知那樣處理。這個是判斷啓動app是否收到本地通知ast

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
 UILocalNotification * notificationLocalDict = [launchOptions valueForKey:UIApplicationLaunchOptionsLocalNotificationKey];
    if (notificationLocalDict!=nil) {
        if (APPDELEGATE.viewController.JPushData == nil) {
            [APPDELEGATE.viewController handleJPushData:notificationLocalDict.userInfo];
        }
    }
}

下面是處理當咱們收到通知如何處理的重點內容。

首先咱們收到通知,點擊通知就會走到響應的頁面中去,而後推出根據推送的內容,請求數據展現出來。這樣就須要咱們獲取相應的頁面知道在那跳轉。在這三種情形下,是這樣處理的。首先咱們都是基於window的rootViewController,進行操做的,首先咱們獲取相應選中的tabbar selectIndex ,而後獲取你的這個navController 的最後一個視圖,在這個視圖上present 或者push出來。這個提及來仍是挺簡單的。不說了,仍是貼代碼

-(void)toJpushDetail
{
    id curViewController;
    if (self.homeController!=nil) {
        switch (self.homeController.tabBarController.selectedIndex) {
            case 0:
                curViewController = [self.homeController.homeVC.navigationController.viewControllers lastObject];
                
                break;
            case 1:
                curViewController = [self.homeController.findMessageVC.navigationController.viewControllers lastObject];
                break;
            case 2:
                curViewController = [self.homeController.myCenterVC.navigationController.viewControllers lastObject];
                break;
            default:
                break;
        }
    }
    
    if (curViewController!=nil) {
        [self performSelector:@selector(toDetails:) withObject:curViewController afterDelay:0.5];
    }
}
相關文章
相關標籤/搜索