我为iOS创建了一个自定义日历,并且我尝试使用徽章号码来显示当天的号码,但是号码在一天过后没有更改,我的意思是他们应该更新活泼,这里是我的代码:我需要类似天气直播的应用程序,这个应用程序不会发送任何推送通知!iOS徽章号码实时更新
int a = [DateComponents showDay];
[UIApplication sharedApplication].applicationIconBadgeNumber = a ;
我为iOS创建了一个自定义日历,并且我尝试使用徽章号码来显示当天的号码,但是号码在一天过后没有更改,我的意思是他们应该更新活泼,这里是我的代码:我需要类似天气直播的应用程序,这个应用程序不会发送任何推送通知!iOS徽章号码实时更新
int a = [DateComponents showDay];
[UIApplication sharedApplication].applicationIconBadgeNumber = a ;
这是不容易在目前的iOS做到这一点。除非用户偶尔打开应用程序,否则您可以关闭,但不可每天更新徽章。您需要使用UILocalNotification
。您可以创建并安排一个“无声”的通知,没有通知用户或播放提示音这样的更新应用徽章:
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];
其中dayTomorrow
是一个月的明天的日子一个int。和seconds
有一段时间间隔 - 这可能类似于午夜的时间间隔。发送此通知后,用户不会有任何提醒或声音,但应用徽章应更新为新值。您可能会使用repeatInterval
属性每天重复执行此通知,但此处的问题尽管如此,第二天您需要将dayTomorrow
更改为不同的值,并且在此之后的第二天。但重复警报在applicationIconBadgeNumber
中始终具有相同的值。
所以我认为实现接近你想要的任何东西的唯一方法是安排多个本地通知 - 你可以预先安排多达64个 - 每天相隔一天,每一个都有当天的价值集作为applicationIconBadgeNumber
。这些必须是非重复的,所以请确保您将repeatInterval
设置为零(或不要设置它,因为nil是默认值)。假设所有这些通知都可以通过iOS可靠地传送,您可以静默更新徽章号码,而不会让用户长达64天的时间。之后,徽章将停止更新... 除非您设法在此期间安排更多通知 - 即用户打开应用程序时。你可以尝试做的是在应用程序启动取消所有现有的计划通知:
[[UIApplication sharedApplication] cancelAllLocalNotifications];
,然后循环到64天前,每天调度午夜通知,每月的正确的日期为applicationIconBadgeNumber
财产。只要用户至少每64天打开一次应用,就可以保持徽章图标处于最新状态。如果您设想您的应用用户经常打开该应用(例如,每天多次),那么优化可能是检查计划取消他们,创造了64级新的,如在此之前已有的通知的数量:
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.
}
几个其他点要注意:
application:didReceiveLocalNotification:
,但不会更新徽章图标。因此,为了迎合这种情况,我建议每次启动应用程序时将徽章图标更新为当天(或从后台返回到前台)。编辑:
这里的代码片段取消在未来的任何现有的本地通知和安排64午夜,并指定为证件号码每月的正确的天:
[[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];
这是怎么回事是:
[NSDate date]
,然后将其分解成我们想要保留的组件(年,月,日),然后将时间组件(小时,分钟,秒)设置为午夜。这给了我们midnightToday
。midnightToday
并增加每秒的秒数乘以未来多少天,我们希望日期是。我们使用此日期安排本地通知。NSDateComponents
将未来日期分解成我们感兴趣的组件 - 在这种情况下,这只是一天,因此我们指定NSDayCalendarUnit
。然后,我们可以将applicationIconBadgeNumber
设置为components.day
请注意,这可能只适用于使用格里历(西式)日历的用户 - 根据您的市场,您可能需要考虑世界各地正在使用的其他日历类型并支持这些日历类型。
非常感谢Rob帮助我,但明天SECONDS_PER_DAY会显示,后天会显示I * SECONDS_PER_DAY,我将它改为:60 * 60;并删除'我*'因为我的日历是波斯日历,所以我在等待明天看到更新徽章号码 – 2012-05-15 08:22:45
,当然点击奖励这个赏金;) – 2012-05-15 08:23:12
谢谢,抱歉它是一个很大的文本墙 - 我对这个问题非常感兴趣,必须找到解决办法!在调试器中查看'futureDate'时,要小心,因为我认为它总是显示为GMT而不是您自己的时区。但是,如果您在设置'fireDate'后检查通知,它会显示为您时区中的正确时间。所以一定要检查一下。我也已经将它安装在我的设备上,耐心等待,直到明天,看看它是否全部正确更新:) – 2012-05-15 08:50:23
如何以及在哪里调用此方法?如果您设置一个计时器以每x秒运行一次此代码,它将在下一次计时器火灾时更新。
如果您退出应用程序,计时器将不会运行 – oskob 2012-01-04 21:28:52
您可以发送一个UILocalNotification在午夜重启,间隔时间为NSDayCalendarUnit。并在AppDelegate中更新徽章: - (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification。 – 2012-01-04 21:41:29
你应该能够UILocalNotification
做到这一点我不知道,如果你可以将其设置为自动重复每天一次,但你也许能垃圾noticifations效仿这一点。
尽管人们可以通过设置禁用通知,但您的确意识到了这一点。 – 2012-05-19 19:26:44