更新 iOS 图标徽章编号

Update iOS icon badge number

我有图标徽章编号更新要求。该应用程序跟踪任务。我希望该应用程序有一个徽章,显示每天到期的任务数。基本上有两种情况需要更新徽章号:

  1. 每天午夜。
  2. 如果添加新任务或删除任务。

我知道如何处理第二种情况。我可以在 applicationResignActive 函数中设置徽章编号。但是,午夜自动更新对我来说是个把戏。要更新徽章编号,我需要调用应用程序的一个函数来计算当天到期的任务。然而,在午夜,应用程序可能处于所有可能的情况:前台、后台而不是 运行。我怎样才能做到这一点?谢谢。

=====================================

为了更清楚地表达我的要求,我希望徽章号码每天正确更新,即使用户一整天或连续几天都没有打开应用程序。另外,我会尽量避免服务器端支持,因为到目前为止该应用程序是一个独立的应用程序。非常感谢您的帮助。

=====================================

最后更新:我接受了 Vitaliy 的回答。但是,他的回答要求应用程序每天至少打开一次。否则,事件不会触发,徽章编号也无法更新。

另外,就我而言,每次应用程序进入后台事件触发时,我都必须删除现有通知并安排一个新的通知,并重新计算最新的徽章编号。

我还是很想知道有什么方法可以处理app每天都打不开的情况,请问如何确保badge number是正确的。到目前为止,最简单的方法是设置一些服务器并让它定期向应用程序推送通知。

你可以用UILocalNotification实现它:

  1. 当应用进入后台时,计算最近午夜的确切徽章计数
  2. 根据您计算出的徽章数量,安排在最近的午夜 UILocalNotification
  3. 您将在午夜收到通知,应用程序的徽章数量将更新

示例代码:

- (void)applicationDidEnterBackground:(UIApplication *)application {
    // Calculate nearest midnight or any other date, which you need
    NSDate *nearestMidnight = [self nearestMidnight];
    // Create and setup local notification
    UILocalNotification *notification = [UILocalNotification new];
    notification.alertTitle = @"Some title";
    notification.alertBody = @"Some message";
    notification.fireDate = nearestMidnight;
    // Optional set repeat interval, if user didn't launch the app after nearest midnight
    notification.repeatInterval = NSCalendarUnitDay;
    // Calculate badge count and set it to notification
    notification.applicationIconBadgeNumber = [self calculateBadgeCountForDate:nearestMidnight];
    [application scheduleLocalNotification:notification];
}