我們在做遠程通知時,從服務端發來的通知,我們的設備狀態可以分爲幾種狀態,如下:
1. 應用還沒有加載,即應用既不在前臺,也不在後臺運行
這時如果點擊通知的顯示按鈕,或者是圖標icon,會調用didFinishLaunchingWithOptions,不會調用didReceiveRemoteNotification方法。
如果點擊通知的關閉按鈕,再點擊應用,只會調用didFinishLaunchingWithOptions方法。
我們需要做的是在這個方法只能通過關鍵字獲取APNS的消息內容。
//第一次從通知欄進入
if ([[launchOptions allKeys] containsObject:UIApplicationLaunchOptionsRemoteNotificationKey]) {
NSDictionary *remoteNotification = [launchOptions objectForKey: UIApplicationLaunchOptionsRemoteNotificationKey];
}
2. 應用在前臺(foreground)
這時如果收到通知,會觸發didReceiveRemoteNotification方法。我們只需要在這個方法中獲取對應消息數據,在我們ui層面做相應操作就可以了。我建議的做法是用NSNotificationCenter。
3.應用在後臺
(1)此時如果收到消息通知,點擊通知欄消息按鈕,會調用didReceiveRemoteNotification方法。
(2)通過點擊圖標icon啓動應用,則didFinishLaunchingWithOptions和didReceiveRemoteNotification都不會調用,那麼我們就不能通過回調方法獲取對應消息內容了,此時的解決辦法是,根據發過來通知中的badge進行判斷是否有通知,在應用進入後臺時,標記當前時間,應用再次啓動時,通過我們標記的時間,到目前時間段,在服務端後臺做已發消息內容數據的請求。
應用進入後臺調用:applicationDidEnterBackground,在此方法中做時間標記
應用啓動會調用:applicationWillEnterForeground和applicationDidBecomeActive,做數據請求