ios-app殺死狀態下響應推送

今天填了一個坑,我們app很久之前就有推送功能代碼,但是沒有太多的實際的推送功能,然後突然發現一個bug,app在殺死狀態下接收到推送進入app無法響應跳轉。不好填是因爲需要殺死app測試,很不好調試,最後用Hud屏幕打印各種東西才找到原因。

首先摘取一篇優秀的博客內容,梳理一下app在各種情況接收到推送響應過程。

設備接到apns發來的通知,應用處理通知有以下幾種情況:

1.應用還沒有加載

這時如果點擊通知的顯示按鈕,會調用didFinishLaunchingWithOptions,不會調用didReceiveRemoteNotification方法。
如果點擊通知的關閉按鈕,再點擊應用,只會調用didFinishLaunchingWithOptions方法。

2. 應用在前臺(foreground)

這時如果收到通知,會觸發didReceiveRemoteNotification方法。

3.應用在後臺

1.此時如果收到通知,點擊顯示按鈕,會調用didReceiveRemoteNotification方法。
2.點擊關閉再點擊應用,則上面兩個方法都不會被調用這時,只能在applicationWillEnterForeground或者applicationDidBecomeActive,根據發過來通知中的badge進行判斷是否有通知,然後發請求獲取數據

如第一種所說,didFinishLaunchingWithOptions會被調用但是didReceiveRemoteNotification不會被調用,這個需要特殊解決,但是之前的人寫了相關解決代碼,但是不是不執行跳轉的原因,但是還是先貼一下代碼

if (launchOptions != nil) {
        //app關閉時,收到推送
        [self application:application didReceiveRemoteNotification:launchOptions[@"UIApplicationLaunchOptionsRemoteNotificationKey"]];
    }

雖然不執行didReceiveRemoteNotification,但是可以從launchOptions中拿到推送,自己手動執行一下即可。

然後最後找到原因是因爲我們在處理跳轉的時候沒有考慮到當app被殺死執行到推送跳轉頁面的時候app還沒執行到主界面,但是這裏卻加了判斷

if ([[DataManager sharedDataManager].mainWindow.rootViewController isKindOfClass:[RootTabController class]]){
    // 判斷跳轉操作
}

執行到這裏的時候,rootViewController並不是RootTabController,這個時候的window上應該是廣告頁。
然後最後採取的方法是上的的判斷加else,如果不是的話加一個監聽,當進入到app首頁後發出通知,然後再此處接收到通知重新執行一次判斷跳轉操作的代碼,不知道還有沒有更科學的處理方式

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章