1. 程式人生 > >極光推送 接收到推送訊息後處理方法

極光推送 接收到推送訊息後處理方法

本文主要說下極光推送,首先整合方面按照官方文件就很容易搞定,樓主第一次整合的時候問題出在證書上面,蘋果開發者中心的app id和Provisioning Profile沒有對上,注意遠端推送的Provisioning Profile不能是帶萬用字元的,好了本文現在假設你已經成功集成了極光推送,那麼接收到訊息怎麼處理,是本文所要講述的。首先接收到訊息的時候你的程式可能處於三種狀態,1:程式未啟動,退出狀態 2:程式在後臺掛起  3:程式在前臺執行

其實細分每種下邊還有兩種:是點選了推送資訊還是點選了應用圖示?因為查看了一些應用,點選應用程式圖示進入的基本上都沒做什麼人性化處理(這個基本上受限於蘋果,開發者也沒什麼能做的),所以本文未對點選應用圖示做深入研究,只研究了點選推送訊息進入

首先第一種1:程式未啟動,退出狀態

這個時候收到推送訊息,無論是點選推送訊息啟動應用還是點選了應用圖示啟動了應用,都會呼叫

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

方法來載入程式,兩者區別在於點選推送訊息啟動應用會把推送的訊息userInfo通過launchOptions引數傳遞過來

if (launchOptions) {
        NSDictionary *dicUserInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
        [self application:application userInfo:dicUserInfo];

    }


可以通過這個引數是否為空來判斷程式是否是點選推送訊息啟動了應用,然後launchOptions有幾個key,

UIApplicationLaunchOptionsRemoteNotificationKey -返回一個遠端推送的userInfo字典型別引數

UIApplicationLaunchOptionsLocalNotificationKey-返回一個UILocalNotification物件

還有別的,大家可以google下

得到了遠端推送的字典,大家就可以根據需求做處理了

這裡是程式未啟動情況

第二種,第三種,放在一起來說

①- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler NS_AVAILABLE_IOS(7_0);

②-(void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)deviceToken

方法①是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){

//............

    }

if語句內是把遠端推送轉化成了本地推送,else if 內是程式掛起時點選推送訊息進入程式所要做的事,else if 內對程式在後臺執行的情況做了處理

以上就是對遠端推送的三種狀態處理方法

有個問題存在就是程式在前臺接收到推送訊息轉化成本地推送後雖然通知中有這條訊息,但是並不會再程式上邊出來一個提示,但如果想實現跟遠端推送一樣的效果,那麼需要自己來自定義一個UIButton(為了可以點選),然後加一個動畫

說的有些亂,因為需求比較BT,對推送訊息處理也做了些研究,暫且記錄這麼多吧

歡迎對推送訊息處理有深入研究留言討論