UILocalNotification 应用程序徽章编号重复

Posted

技术标签:

【中文标题】UILocalNotification 应用程序徽章编号重复【英文标题】:UILocalNotification app badge number on repeat 【发布时间】:2013-01-09 18:19:43 【问题描述】:

我在我的应用程序中使用UILocalNotifications。有时我安排重复通知,有时安排非重复通知。每当触发通知时,我都想增加应用程序徽章编号。所以我做localNotification.applicationIconBadgeNumber = badgeNumber; 这工作正常...除非通知是重复通知,因为如果我之前设置了带有徽章编号 1 的重复通知,那么我设置了另一个带有徽章编号 2 的非重复通知。

流程是这样的:

Notification 1 fires (first time) - Badge number = 1 (OK!) 
Notification 2 fires              - Badge number = 2 (OK!) 
Notification 1 fires (repeating)  - Badge number = 1 (ERROR)

如您所知,当通知 1 再次触发时,我仍然希望应用程序徽章编号显示 2(对于 2 个错过的通知)。我可以实现这种行为吗?或者有什么明显的我错过了?对我来说,重复通知更合乎逻辑的徽章行为是它第一次设置徽章编号,随后不会更改徽章编号。

【问题讨论】:

这是一个可能的解决方法:***.com/a/15461328/1869369 不需要使用推送通知 【参考方案1】:

简单:对不起,戴夫。恐怕我做不到。

在使用UILocalNotification 时,无法让徽章计数保持在您希望的“最高”计数。

徽章计数将始终设置为您在安排通知时设置的值(如您所知)。您不能假设用户在收到通知时会打开您的应用程序,因此在每次应用程序启动时更新已安排通知(重复和非重复)的徽章计数肯定不会起作用,也不是一个选择。

您可以做到这一点的唯一方法是使用推送通知,跟踪您服务器上的所有“未读”通知,并在用户启动您的应用程序后立即在您的服务器上将通知标记为“已读”。

【讨论】:

其实我认为你错了,确实可以跟踪所有通知,这很简单,当应用程序进入后台时,你检查你需要创建多少个通知,然后你安排他们。对于每个通知,您都会增加applicationIconBadgeNumber,这对于非重复通知非常有效。但是当它是我试图在我的问题中解释的重复通知时,就会出现问题。 但是您必须在每次启动应用程序时更新所有计划通知的徽章计数。假设您安排了 20 个通知,您将徽章计数设置为 1...20。触发了三个通知,徽章计数为 3,用户打开应用程序,在这种情况下,您将徽章计数重置为优秀的开发人员。那么您必须更新通知 4...20 的徽章计数吗?这对我来说听起来不是一个好习惯,但它可以解决非重复通知的问题。 在我的例子中,每个徽章编号代表一个过期的对象,所以仅仅因为用户打开应用程序并不意味着我应该重置应用程序徽章(如果用户打开对象仍然过期应用程序)。 “您不能假设用户在收到通知时会打开您的应用程序” - 我知道这一点。 “因此,在每次应用启动时更新已安排通知(重复和非重复)的徽章计数肯定不会起作用,也不是一个选择” - 在应用启动时更新徽章计数不是这里的问题... 【参考方案2】:

我想处理重复通知并让它在第一次触发时增加应用程序徽章编号的唯一方法是安排没有徽章编号的重复通知,例如:

UILocalNotification *localNotification = [[UILocalNotification alloc] init];
localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:60];
localNotification.alertBody = @"1";
localNotification.alertAction = @"Send";
localNotification.soundName = UILocalNotificationDefaultSoundName;
localNotification.timeZone = [NSTimeZone defaultTimeZone];
localNotification.repeatInterval = NSMinuteCalendarUnit;
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];

然后在第一次触发重复通知的同时安排一个只设置应用程序徽章编号的通知:

UILocalNotification *localNotification = [[UILocalNotification alloc] init];
localNotification.fireDate = [NSDate dateWithTimeIntervalSinceNow:60];
localNotification.soundName = UILocalNotificationDefaultSoundName;
localNotification.timeZone = [NSTimeZone defaultTimeZone];
localNotification.applicationIconBadgeNumber = 1;
localNotification.hasAction = NO;
localNotification.alertBody = nil;
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];

【讨论】:

这是公认的答案吗?它在什么时候增加徽章编号? 我不太明白你的问题?【参考方案3】:

你可以简单地使用 if 条件来做到这一点:

- (void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)localNotification

   if([UIApplication sharedApplication].applicationIconBadgeNumber < localNotification.applicationIconBadgeNumber)
   
      [UIApplication sharedApplication].applicationIconBadgeNumber = localNotification.applicationIconBadgeNumber;
   

(没有检查上面的代码)。

【讨论】:

您需要通过firstLocalNotification.applicationIconBadgeNumber = 1secondLocalNotification.applicationIconBadgeNumber = 2等本地通知设置应用徽章编号 是的,我正在这样做。首先检查应用程序徽章编号是否小于当前触发的通知徽章编号。如果是,那么我将其设置为应用程序的徽章编号。如果不是,则表示这是重复通知。 我真的不明白你在说什么。你能显示完整的代码吗? 啊哈,抱歉,这并不能解决我的问题。我希望应用程序在后台时增加应用程序徽章编号。【参考方案4】:

在我的应用中,我不得不使用重复的本地通知来添加徽章编号。并且每次用户打开应用程序徽章编号时都应该重置。因此,所有预定的通知都应重新计算徽章编号。

func applicationDidEnterBackground(application: UIApplication) 
    addBadgeNumberToScheduledNotifications()


func addBadgeNumberToScheduledNotifications() 
    var badgeNumber: Int = 0
    UIApplication.sharedApplication().applicationIconBadgeNumber = 0
    if let notifications = UIApplication.sharedApplication().scheduledLocalNotifications 
        UIApplication.sharedApplication().cancelAllLocalNotifications()
        for notification in notifications 
            notification.applicationIconBadgeNumber = notification.fireDate > NSDate() ? ++badgeNumber : 0
            UIApplication.sharedApplication().scheduleLocalNotification(notification)
        
    

【讨论】:

以上是关于UILocalNotification 应用程序徽章编号重复的主要内容,如果未能解决你的问题,请参考以下文章

院徽手绘效果图

检测从哪个 UILocalNotification 打开应用程序

将 UILocalNotification 同步到 Watch

UILocalNotification 动画两次[重复]

UILocalNotification 触发时自动将应用程序从后台带到前台?

UILocalnotification 和委托有啥区别? [关闭]