applicationIconBadgeNumber的

applicationIconBadgeNumber的

我的应用程序计划将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/

    10-11 06:35