2015-11-10 94 views
1

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

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

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

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

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

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

最后更新:我接受维塔利的回答。但是,他的回答要求应用程序每天至少打开一次。否则,该事件不会触发,并且徽章号码不能更新。

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

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

+0

你应该更具体 - 阅读这听起来像你没有读过任何关于如何做推送通知或后台任务。 – inorganik

+0

我认为你可以尝试苹果推送通知来完成第一个案例。使用服务器端更新应用程序中的任务。 APN服务教程:http://www.raywenderlich.com/32960/apple-push-notification-services-in-ios-6-tutorial-part-1 –

+0

目前为止还没有针对该应用的服务器端编程。该应用程序专为使用没有服务器端支持。所以我想避免将某些计算逻辑移到服务器端来纯粹用于更新徽章的目的。 – Steve

回答

2

你可以用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]; 
} 
+0

用户从未打开过一天的应用程序?如果用户从不打开连续x天的应用程序会怎么样?徽章号码是否每天都会正确更新? – Steve

+0

@Steve:你有没有试过? –

+0

@QuangHà不,我还没有尝试Vitaliy的方法。但是,通过阅读代码,我可以看到它调用calculateBadgeCountForDate来获取第二天的事件计数并分配给通知。我怀疑,如果用户没有打开一整天的应用程序,applicationDidEnterBackground方法将不会被调用。所以徽章号码将保持不变。只有当用户每天打开一次应用程序时,徽章号码才会更新。这是我通过阅读代码的理解。如果我错了,请纠正我。 – Steve