更新 iOS 图标徽章编号

Posted

技术标签:

【中文标题】更新 iOS 图标徽章编号【英文标题】:Update iOS icon badge number 【发布时间】:2015-11-10 00:58:40 【问题描述】:

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

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

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

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

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

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

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

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

我仍然对一些方法来处理应用程序不是每天打开的情况感兴趣,您如何确保徽章编号是正确的。到目前为止,最简单的方法是设置一些服务器并让它定期向应用推送通知。

【问题讨论】:

您应该更具体一些 - 阅读此内容听起来您还没有阅读有关如何执行推送通知或后台任务的任何内容。 我认为你可以尝试苹果推送通知来完成第一个案例。使用服务器端更新应用程序中的任务。 APN服务教程:raywenderlich.com/32960/… 目前还没有针对该应用的服务器端编程。该应用程序专为在没有服务器端支持的情况下使用而设计。所以我想避免将一些计算逻辑移动到服务器端来纯粹服务于徽章更新目的。 【参考方案1】:

你可以通过UILocalNotification实现它:

    当应用进入后台时,计算最近午夜的准确徽章计数 使用计算出的徽章数量将 UILocalNotification 安排在最近的午夜 您将在午夜收到通知,并且应用的徽章数量将更新

示例代码:

- (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];

【讨论】:

用户一天不打开应用怎么办?如果用户连续 x 天从不打开应用程序怎么办?徽章编号还会每天正确更新吗? @QuangHà 不,我没有尝试过 Vitaliy 的方法。但是,通过阅读代码,我可以看到它调用了 calculateBadgeCountForDate 来获取第二天的事件计数并分配给通知。我怀疑如果用户一整天没有打开应用程序,applicationDidEnterBackground 方法将不会被调用。所以徽章编号将保持不变。只有当用户每天打开一次应用程序时,才会更新徽章编号。这是我通过阅读代码的理解。如果我错了,请纠正我。 @Vitaliy 另外,我需要在安排新通知之前删除现有通知吗?如果用户每天打开和关闭应用数次,您的代码是否会针对同一午夜添加多个通知?

以上是关于更新 iOS 图标徽章编号的主要内容,如果未能解决你的问题,请参考以下文章

如果我没有启用徽章,为啥我的 iOS 应用程序图标会显示徽章编号?

ios5中的应用程序图标徽章编号

当应用程序未在管理博览会的情况下运行时,在通知上设置应用程序图标徽章编号

所有移动制造商的启动器图标上的 Android 徽章编号

如何在 IOS 推送通知中更新徽章编号?

ios - 应用程序关闭时本地通知不更新徽章编号