推送隨記

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: 方法,這樣咱們在程序裏面就能夠對不一樣的消息實現不一樣的跳轉了。

相關文章
相關標籤/搜索