接收到通知時有兩種進入的方式:
1.當app未運行時
(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions;launchOptions不會為空,就可以根據launchOptions是否為空來判斷是否有推送消息,當launchOptions不為空時,你就可以發一個通知,可以再rootViewController中接收通知執行響應的操作。
2.當app在后台運行時
激活APP時會走
-(void)applicationDidBecomeActive:(UIApplication *)application;這個方法,在這里面里可以對推送消息做響應的處理
我們可以設想一下消息通知的幾種使用場景:
1,在app沒有被啟動的時候,接收到了消息通知。這時候操作系統會按照默認的方式來展現一個alert消息,在app icon上標記一個數字,甚至播放一段聲音。
2,用戶看到消息之后,點擊了一下action按鈕或者點擊了應用圖標
如果action按鈕被點擊了,系統會通過調用application:didFinishLaunchingWithOptions:這個代理方法來啟動應用,並且會把notification的payload數據傳遞進去。
如果應用圖標被點擊了,系統也一樣會調用application:didFinishLaunchingWithOptions:這個代理方法來啟動應用,唯一不同的是這時候啟動參數里面不會有任何notification的信息。
示例代碼如下:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// do initializing works
...
if (launchOptions) {
// do something else
...
[AVAnalytics trackAppOpenedWithLaunchOptions:launchOptions];
}
[application registerForRemoteNotificationTypes:UIRemoteNotificationTypeBadge | UIRemoteNotificationTypeAlert | UIRemoteNotificationTypeSound];
return YES;
}
3,如果遠程消息發送過來的時候,app正在運行,這時候會發生什么呢?
app代理的application:didReceiveRemoteNotification:方法會被調用,同時遠程消息中的payload數據會作為參數傳遞進去。
示例代碼如下:
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo {
if (application.applicationState == UIApplicationStateActive) {
// 轉換成一個本地通知,顯示到通知欄,你也可以直接顯示出一個alertView,只是那樣稍顯aggressive:)
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];
} else {
[AVAnalytics trackAppOpenedWithRemoteNotificationPayload:userInfo];
}
}