討論一下最近遇到的兩個問題:web
理想狀況是:服務器
考慮第一種狀況,咱們須要拿到數據,才能生成相應提示。與此相關的有兩個方法:app
方法1.-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
ide
方法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時,你可能想要展現關於這條通知的內容,好比推送了一條商品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 }
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo fetchCompletionHandler:(void (^)(UIBackgroundFetchResult))completionHandler
中解決。須要支持iOS7以前版本,不須要"iOS 7 Background Remote Notification"這種通知。
-(void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
中接收通知。- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
拿到通知數據。須要支持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
中都能得到此條通知數據。
-(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,拿數據並處理,反之跳過不處理。