UILocalNotifications 和 applicationIconBadgeNumber 的良好模式

Posted

技术标签:

【中文标题】UILocalNotifications 和 applicationIconBadgeNumber 的良好模式【英文标题】:Good pattern for UILocalNotifications and applicationIconBadgeNumber 【发布时间】:2013-12-06 02:56:34 【问题描述】:

我的应用安排 UILocalNotifications 在用户选择的不同时间发送给用户。

我遇到了如何在这种情况下管理 applicationIconBadgeNumber 的情况。

我们知道,您必须在创建通知时设置徽章编号。我的问题是徽章数量的状态可以随时更改。考虑这种情况:

1) 用户收到 3 条通知。

2) 用户创建一个新通知以在未来给定时间点提醒她。此通知的值是 1 加上应用程序徽章的当前值 (3)。

3) 用户开展他们的业务。在他们的业务过程中,他们通过查看或以其他方式使用应用程序来清除他们当前拥有的所有 3 个通知(以及徽章编号)。

4) 经过给定的时间后,通知以及之前计算的值(4,如果您不记得的话)出现在 ios 中。

5) 应用程序标记现在为 4,即使用户只有一个实际通知。

我已经上下搜索了,但我找不到这个问题的答案,几乎可以肯定有一个我完全想念的简单答案。我该如何解决这个难题?

【问题讨论】:

【参考方案1】:

由于您的应用无法展望未来,并且知道您将立即处理哪些事件,以及哪些事件您将“等待”一段时间,因此有一些技巧可以做:

当您的应用处理通知时(通过点击通知、图标等),您必须:

    获取所有待处理通知的副本 “重新编号”这些待处理通知的徽章编号 删除所有待处理通知 使用更正的徽章重新注册通知副本 再次编号

此外,当您的应用注册新通知时,它必须首先检查有多少通知处于待处理状态,并使用以下方式注册新通知:

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

【讨论】:

这很棒。我只是想验证实现这一点的唯一方法是非常混乱;)

以上是关于UILocalNotifications 和 applicationIconBadgeNumber 的良好模式的主要内容,如果未能解决你的问题,请参考以下文章

CLBeaconRegion notifyEntryStateOnDisplay 和 UILocalNotifications

如何为每周和每年的每日设置 UILocalNotifications

检测未确认的 UILocalNotifications

解雇一系列 UILocalNotifications 或替代方法来实现相同的功能

打开/关闭所有 UILocalNotifications

UIAlertView 有类似 UILocalNotifications 的 fireDate 吗?