关于iOS的推送角标,实在是比较坑爹
对于apns来讲,如果app收到了多条推送,推送通知栏会有多条消息,当用户启动app,我们最常用的方式就是调用下面的方法清空角标 :
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
在进入后台一看,嗯,确实清掉了角标
拉开通知中心一看,尼玛,推送呢? 一条也没了。。。
那么如何在不影响通知栏消息的基础上清掉角标呢?
变化规律
- 本地推送UILocalNotification的applicationIconBadgeNumber属性只会影响角标的显示,不会影响通知栏的通知处理。
- 当applicationIconBadgeNumber>0时,角标会随applicationIconBadgeNumber而变化。
- 当applicationIconBadgeNumber=0时,角标维持推送前状态不变。
- 当applicationIconBadgeNumber<0时,角标置0不显示。
- 远程推送的badge字段,只会影响角标的显示,不会影响通知栏的通知处理。
- 当badge>0时,角标会随badge而变化。
- 当badge=0时,角标维持不变。
- 当badge<0时,角标维持不变。
- UIApplication的applicationIconBadgeNumber属性既会影响角标的显示,又会影响通知栏通知的处理。
- 当applicationIconBadgeNumber>0时,角标会随之变化,通知栏通知不变。
- 当applicationIconBadgeNumber=0时,角标变为0不显示,通知栏通知清空。
- 当applicationIconBadgeNumber<0时,角标变为0不显示,通知栏通知清空。
这时一个优雅的方案就出现了:
- (void)applicationDidEnterBackground:(UIApplication *)application {
//清空徽标 - 会保留通知栏信息
if (application.applicationIconBadgeNumber <= 0) {
return;
}
UILocalNotification *local = [[UILocalNotification alloc] init];
local.fireDate = [NSDate date];
local.applicationIconBadgeNumber = -1; // 置空
[application scheduleLocalNotification:local];
}
如此以来 ,再也不用担心通知中心被清空啦~~~