Iphone iOS徽章号码实时更新
我为iOS创建了一个自定义日历,我正在尝试使用徽章编号来显示一天中的数字,但数字在一天之后并没有改变,我的意思是他们应该更新lively这里是我的代码:我需要类似weather live的应用程序,此应用程序不会发送任何推送通知强>Iphone iOS徽章号码实时更新,iphone,ios,xcode,ipad,sdk,Iphone,Ios,Xcode,Ipad,Sdk,我为iOS创建了一个自定义日历,我正在尝试使用徽章编号来显示一天中的数字,但数字在一天之后并没有改变,我的意思是他们应该更新lively这里是我的代码:我需要类似weather live的应用程序,此应用程序不会发送任何推送通知 int a = [DateComponents showDay]; [UIApplication sharedApplication].applicationIconBadgeNumber = a ; 您如何以及在何处调用此方法?如果您将计时器设置为每
int a = [DateComponents showDay];
[UIApplication sharedApplication].applicationIconBadgeNumber = a ;
您如何以及在何处调用此方法?如果您将计时器设置为每x秒运行一次此代码,它将在下一次计时器触发时更新。您应该能够使用UILocalNotification执行此操作 我不确定你是否可以将它设置为每天自动重复一次,但你可以通过垃圾邮件通知来模仿它
目前在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];
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.
}
其中,daydomoryone
是一个月中明天的整数。而seconds
是一个时间间隔-这可能类似于到午夜的时间间隔。发送此通知后,用户将不会收到警报或声音,但应用程序标记应更新为新值。您可以使用repeatInterval
属性使此通知每天重复,但这里的问题是,第二天您需要将daydroother
更改为不同的值,然后在第二天再次更改。但是重复的警报在applicationBadgeNumber
中始终具有相同的值
因此,我认为实现任何接近您想要的目标的唯一方法是安排多个本地通知-您可以提前安排多达64个-每一个通知间隔一天,并且每个通知都将当天的值设置为applicationBadgeNumber
。这些需要是非重复的,因此请确保将repeatInterval
设置为nil(或者不要设置它,因为nil是默认值)。假设所有这些通知都由iOS可靠地发送,您将能够在长达64天的时间内无声地更新徽章号码,而不会打扰用户。之后,徽章将停止更新除非您同时安排了更多通知,即当用户打开应用程序时。您可以尝试在应用程序启动时取消所有现有的计划通知:
[[UIApplication sharedApplication] cancelAllLocalNotifications];
然后提前64天循环,为applicationBadgeNumber
属性安排每天午夜的通知,通知日期为当月的正确日期。只要用户至少每64天打开一次你的应用程序,你就会保持徽章图标的最新状态。如果您设想您的应用程序用户经常打开应用程序(例如每天多次),那么优化方法可能是在取消现有通知并创建64个新通知之前检查计划的通知数量,如下所示:
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];
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.
}
这里发生的是:
- 我们使用
获取今天的日期,然后将其分解为要保留的组件(年、月、日),然后将时间组件(小时、分钟、秒)设置为午夜。这给了我们今天午夜的时间李>[NSDate date]
- 我们循环了64次,每次创建一个新的日期,即未来1到64天,方法是取
并将每天的秒数乘以我们希望该日期在未来的天数。我们使用此日期安排本地通知MiddnightToday
- 我们还需要计算出一个月的哪一天是徽章号码。因此,我们再次使用
将未来日期分解为我们感兴趣的组件-在本例中,这些组件只是日期,因此我们指定NSDateComponents
。然后,我们可以将NSDayCalendarUnit
设置为applicationBadgeNumber
components.day
- 64个通知中的每一个都与UIApplication一起安排,在未来1到64天内交付
请注意,这可能只适用于使用Gregorian(西式)的用户日历-根据您的市场,您可能需要考虑世界各地使用的其他日历类型并支持这些日历。如果退出应用程序,计时器将不运行,您可以在午夜发送ULICOL通知,以NSay日历日历单元的重复间隔。在AppDelegate中,在:-(void)application:(UIApplication*)application didReceiveLocalNotification:(UILocalNotification*)通知中更新徽章。非常感谢Rob帮助我,但是
SECONDS\u PER\u DAY
显示明天,而i*SECONDS\u PER\u DAY
后天,我将其更改为:60*60
;并删除了i*
,因为我的日历是波斯日历,所以我等待明天看到更新徽章号码银行,很抱歉,这是一个巨大的文本墙-我对这个问题非常感兴趣,必须找到解决方案!在调试器中查看futureDate
时,要小心,因为我认为它总是显示为GMT,而不是您自己的时区。但是,如果在设置fireDate
后检查通知,它将显示为时区中的正确时间。所以一定要检查这个。我也在我的设备上安装了它,耐心地等待到明天,看看是否所有的更新都正确:)不幸的是,徽章号码没有更新!实际上什么都没发生,我想这是因为你使用了波斯日历。我已经在代码中添加了几个NSLog语句——您可以将它们添加到代码中并取消注释它们,然后查看记录日期时的样子吗。如果您的iOS设备设置为使用波斯日历,则不能使用NSGregorianCal