1.有沒有收到通知就馬上調用的方法html
有的。若是您的App打開了background mode裏的Remote Notifications項,那麼當APNS的payload裏指定content-available鍵爲1時,且你的APP在後臺或前臺運行時/甚至你的App沒有運行(但前提是用戶沒有經過強制關閉的方式關掉你的APP,也就是雙擊Home鍵能看到你的APP時),iOS會調用您app delegate裏的ios
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandlerjson
2.若是你的程序在未啓動的時候,若是用戶點擊通知,notification會經過didFinishLaunchingWithOptions:傳遞給您,若是用戶未點擊通知,則didFinishLaunchingWithOptions:的字典裏不會有notification的信息,同理,若是你的程序正在後臺運行,若是用戶點擊通知,則(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo會在你的程序進入前臺後纔會被調用(注意是經過點按通知啓動纔會被調用)若是用戶收到了通知可是沒有點按通知,而是點擊屏幕上的App圖標進入的app,則(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo不會被調用,裏面的代碼不會被執行。app
3.補充:-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo不單單是用戶點擊推送進入app時候會被調用,用戶在前臺的時候收到推送通知的時候,推送不會顯示,可是該過程也會被調用,因此須要在這個地方注意一下。能夠判斷一下程序是剛剛進入前臺,仍是已在前臺。並選擇是否通知viewController。ide
4.fetch
若是程序經過點擊推送啓動,而非從後臺喚醒,那麼userInfo能夠經過 -(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 這個代理方法裏的 launchOptions[@"UIApplicationLaunchOptionsRemoteNotificationKey"] 獲得代理
5.code
- (void)application:(UIApplication *)application handleActionWithIdentifier:(NSString *)identifier forRemoteNotification:(NSDictionary *)userInfo withResponseInfo:(NSDictionary *)responseInfo completionHandler:(void (^)())completionHandler { if ([identifier isEqualToString:foregroundActionidentifier]) { NSLog(@"ios9點擊了前臺模式"); } completionHandler(); }
6.App狀態htm
根據application.applicationState的狀態,判斷執行哪一種動做。開發
UIApplicationStateActive, // 激活狀態,用戶正在使用App UIApplicationStateInactive, // 不激活狀態,用戶切換到其餘App、按Home鍵回到桌面、拉下通知中心 UIApplicationStateBackground // 在後臺運行
7.http://www.cocoachina.com/industry/20140528/8582.html
7.1用戶看到消息以後,點擊了一下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; }
7.2
若是遠程消息發送過來的時候,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]; } }
8.應用圖標上紅色數字消失,設置 UIApplication.applicationIconBadgeNumber 屬性爲0
通常咱們會選擇在應用啓動的時候(application:didFinishLaunchingWithOptions:方法中),或者乾脆一點,在應用每次被切換到前臺的時候(applicationWillEnterForeground:方法中),調用這一行代碼,便可馬上清除掉Badge數字了。
9.應用該怎麼響應推送消息
上面說的處理流程,只能簡單展現一下遠程消息,激活用戶讓他們從新回到app中來。可是有時候,咱們但願帶給用戶更好的使用體驗,譬如若是咱們告訴用戶:張三剛剛評論了你的照片。這時候用戶若是點擊action按鈕進入app,咱們是展現具體的評論頁面爲好,仍是展現一般的啓動頁面而後讓用戶本身去找張三的評論好?我想負責任的開發者都會選擇前者。
要作到靈活響應不一樣類型的通知消息,咱們須要在通知的payload中增長更多信息,而不能僅僅只有alert出來的文字信息。對於AVOS Cloud消息推送平臺來說,就須要開發者使用更高級功能的JSON格式。譬如咱們發送這樣的json字符串{"action":{"type":4},"alert":"hello, everyone」} 最終在app內會收到這樣的UserInfo Dictionary:
{ action = { type = 4; }; aps = { alert = "hello, everyone"; badge = 4; }; }
「hello, everyone」會顯示到alertView中,可是整個Dictionary會經過launchOptions傳遞給application: didFinishLaunchingWithOptions: 方法,這樣咱們在程序裏面就能夠對不一樣的消息實現不一樣的跳轉了。