第一篇文章阵翎,來寫點近來接觸比較多的推送消息處理的一些東西吧辩恼。
本文主要說的是接收到推送消息的處理,至于集成比較簡單书释,不再本文探討范圍之內址遇,網上也有很多文章浸剩。在此假設你已經成功集成了某個第三方推送十籍,那么接收到消息怎么處理,是本文所要講述的漾抬。好了,各位看官,走起!
首先接收到推送消息的時候你的APP處于這三種狀態(tài)中的一個:1.程序未啟動米同,退出狀態(tài) ;2.程序在后臺掛起 ;3:程序在前臺運行 。啟動APP分為兩種:1.點擊推送消息;2.點擊應用圖標涯曲。查看了一些應用,點擊應用圖標進入的基本上都沒做什么人性化處理(這個基本上受限于蘋果态兴,開發(fā)者也沒什么能做的)瞻润,所以本文對點擊應用圖標進入APP未做深入研究傻铣,著重研究了點擊推送消息進入两踏。
1.程序未啟動赡麦,退出狀態(tài)
這個時候收到推送消息超歌,無論是點擊推送消息啟動應用還是點擊了應用圖標啟動了應用懊悯,都會調用
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:
(nullable NSDictionary *)launchOptions NS_AVAILABLE_IOS(3_0);
這個方法來啟動程序,兩者區(qū)別在于點擊推送消息啟動應用會把推送的消息userInfo通過launchOptions參數傳遞過來
if (launchOptions) {
NSDictionary *dicUserInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
}
可以通過這個參數是否為空來判斷程序是否是點擊推送消息啟動了應用梦皮。launchOptions有幾個key:
- UIApplicationLaunchOptionsRemoteNotificationKey返回一個遠程推送的userInfo字典類型參數炭分;
- UIApplicationLaunchOptionsLocalNotificationKey返回一個UILocalNotificat
ion對象;
還有別的剑肯,大家可以google下捧毛。得到了遠程推送的字典,就可以根據需求做處理了。
2.程序在后臺掛起
3.程序在前臺運行
①- (void)application:(UIApplication *)application didReceiveRemoteNotification: (NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler NS_AVAILABLE_IOS(7_0) __TVOS_PROHIBITED;
②- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo NS_AVAILABLE_IOS(3_0) __TVOS_PROHIBITED;
第二種呀忧,第三種师痕,放在一起來說,方法①是ios7新加入的方法而账,并且如果實現了方法①那么方法②就被覆蓋掉不再執(zhí)行了胰坟,方法①以有幾個特性:當程序在前臺運行時,收到遠程推送福扬,會立刻調用此方法腕铸,但是如果程序在后臺掛起,收到消息(未點擊推送消息時)并不會執(zhí)行方法①铛碑,如果想在收到消息的時候有需求需要執(zhí)行一些代碼狠裹,那么可以讓服務器發(fā)給APNS時在aps 字典中加入
aps = {
content-available = 1;
}
這個字段,那么當應用在后臺掛起時接收到推送消息時就會立即執(zhí)行方法①汽烦,當然涛菠,當你再點擊推送消息時,還會再執(zhí)行一次(這兩種情況可以根據applicationState這個屬性區(qū)分)撇吞,而方法②只會在點擊推送消息俗冻,或者應用在前臺運行時接收到消息時才會調用。
如果你有需求牍颈,當應用在前臺運行時接收到推送消息也希望有類似遠程推送那樣迄薄,我想的方法是程序在前臺運行,收到推送消息煮岁,那么給他轉化成本地通知
if (application.applicationState == UIApplicationStateActive) {
UILocalNotification *localNotification = [[UILocalNotification alloc] init];
localNotification.userInfo = userInfo;
localNotification.soundName = UILocalNotificationDefaultSoundName;
localNotification.alertBody = [[userInfo objectForKey:@"aps"] objectForKey:@"alert"];
localNotification.fireDate = [NSDate date];
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
}
//如果是在后臺掛起讥蔽,用戶點擊進入是UIApplicationStateInactive這個狀態(tài)
else if (application.applicationState == UIApplicationStateInactive){
//......
}
有個問題存在就是程序在前臺接收到推送消息轉化成本地推送后雖然通知中有這條消息,但是并不會在程序上邊有一個橫幅提示画机,如果想實現跟遠程推送一樣的效果冶伞,那么需要自己來自定義一個View,然后加一個顯示消失動畫步氏。
歡迎對推送消息處理有深入研究留言討論响禽,本文如有不對地方歡迎指正。
以上