本文主要說的是接收到推送消息的處理,至于集成比較簡單,不再本文探討范圍之內,網上也有很多文章。在此假設你已經成功集成了某個第三方推送,那么接收到消息怎么處理,是本文所要講述的。好了,各位看官,走起! 首先接收到推送消息的時候你的APP處于這三種狀態中的一個:1.程序未啟動,退出狀態 ;2.程序在后臺掛起 ;3:程序在前臺運行 。啟動APP分為兩種:1.點擊推送消息;2.點擊應用圖標。查看了一些應用,點擊應用圖標進入的基本上都沒做什么人性化處理(這個基本上受限于蘋果,開發者也沒什么能做的),所以本文對點擊應用圖標進入APP未做深入研究,著重研究了點擊推送消息進入。
這個時候收到推送消息,無論是點擊推送消息啟動應用還是點擊了應用圖標啟動了應用,都會調用
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:    (nullable NSDictionary *)launchOptions NS_AVAILABLE_IOS(3_0);這個方法來啟動程序,兩者區別在于點擊推送消息啟動應用會把推送的消息userInfo通過launchOptions參數傳遞過來 if (launchOptions) {        NSDictionary *dicUserInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];    }可以通過這個參數是否為空來判斷程序是否是點擊推送消息啟動了應用。launchOptions有幾個key:
UIApplicationLaunchOptionsRemoteNotificationKey返回一個遠程推送的userInfo字典類型參數;UIApplicationLaunchOptionsLocalNotificationKey返回一個UILocalNotification對象;還有別的,大家可以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新加入的方法,并且如果實現了方法①那么方法②就被覆蓋掉不再執行了,方法①以有幾個特性:當程序在前臺運行時,收到遠程推送,會立刻調用此方法,但是如果程序在后臺掛起,收到消息(未點擊推送消息時)并不會執行方法①,如果想在收到消息的時候有需求需要執行一些代碼,那么可以讓服務器發給APNS時在aps 字典中加入aps = {        content-available = 1;    }這個字段,那么當應用在后臺掛起時接收到推送消息時就會立即執行方法①,當然,當你再點擊推送消息時,還會再執行一次(這兩種情況可以根據applicationState這個屬性區分),而方法②只會在點擊推送消息,或者應用在前臺運行時接收到消息時才會調用。  如果你有需求,當應用在前臺運行時接收到推送消息也希望有類似遠程推送那樣,我想的方法是程序在前臺運行,收到推送消息,那么給他轉化成本地通知    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這個狀態    else if (application.applicationState == UIApplicationStateInactive){        //......    }有個問題存在就是程序在前臺接收到推送消息轉化成本地推送后雖然通知中有這條消息,但是并不會在程序上邊有一個橫幅提示,如果想實現跟遠程推送一樣的效果,那么需要自己來自定義一個View,然后加一個顯示消失動畫。轉自:http://www.jianshu.com/p/efeba5d8a304
新聞熱點
疑難解答