我這兩天都在改這麼個東西:#
需要根據推送消息,在下方的 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 上朋友發我一張這個圖片:
上圖中最後一句,根據通知的 badge 來判斷是否有通知,然後發請求獲取數據。在我看來,很有道理哦,這個方法不錯。但是,後台還是那句話,不行,所以就你懂的砍需求了