接收到推送消息處理方法

原文地址:http://www.jianshu.com/p/efeba5d8a304

第一篇文章,來寫點近來接觸比較多的推送消息處理的一些東西吧。
  本文主要說的是接收到推送消息的處理,至於集成比較簡單,不再本文探討範圍之內,網上也有很多文章。在此假設你已經成功集成了某個第三方推送,那麼接收到消息怎麼處理,是本文所要講述的。好了,各位看官,走起!
  首先接收到推送消息的時候你的APP處於這三種狀態中的一個:1.程序未啓動,退出狀態 ;2.程序在後臺掛起 ;3:程序在前臺運行 。啓動APP分爲兩種:1.點擊推送消息;2.點擊應用圖標。查看了一些應用,點擊應用圖標進入的基本上都沒做什麼人性化處理(這個基本上受限於蘋果,開發者也沒什麼能做的),所以本文對點擊應用圖標進入APP未做深入研究,着重研究了點擊推送消息進入。

1.程序未啓動,退出狀態

  這個時候收到推送消息,無論是點擊推送消息啓動應用還是點擊了應用圖標啓動了應用,都會調用

- (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返回一個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新加入的方法,並且如果實現了方法①那麼方法②就被覆蓋掉不再執行了,方法①以有幾個特性:當程序在前臺運行時,收到遠程推送,會立刻調用此方法,但是如果程序在後臺掛起,收到消息(未點擊推送消息時)並不會執行方法①,如果想在收到消息的時候有需求需要執行一些代碼,那麼可以讓服務器發給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,然後加一個顯示消失動畫。
  歡迎對推送消息處理有深入研究留言討論,本文如有不對地方歡迎指正。

  以上



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章