2013-10-13 118 views
1

我试图建立一个UILocalNotification使用下面的逻辑,每30秒运行,但它似乎是行为不端。有两个问题:UILocalNotification每30秒

  1. 当通知被解雇时,似乎有很多人都是一次性的,而不是每30秒一次。
  2. 应用程序图标徽章编号似乎并未增加。它只是停留在1.

请有人能帮我弄清楚我做错了什么吗?

// Create 'base' notification we can use 
UILocalNotification *baseNotification = [[UILocalNotification alloc] init]; 
baseNotification.timeZone = [NSTimeZone defaultTimeZone]; 
baseNotification.repeatInterval = NSMinuteCalendarUnit; 
baseNotification.alertBody = @"My Message."; 
baseNotification.alertAction = @"My Alert Action"; 
baseNotification.soundName = UILocalNotificationDefaultSoundName; 

UILocalNotification *alertOne = [baseNotification copy]; 
alertOne.applicationIconBadgeNumber++; 
alertOne.fireDate = [[NSDate date] dateByAddingTimeInterval:30]; 
[[UIApplication sharedApplication] scheduleLocalNotification:alertOne]; 

UILocalNotification *alertTwo = [baseNotification copy]; 
alertTwo.applicationIconBadgeNumber++; 
alertTwo.fireDate = [[NSDate date] dateByAddingTimeInterval:60]; 
[[UIApplication sharedApplication] scheduleLocalNotification:alertTwo]; 
+0

你是什么意思的“当通知被解雇”?你是否一次看到很多通知提醒,或者'application:didReceiveLocalNotification:'方法被多次调用? – Hejazi

+0

我的意思是我一次看到很多通知警报。 –

+0

你是否通过调用'cancelAllLocalNotifications'来取消所有先前的预定警报? – Hejazi

回答

1

目前没有办法实现具有间隔的自定义重复。

但是,通知系统最多可以排队64个通知,所以您可以做的最接近的事情是手动设置尽可能多的通知(每个通知都有不同的徽章号和不同的fireDate),然后当您的通知列表不足时,通过设置新的通知列表来更新您的通知列表。

这将返回队列中有多少条信息已经:

[[[UIApplication sharedApplication] scheduledLocalNotifications] count] 

还有这个职位,我建议你阅读进一步的帮助:

iOS badge number live update

祝你好运!

0

关于第二点,您将增加副本的徽章号码而不是原始通知。而且,由于原来的具有零徽章号您总能获得零证件号码复制过,增加这将使它始终为1

的解决方案是增加原来通知的徽章权作出复制前:

... 
baseNotification.applicationIconBadgeNumber++; 
UILocalNotification *alertOne = [baseNotification copy]; 
alertOne.fireDate = [[NSDate date] dateByAddingTimeInterval:30]; 
[[UIApplication sharedApplication] scheduleLocalNotification:alertOne]; 

baseNotification.applicationIconBadgeNumber++; 
UILocalNotification *alertTwo = [baseNotification copy]; 
alertTwo.fireDate = [[NSDate date] dateByAddingTimeInterval:60]; 
[[UIApplication sharedApplication] scheduleLocalNotification:alertTwo]; 
0

根据NSObject类参考:

副本 - 返回copyWithZone返回的对象:

而且copyWithZone返回浅拷贝。 所以它像所有的通知具有相同的属性。 因此,徽章号码始终为“1”,并且fireDate对于所有通知都相同。即您申请的最后一个。 因此,通知同时被触发。

希望,它帮助。

+0

谢谢 - 你知道是否有方法可以复制它们,使得值不完全相同? –

+1

为什么不做一个新的实例?据我所知深入复制,你必须实现copyWithZone:该对象,这不是在UILocalNotification类的情况下的解决方案。 –

2

试试这一个。

UILocalNotification *baseNotification = [[UILocalNotification alloc] init]; 
baseNotification.timeZone = [NSTimeZone defaultTimeZone]; 
baseNotification.repeatInterval = NSMinuteCalendarUnit; 
baseNotification.alertBody = @"My Message."; 
baseNotification.alertAction = @"My Alert Action"; 
baseNotification.soundName = UILocalNotificationDefaultSoundName; 

UILocalNotification *alertOne = [baseNotification copy]; 
alertOne.fireDate = [[NSDate date] dateByAddingTimeInterval:30]; 
alertOne.applicationIconBadgeNumber = [[UIApplication sharedApplication]applicationIconBadgeNumber]+1; 

UILocalNotification *alertTwo = [baseNotification copy]; 
alertTwo.fireDate = [[NSDate date] dateByAddingTimeInterval:60]; 
alertTwo.applicationIconBadgeNumber = [[UIApplication sharedApplication]applicationIconBadgeNumber]+1; 
0

我觉得你得到了很多的通知每30秒是因为你没有取消之前的通知。在代码顶部添加此行。

[[UIApplication sharedApplication] cancelAllLocalNotifications];