我的应用程序计划将UILocalNotifications安排在用户选择的不同时间交付给其用户。
在这种情况下,我遇到了如何管理applicationIconBadgeNumber的情况。
我们知道,您必须在创建通知时设置徽章编号。我的问题是徽章数量的状态可以随时更改。考虑这种情况:
1)用户收到3条通知。
2)用户创建一个新通知,以在将来的给定时间提醒她。该通知的值为1加上应用程序标志的当前值(3)。
3)用户开展业务。在开展业务的过程中,他们会通过查看或使用应用程序清除当前拥有的所有3条通知(并因此清除了徽章编号)。
4)经过给定的时间后,通知及其先前计算的值(如果您不记得,则为4)出现在iOS中。
5)现在,即使用户只有一个实际的通知,应用程序徽章也为4。
我已经上下搜索了,但是找不到这个问题的答案,几乎可以肯定我已经完全没有了这个简单的答案。我该如何解决这个难题?
最佳答案
由于您的应用程序无法面向 future ,并且知道您将立即处理哪些事件,以及哪些事件将暂时搁置一会儿,因此有一些技巧可以做:
当通知由您的应用处理时(通过点击通知,图标,...),您必须:
再次编号
此外,当您的应用注册新通知时,它必须先检查有多少个待处理的通知,并使用来注册新通知:
badgeNbr = nbrOfPendingNotifications + 1;
查看我的代码,它将变得更加清晰。我测试了一下,它肯定可以正常工作:
在您的“registerLocalNotification”方法中,您应该这样做:
NSUInteger nextBadgeNumber = [[[UIApplication sharedApplication] scheduledLocalNotifications] count] + 1;
localNotification.applicationIconBadgeNumber = nextBadgeNumber;
处理通知(appDelegate)时,应调用以下方法,该方法将清除图标上的标志并为待处理的通知重新编号标志(如果有的话)
请注意,下一个代码可以很好地处理“顺序”注册事件。如果要在未决事件之间“添加”事件,则必须首先对这些事件进行“重新排序”。我没有走那么远,但我认为有可能。
- (void)renumberBadgesOfPendingNotifications
{
// clear the badge on the icon
[[UIApplication sharedApplication] setApplicationIconBadgeNumber:0];
// first get a copy of all pending notifications (unfortunately you cannot 'modify' a pending notification)
NSArray *pendingNotifications = [[UIApplication sharedApplication] scheduledLocalNotifications];
// if there are any pending notifications -> adjust their badge number
if (pendingNotifications.count != 0)
{
// clear all pending notifications
[[UIApplication sharedApplication] cancelAllLocalNotifications];
// the for loop will 'restore' the pending notifications, but with corrected badge numbers
// note : a more advanced method could 'sort' the notifications first !!!
NSUInteger badgeNbr = 1;
for (UILocalNotification *notification in pendingNotifications)
{
// modify the badgeNumber
notification.applicationIconBadgeNumber = badgeNbr++;
// schedule 'again'
[[UIApplication sharedApplication] scheduleLocalNotification:notification];
}
}
}
归功于@Whassaahh
关于ios - UILocalNotification和applicationIconBadgeNumber的良好模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20415078/