iOS徽章号码实时更新

我为iOS创build了一个自定义日历,我正在尝试使用徽章号来显示当天的号码,但是一天过去后号码没有改变,我的意思是他们应该更新活泼,这是我的代码: 我需要像天气现场应用程序,这个应用程序不会发送任何推送通知!

int a = [DateComponents showDay]; [UIApplication sharedApplication].applicationIconBadgeNumber = a ; 

目前在iOS中执行此操作并不容易。 您可以closures,但不能每天可靠更新徽章, 除非用户偶尔打开应用程序

你需要使用UILocalNotification 。 您可以创build并安排一个“无声”通知,更新应用程序标记,而不用提醒用户或播放如下所示的警报声:

 UILocalNotification* notification = [[UILocalNotification alloc] init]; notification.fireDate = [NSDate dateWithTimeIntervalSinceNow:seconds]; notification.timeZone = [NSTimeZone systemTimeZone]; notification.alertBody = nil; notification.soundName = nil; notification.applicationIconBadgeNumber = dayTomorrow; [[UIApplication sharedApplication] scheduleLocalNotification:notification]; [notification release]; 

当天明天是一个明天的一天。 seconds是一段时间间隔 – 这可能是像午夜的时间间隔。 发送此通知时,用户不会有任何提醒或声音,但应用徽章应更新为新的值。 你可以使用repeatInterval属性每天重复这个通知,但是这里的问题是,第二天你需要改变dayTomorrow作为一个不同的值,以及在那之后的一天。 但是重复的警报在applicationIconBadgeNumber总是有相同的值。

所以我认为实现接近你想要的任何东西的唯一方法是安排多个本地通知 – 你可以预先安排多达64个 – 每天一个,每一个都设置为applicationIconBadgeNumber 。 这些需要是不重复的,所以确保你设置repeatInterval为零(或者不要设置,因为nil是默认值)。 假设所有这些通知都可靠地通过iOS传送,您将能够无声地更新徽章号码,而不会让用户长达64天的时间。 之后,徽章将停止更新… 除非您设法在此期间安排更多通知 – 即当用户打开应用程序时。 您可以尝试的是在应用启动时取消所有现有的预定通知:

 [[UIApplication sharedApplication] cancelAllLocalNotifications]; 

然后提前64天循环,为applicationIconBadgeNumber属性安排每天正午的通知。 只要用户至less每64天打开一次您的应用,就可以保持徽章图标的更新。 如果您设想您的应用程序用户频繁地打开应用程序(例如,每天多次),则优化可能是检查现有通知的数量,然后取消它们并创build64个新的通知,如下所示:

 if ([[[UIApplication sharedApplication] scheduledLocalNotifications] count] < 10) { //there are 10 or fewer days' worth of notifications scheduled, so create and //schedule more here, up to 64 in total. } 

其他几点需要注意:

  • 我不确定本地通知有多可靠。 推送通知不保证,但我希望,并希望本地通知保证交付。 例如,如果电话在午夜关掉,只在上午7点打开,我希望当地的午夜通知能够立即发送。 但我从来没有testing过这个。
  • 如果您的应用程序当前处于打开状态,那么会调用application:didReceiveLocalNotification:但徽章图标将不会更新。 所以为了迎合这种情况,我build议每次启动应用程序时(或者从后台返回前台)将徽章图标更新为当天。
  • 不知道苹果会使用这个徽章图标。 在审查您的应用程序时,他们可能会觉得这对用户来说是令人困惑的,因为它通常用于指示应用程序中新数据/已更改数据的数量。 所以你的应用程序可能会被拒绝。
  • 理想情况下,苹果公司将为开发者提供一个API,以便向用户提供这种“一目了然”的信息,无论这是通过以某种方式更改应用程序图标/徽章还是通过小部件来实现的。上面描述的应该是工作,但显然有点克隆,以解决目前iOS的限制。 内置的日历应用程序每天更改其图标以显示一个月的一天,我可以看到许多应用程序可以从这种行为中受益 – 例如天气应用程序可以显示当前位置的天气情况图标。

编辑:

下面是一个代码片段,用于取消任何现有的本地通知,并在将来为午夜计划64,并将月份的正确date指定为徽章号码:

 [[UIApplication sharedApplication] cancelAllLocalNotifications]; NSCalendar* calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; NSDateComponents* components = [calendar components:(NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit) fromDate:[NSDate date]]; [components setHour:0]; [components setMinute:0]; [components setSecond:0]; NSDate* midnightToday = [calendar dateFromComponents:components]; const int SECONDS_PER_DAY = 60 * 60 * 24; for (int i = 1; i <= 64; i++) { NSDate* futureDate = [midnightToday dateByAddingTimeInterval:i * SECONDS_PER_DAY]; NSDateComponents* components = [calendar components:NSDayCalendarUnit fromDate:futureDate]; UILocalNotification* notification = [[UILocalNotification alloc] init]; notification.fireDate = futureDate; notification.timeZone = [NSTimeZone systemTimeZone]; notification.alertBody = nil; notification.soundName = nil; notification.applicationIconBadgeNumber = components.day; //NSLog(@"futureDate: %@", [NSDateFormatter localizedStringFromDate:futureDate dateStyle:NSDateFormatterMediumStyle timeStyle:NSDateFormatterMediumStyle]); //NSLog(@"notification: %@", notification); [[UIApplication sharedApplication] scheduleLocalNotification:notification]; [notification release]; } [calendar release]; 

这里发生了什么事情是:

  • 我们把今天的date和[NSDate date]一起取出,然后把它分解成我们想要保留的组件(年,月,日),然后将时间组件(小时,分钟,秒)设置为午夜。 这给了我们今天midnightToday
  • 我们循环64次,每次创build一个新的date,从今天的1到64天,通过采取midnightToday今天,并加上每天秒数乘以未来多less天,我们希望date。 我们使用这个date来安排本地通知。
  • 我们还需要计算出当天的徽章号码。 因此,我们再次使用NSDateComponents将未来date分解成我们感兴趣的组件 – 在这种情况下,这只是一天,所以我们指定NSDayCalendarUnit 。 然后我们可以将applicationIconBadgeNumber设置为components.day
  • 64个通知中的每一个都预定了UIApplication,将来会在1到64天内交付。

请注意,这可能只适用于使用格里高利(西式)日历的用户 – 根据您的市场情况,您可能需要考虑世界各地正在使用的其他日历types并支持这些日历types。

你应该可以通过UILocalNotification来完成

我不确定您是否可以将其设置为每天自动重复一次,但您可能能够通过垃圾邮件通知来模拟。

http://developer.apple.com/library/IOs/#documentation/iPhone/Reference/UILocalNotification_Class/Reference/Reference.html

你怎样和在哪里调用这个方法? 如果你设置一个定时器来每隔x秒运行一次这个代码,它将在下一个定时器激活时更新。