[iOS]推送相關兩點

 

 

討論一下最近遇到的兩個問題:web

  • 推送接收

  • 點擊推送打開APP時數據的處理

理想狀況是:服務器

  1. app處於活躍狀態,有推送到來,在應用內部應當彈出咱們本身生成的提示。
  2. app處於非活躍狀態,有推送到來,彈出系統生成的提示,點擊提示會進入app而且顯示相關內容。

推送接收

考慮第一種狀況,咱們須要拿到數據,才能生成相應提示。與此相關的有兩個方法:app

方法1.-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfoide

方法2.-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler函數

這兩個方法看起來比較眼熟,區別在於哪裏呢?第二個方法是iOS7以後纔出現的,與之相關的是 "iOS 7 Background Remote Notification"這種類型的通知,它容許應用收到通知後在後臺(background)狀態下運行一段代碼,可用於從服務器獲取內容更新。功能使用場景:(多媒體)聊天,Email更新,基於通知的訂閱內容同步等功能,提高了終端用戶的體驗。fetch

若是你用到了這個類型的通知,須要在Xcode 中 Capabilities找到 Backgroud Modes,在 Remote notifications打鉤,這樣就開啓了"Background Remote Notification",以後notification 處理函數一概切換第二個方法,咱們應該在這裏拿數據。this

若是你沒有使用這種類型的通知,你在兩個在這兩個方法裏二選一(Apple推薦第二個方法),若是兩個方法都實現了,會默認調用第二個方法。spa

If your delegate implements both methods, the app object calls the application:didReceiveRemoteNotification:fetchCompletionHandler: method.code

 

點擊推送打開APP時數據的處理

當用戶點擊通知進入app時,你可能想要展現關於這條通知的內容,好比推送了一條商品A的打折信息,用戶點擊通知進入應用後彈出一個Alert:「商品A打折,是否查看?」。在第二個方法的文檔裏有這樣一段話orm

If the user opens your app from the system-displayed alert, the system may call this method again when your app is about to enter the foreground so that you can update your user interface and display information pertaining to the notification 意思是當用戶點擊通知進入app時,會 再次 調用這個方法(之因此用再次這個詞,是由於以前說過,若是你的應用處於後臺狀態而且收到"iOS 7 Background Remote Notification"這種通知,會調用這個方法)。若是你的iOS版本小於iOS7,這個方法就不能使用,你能夠在啓動方法
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 中拿到推送的數據:

NSDictionary* userInfo = [launchOptions objectForKey:UIApplicationLaunchOptionsRemoteNotificationKey];
if(userInfo){
//do something
}

 

結論

  1. 若是不考慮小於iOS7的版本,全部的問題能夠在方法 -(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler 中解決。
  2. 須要支持iOS7以前版本,不須要"iOS 7 Background Remote Notification"這種通知。

    • 不實現上面第二個方法,在第一個方法-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo中接收通知。
    • 用戶點擊通知打開app時,在方法 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions拿到通知數據。
  3. 須要支持iOS7以前版本,同時須要"iOS 7 Background Remote Notification"這種通知。

    這時比較容易出現重複處理的狀況,如iOS7中點擊推送進入app,在方法2-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler和啓動方法- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions中都能得到此條通知數據。

    • 在方法1.-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo和推送接收方法2.-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler中都得到通知內容並處理(不一樣版本會調用不一樣方法,不會重複調用)。
    • 在啓動方法- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 中拿到推送的數據,判斷系統版本,若是小於iOS7,拿數據並處理,反之跳過不處理。
相關文章
相關標籤/搜索