簡介服務器
不少應用都會實現推送功能,咱們能夠集成第三方框架實現推送功能,好比:app
JPush推送:https://www.jpush.cn框架
個推:http://www.getui.comfetch
下面來講說收到推送消息的邏輯處理ui
收到推送消息有三種狀況:spa
一、應用未啓動(默認顯示在通知欄,或者鎖屏時顯示在鎖屏頁面).net
二、應用在後臺掛起(默認顯示在通知欄,或者鎖屏時顯示在鎖屏頁面)code
三、應用在前臺(默認不顯示)blog
點擊推送消息有兩種狀況:事件
一、應用未啓動 -> 啓動
這個時候如論是點擊推送消息打開應用仍是點擊icon打開應用都會調用如下方法:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
}
經過launchOptions判斷應用是點擊推送消息打開應用仍是點擊icon打開應用,點擊推送消息啓動應用會把推送的消息userInfo經過launchOptions參數傳遞過來。
推送是遠程推送:
if (launchOptions) { NSDictionary *userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey]; if (userInfo) { //接收到遠程推送進行相應的邏輯處理 } }
推送是本地推送:
if (launchOptions) { UILocalNotification *notifi = [launchOptions objectForKey:UIApplicationLaunchOptionsLocalNotificationKey]; if (notifi) { //處理本地推送消息 } }
二、應用在後臺 -> 應用在前臺
應用在後臺掛起時點擊推送消息和應用在前臺時收到推送消息,都會調用如下方法:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult result))completionHandler{ }
應用在後臺掛起時默認是不調用該方法的,若是你須要接收到推送消息還沒點擊推送就調用該方法,可讓服務器發給APNS時在aps 字典中加入:
NSInteger state = [UIApplication sharedApplication].applicationState; if (state == UIApplicationStateActive) { //應用在前臺 } else if(state == UIApplicationStateBackground){ //應用在後臺 } else if(state == UIApplicationStateInactive){ //應用從後臺->前臺 }
PS:
最近負責公司項目的推送功能,要求根據推送消息中的「類型」參數判斷具體跳轉位置,項目中使用的是「個推」,下面來簡單說說個推。
個推中有個透傳消息模版,只要應用在前臺就會收到全部發過來的透傳消息(不作任何顯示,顯示須要本身定義),即便關閉推送功能也會收到透傳消息;接受到該消息會調用如下方法:
- (void)GeTuiSdkDidReceivePayload:(NSString *)payloadId andTaskId:(NSString *)taskId andMessageId:(NSString *)aMsgId andOffLine:(BOOL)offLine fromApplication:(NSString *)appId { // [4]: 收到個推消息 NSData *payload = [GeTuiSdk retrivePayloadById:payloadId]; /** *彙報個推自定義事件 *actionId:用戶自定義的actionid,int類型,取值90001-90999。 *taskId:下發任務的任務ID。 *msgId: 下發任務的消息ID。 *返回值:BOOL,YES表示該命令已經提交,NO表示該命令未提交成功。注:該結果不表明服務器收到該條命令 **/ [GeTuiSdk sendFeedbackMessage:90001 taskId:taskId msgId:aMsgId]; }
關於本地推送參考文檔: