今是昨非

今是昨非

日出江花红胜火,春来江水绿如蓝

推送處理

我這兩天都在改這麼個東西:#

需要根據推送消息,在下方的 tabbar 上顯示提示紅點。即:接收到推送消息,當點擊推送消息時,跳轉對應界面;點擊程序圖標進入程序時,顯示提示的小紅點。

前記#

我記得我之前做的推送處理,分為三種情況,這個我記得很清楚,因為我第一次面試在北京的車庫咖啡,被人問到了這個問題,但是我沒答出來,因為那時候我確實都沒做過推送處理;後來進了第一家公司,有個好的產品,然後剛好有這個需求,然後就 get 了這個技能。

a. 程序在後台,接收到推送消息,點擊推送消息,走的是


// 程序在運行時接收到通知
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    ...
    [self receivePush:self.userInfo];
}

b. 程序在前台,接收到推送消息,彈窗提示/直接處理,對應的方法還是


// 程序在運行時接收到通知
- (void)application:(UIApplication *)application didReceiveRemoteNotification:(NSDictionary *)userInfo
{
    ...
    [self receivePush:self.userInfo];
}

c. 程序被 kill 掉了,接收到推送消息,點擊推送消息,對應的方法是


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    if (launchOptions && [[launchOptions allKeys] containsObject:@"UIApplicationLaunchOptionsRemoteNotificationKey"]) {
        NSMutableDictionary * userInfo = [launchOptions objectForKey:@"UIApplicationLaunchOptionsRemoteNotificationKey"];
        [self receivePush:userInfo];
    }
}

Now#

所以當我看到這個需求時,沒太在意,以為跟以前一樣,能夠實現。但是寫著寫著,發現不對的地方了。以前關注的是點擊推送消息的處理,現在不光要有點擊推送消息的處理,還有沒點擊推送消息時的處理。。。。。So,想想能不能實現,然後我想既然被 kill 掉能走 application:didFinishLaunchingWithOptions: 這個方法,帶的都有推送參數,那沒點擊推送消息應該也沒問題。

然而事實證明,我還是太天真了,我今天仔細測試了一下,發現,

application:didFinishLaunchingWithOptions: 這個方法當程序被 kill 掉,點擊推送消息進入時,Options 裡有推送的信息;但是,** 當不點擊推送消息,直接進入程序時,Options 裡是沒有推送信息的。** 所以單單憑推送,這個需求是不能實現的。那怎麼辦?

Result#

再回過頭看看需求,關鍵問題是,當我點擊程序圖標進入程序時,我不知道推送的參數,沒有辦法判斷應不應該顯示小紅點。
所以,再單獨讓後台來個請求,返回給我個應不應該顯示小紅點的參數;但是這樣還有個問題是,什麼時候請求?我最開始想的是,程序被 kill 掉/在後台,點擊打開的時候都應該刷新小紅點,所以在 applicationWillEnterForeground: 請求,但是這樣的話,請求未眠也太頻繁了點;而且後台說本來推送對性能要求都比較高,你再這樣查詢,不行!

然後,QQ 上朋友發我一張這個圖片:
1.jpg
上圖中最後一句,根據通知的 badge 來判斷是否有通知,然後發請求獲取數據。在我看來,很有道理哦,這個方法不錯。但是,後台還是那句話,不行,所以就你懂的砍需求了
1.gif

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。