iOS如何優(yōu)雅地消除應用角標詳解
前言
我們在完善推送功能的時候不光考慮能不能完成功遠程推送,還要注意的是用戶的體驗問題,首先最需要關注的就是應用角標問題。
應用角標
1>何為應用角標
應用角標就是底下截圖這哥們,本初截圖是MAC上截的,手機上也是一樣的效果:

2>應用角標原理
應用角標其實是由系統(tǒng)設置的,APNs將推送的消息傳送到系統(tǒng)的時候根據(jù)上面的消息payload內容中的badge數(shù)值來給應用的圖標賦值,這樣應用的HomeScreen上顯示的圖標右上角就會出現(xiàn)相應的數(shù)字,不管你應用啟動沒啟動都會顯示相應的數(shù)字。所以如果是我們自己后臺來實現(xiàn)這個推送功能的話,那么就需要一套角標邏輯來完善用戶體驗了。
消除角標
一般情況下,我們都會用此方法來消除角標:
[UIApplication sharedApplication].applicationIconBadgeNumber = 0;
然而這種方法會使得系統(tǒng)通知欄的歷史推送消息全部被清除。
試了下即使用 iOS 10 的消息推送框架 UserNotification 也存在這種情況。
會造成相同效果的還有
[UIApplication sharedApplication].scheduledLocalNotifications = nil;
解決方案:
- (void)applicationDidEnterBackground:(UIApplication *)application {
UILocalNotification *clearEpisodeNotification = [[UILocalNotification alloc] init];
clearEpisodeNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:1];
clearEpisodeNotification.timeZone = [NSTimeZone systemTimeZone];
clearEpisodeNotification.applicationIconBadgeNumber = -1;
[[UIApplication sharedApplication] scheduleLocalNotification: clearEpisodeNotification];
}
在程序退到后臺后,添加該通知。
關鍵的地方在于 applicationIconBadgeNumber 是 -1。
接著你可以看到紅點帶著動畫優(yōu)雅地消失了,
同時,歷史推送消息被保留了下來。
不過,上述這個方式到 iOS 11 就失效了。
本來以為沒轍了,直到發(fā)現(xiàn)某個新聞客戶端仍然可以實現(xiàn)。
于是,我反編譯了該新聞客戶端。
從 applicationDidEnterBackground 入手,很快就找到了相關代碼。


那么答案就出來了,直接使用 UserNotifications 即可,猜測 badge 應該還是 -1。
- (void)applicationDidEnterBackground:(UIApplication *)application {
UNMutableNotificationContent *content = [[UNMutableNotificationContent alloc] init];
content.badge = @(-1);
UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:@"clearBadge" content:content trigger:nil];
[[UNUserNotificationCenter currentNotificationCenter] addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
}];
}
最后記得不要設置 title,否則會收到空白通知。
參考資料:https://stackoverflow.com/questions/5375355/clear-app-badge-with-local-notifications
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關文章
Objective-C的緩存框架EGOCache在iOS App開發(fā)中的使用
這篇文章主要介紹了Objective-C的緩存框架EGOCache在iOS App開發(fā)中的使用,重點講解了EGOCache對緩存過期時間的檢測及處理,需要的朋友可以參考下2016-05-05
ios 不支持 iframe 的完美解決方法(兼容iOS&安卓)
下面小編就為大家?guī)硪黄猧os 不支持 iframe 的完美解決方法(兼容iOS&安卓)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-07-07
IOS中NSPredicate和NSRegularExpression校驗正則表達式區(qū)別
本文文章通過實例代碼給大家講述了在IOS開發(fā)中NSPredicate和NSRegularExpression校驗正則表達式區(qū)別,需要的朋友趕快學習下吧。2018-01-01

