iOS APPIcon角标设置为0不影响通知栏消息处理
本地推送UILocalNotification的applicationIconBadgeNumber影响到角标的显示,不出对通知栏的消息造成影响
1)当applicationIconBadgeNumber>0时,角标会随applicationIconBadgeNumber而变化。
2)当applicationIconBadgeNumber=0时,角标维持推送前状态不变。
3)当applicationIconBadgeNumber<0时,角标置0不显示。
2.远程推送的badge字段,只会影响角标的显示,不会影响通知栏的通知处理。
1)当badge>0时,角标会随badge而变化。
2)当badge=0时,角标维持不变。
3)当badge<0时,角标维持不变。
3.UIApplication的applicationIconBadgeNumber属性既会影响角标的显示,又会影响通知栏通知的处理。
1)当applicationIconBadgeNumber>0时,角标会随之变化,通知栏通知不变。
2)当applicationIconBadgeNumber=0时,角标变为0不显示,通知栏通知清空。
3)当applicationIconBadgeNumber<0时,角标变为0不显示,通知栏通知清空。
问题来了,如何处理3中提到的applicationIconBadgeNumber,达到APP Icon上的角标消息在APP从前台切刀后台后,消息提示消失,而不影响通知栏的消息呢?
在duziteng124的一篇博文(地址:http://blog.csdn.net/duziteng124/article/details/50538838)中经过详细讨论,得出如下结论:
一旦将程序的角标从非零置为零,就会清空通知栏的所有通知。如果想清除角标但不清空通知栏,有如下方法。
1.发送一条远程推送,推送内容只有badge,并将badge的值设为负数。此时程序角标会消失但是通知栏的推送消息不清除。
2.同样的方法,发送一条本地推送。
本人采用的是方法2,发送一条本地推,但是经过测试,对于iOS 11.x 系统无效,但是通过尝试发现iOS 11.x 系统只需要将applicationIconBadgeNumber 设为-1既可以清楚icon上的消息提示,同时不清楚通知栏的消息,具体代码如下:
- (void)applicationWillResignActive:(UIApplication *)application {
if ([UIApplication sharedApplication].applicationIconBadgeNumber) {
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 11.0) { [[UIApplication sharedApplication] setApplicationIconBadgeNumber:-1];
} else {
UILocalNotification *localNotification = [[UILocalNotification alloc] init];
// 设置通知的发送时间,单位秒
localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:0.5];
//收到通知时App icon的角标
localNotification.applicationIconBadgeNumber = -1;
// 3.发送通知(🐽 : 根据项目需要使用)
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
}
}
[JPUSHService setBadge:0];
}
本文引用了简书作者tinghua的的文章“iOS推送角标与通知栏变化总结”的文章,附上地址文章地址:https://www.jianshu.com/p/4a835578ea9a
同时引用了duziteng124的一篇博文(地址:http://blog.csdn.net/duziteng124/article/details/50538838)中的讨论结论
验证的系统(机型)如下:iOS8.1.1(iPhone 5s),iOS 9.3.4(iPhone 4s), iOS 10.2(iPhone 6sP), iOS 11.1.1(iPHone 6), iOS11.2(iPhone 8), 也就是说在iOS 11 以下的系统duziteng124方法有效,iOS11及以上的系统需要直接设置[[UIApplication sharedApplication] setApplicationIconBadgeNumber:-1]; 这个或许是系统问题造成的bug,后续系统升级会不会有类似问题,需要再做 验证。仅供参考!