如果iOS應(yīng)用需要顯示角標(桌面應(yīng)用圖標上的小紅點)桥嗤,關(guān)鍵代碼就一行(片段1):
[UIApplication sharedApplication].applicationIconBadgeNumber = 3;
但是如果你只調(diào)用這句监右,看不到任何效果,這是為什么呢丘跌?
這是因為 iOS 8 以后,需要注冊用戶通知唁桩,以獲得用戶的授權(quán)闭树,這時用戶會得到以下通知:
下面是注冊通知的代碼(片段2):
float version = [[[UIDevice currentDevice] systemVersion] floatValue];
if (version >= 8.0) {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
[application registerForRemoteNotifications];
}
由此可見,如果用戶沒有授權(quán)之前荒澡,就設(shè)置applicationIconBadgeNumber蔼啦,就得不到任何效果,所以注冊和設(shè)置的時機就顯得很重要仰猖,一般來說捏肢,片段2放入AppDelegate 的didFinishLaunchingWithOptions方法中,這樣在程序第一次安裝后饥侵,就會提示用戶授權(quán)鸵赫;片段1放入applicationDidEnterBackground 方法中,這樣躏升,程序運行期間的變更會體現(xiàn)在角標上辩棒,當然如果角標體現(xiàn)的是網(wǎng)絡(luò)通知等,請根據(jù)實際情況設(shè)置膨疏。
最后一睁,如果用戶點擊了“不允許”,再次啟動APP佃却,授權(quán)對話框和角標設(shè)置都不會再次顯示者吁,這時可以引導(dǎo)用戶前往“設(shè)置”打開“通知”開關(guān):
這時,我們可以通過代理判斷是否被授權(quán):
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
if (!(notificationSettings.types & UIUserNotificationTypeBadge)) { //沒有設(shè)置角標
NSLog(@"授權(quán)失敗饲帅,引導(dǎo)用戶前往設(shè)置");
}
}
在iOS10 后复凳,蘋果引入了一個管理通知的框架UserNotifications.framework,所以iOS10 以上可以這樣判斷:
#import <UserNotifications/UserNotifications.h>
...
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
[center requestAuthorizationWithOptions:(UNAuthorizationOptionBadge | UNAuthorizationOptionSound | UNAuthorizationOptionAlert) completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (granted) {
NSLog(@"授權(quán)成功");
} else {
NSLog(@"授權(quán)失敗灶泵,引導(dǎo)用戶前往設(shè)置");
}
}];
小結(jié)
由于iOS8以后有通知授權(quán)的存在育八,我們需要選擇設(shè)置角標數(shù)值的時機,并在用戶拒絕(往往是誤點)后赦邻,引導(dǎo)用戶手動開啟通知髓棋;為了解決歷代通知注冊的混亂局面,iOS10引入了統(tǒng)一的通知框架惶洲,但可能進一步加深了這種混亂按声,建議先使用iOS8的方式判斷,并為iOS10做好準備湃鹊,有什么心得儒喊,歡迎來評論區(qū)一吐為快。