最近的項目,須要對遠程通知進行處理,首先我就不說那些配置證書的流程,以及一些的前期準備工做吧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]; } }