2

UILocalNotification在我的应用程序中使用 s 。有时我安排重复通知,有时安排非重复通知。每当触发通知时,我都想增加应用程序徽章编号。所以我这样做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 个错过的通知)。我可以实现这种行为吗?还是有什么明显的我错过了?对我来说,重复通知更合乎逻辑的徽章行为将是它第一次设置徽章编号,随后它不会更改徽章编号。

4

4 回答 4

1

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

没有办法让徽章计数保持在使用UILocalNotification.

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

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

于 2013-01-09T19:28:41.873 回答
1

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

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];
于 2013-01-09T20:40:37.183 回答
0

您可以简单地使用 if 条件来执行此操作,例如:

- (void) application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)localNotification
{
   if([UIApplication sharedApplication].applicationIconBadgeNumber < localNotification.applicationIconBadgeNumber)
   {
      [UIApplication sharedApplication].applicationIconBadgeNumber = localNotification.applicationIconBadgeNumber;
   }
}

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

于 2013-01-09T18:36:49.637 回答
0

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

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)
        }
    }
}
于 2016-02-10T11:33:35.353 回答