我已经找到、实现并测试了一个“解决方法”,可以(似乎)自动增加应用程序图标的徽章数字,它可以与
非重复本地通知良好配合使用。
UILocalNotifications无法在多个本地通知被触发时自动更新/增加徽章数字,当用户“忽略”它们或未立即处理它们时,它们会在通知中心中“堆积起来”。此外,“添加一些回调方法”到您的应用程序也无法处理“自动增量”,因为整个通知功能是由iOS在应用程序外部处理的,您的应用程序甚至不需要运行。
然而,有一个基于我通过实验发现的知识的解决方法,因为XCode文档对徽章属性过于模糊。
徽章只是一个“整数”,实际上更像是您在注册通知之前将其分配给applicationIconBadgeNumber属性的“虚拟标签”。您可以给它赋予
任何值-当通知触发时,iOS将把
该值添加到徽章中,无论您在注册通知时将其设置为什么值。iOS没有任何神奇的“自动增量”或其他操作(也许推送通知有所不同,但这不是本文的主题)。iOS只是从注册的通知中获取数字(整数),并将其放入徽章中。
因此,对于一个“解决方法”,您的应用程序必须为每个新创建和注册的通知提供正确的、递增的徽章数字,以覆盖“待处理通知”上面的已有通知。
由于您的应用程序无法预知未来,也不知道您将立即处理哪些事件,哪些事件会留下“待处理状态”,所以需要一些技巧:
当您的应用程序处理通知(通过点击通知、图标等)时,您必须:
1. 获取所有待处理通知的副本
2. “重新编号”这些待处理通知的徽章数字
3. 删除所有待处理通知
4. 再次使用已更正的徽章号码重新注册通知的副本
此外,当您的应用程序注册新通知时,必须首先检查有多少待处理通知,并使用:
badgeNbr = nbrOfPendingNotifications + 1;
看一下我的代码就会更清楚了。我测试过了,它绝对有效:
在你的'registerLocalNotification'方法中,你应该这样做:
NSUInteger nextBadgeNumber = [[[UIApplication sharedApplication] scheduledLocalNotifications] count] + 1
localNotification.applicationIconBadgeNumber = nextBadgeNumber
当你处理通知(在appDelegate中),你应该调用下面的方法,它会清除图标上的标记并对待处理的通知重新编号(如果有)。请注意,下面的代码对“顺序”注册的事件运行良好。如果您在等待的事件之间“添加”事件,则首先必须“重新排序”这些事件。我没有走那么远,但我认为这是可能的。
- (void)renumberBadgesOfPendingNotifications
{
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
NSArray *pendingNotifications = [[UIApplication sharedApplication] scheduledLocalNotifications];
if (pendingNotifications.count != 0)
{
[[UIApplication sharedApplication] cancelAllLocalNotifications];
NSUInteger badgeNbr = 1;
for (UILocalNotification *notification in pendingNotifications)
{
notification.applicationIconBadgeNumber = badgeNbr++;
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
}
}
}
为了真正做到“防弹”,这种方法应该是“原子”(内核)代码,防止iOS在执行此方法期间触发通知。我们必须在这里冒险,但这种情况发生的可能性非常小。
这是我第一次在Stackoverflow上贡献,如果我没有遵循“规则”的话,您也可以发表评论。