如果iOS应用需要显示角标(桌面应用图标上的小红点),关键代码就一行(片段1):
[UIApplication sharedApplication].applicationIconBadgeNumber = 3;
但是如果你只调用这句,看不到任何效果,这是为什么呢?
这是因为 iOS 8 以后,需要注册用户通知,以获得用户的授权,这时用户会得到以下通知:
下面是注册通知的代码(片段2):
float version = [[[UIDevice currentDevice] systemVersion] floatValue];
if (version >= 8.0) {
UIUserNotificationSettings *settings = [UIUserNotificationSettings settingsForTypes:UIUserNotificationTypeBadge categories:nil];
[[UIApplication sharedApplication] registerUserNotificationSettings:settings];
[application registerForRemoteNotifications];
}
由此可见,如果用户没有授权之前,就设置applicationIconBadgeNumber,就得不到任何效果,所以注册和设置的时机就显得很重要,一般来说,片段2放入AppDelegate 的didFinishLaunchingWithOptions方法中,这样在程序第一次安装后,就会提示用户授权;片段1放入applicationDidEnterBackground 方法中,这样,程序运行期间的变更会体现在角标上,当然如果角标体现的是网络通知等,请根据实际情况设置。
最后,如果用户点击了“不允许”,再次启动APP,授权对话框和角标设置都不会再次显示,这时可以引导用户前往“设置”打开“通知”开关:
这时,我们可以通过代理判断是否被授权:
- (void)application:(UIApplication *)application didRegisterUserNotificationSettings:(UIUserNotificationSettings *)notificationSettings {
if (!(notificationSettings.types & UIUserNotificationTypeBadge)) { //没有设置角标
NSLog(@"授权失败,引导用户前往设置");
}
}
在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(@"授权成功");
} else {
NSLog(@"授权失败,引导用户前往设置");
}
}];
小结
由于iOS8以后有通知授权的存在,我们需要选择设置角标数值的时机,并在用户拒绝(往往是误点)后,引导用户手动开启通知;为了解决历代通知注册的混乱局面,iOS10引入了统一的通知框架,但可能进一步加深了这种混乱,建议先使用iOS8的方式判断,并为iOS10做好准备,有什么心得,欢迎来评论区一吐为快。