每30秒UILocalNotification

我试图设置一个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]; 

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

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

这将返回您在队列中的多less通知:

 [[[UIApplication sharedApplication] scheduledLocalNotifications] count] 

还有这个post,我会build议你阅读进一步的帮助:

iOS徽章号码实时更新

祝你好运!

试试这个。

 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; 

关于第二点,你增加了副本的徽章号码,而不是原来的通知。 而且由于原始零徽章号码,你总是会得到一个零徽章号码的副本,增加它会使它总是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]; 

根据NSObject类的参考:

copy – 返回copyWithZone返回的对象:

copyWithZone返回一个浅拷贝。 所以它像所有通知具有相同的属性。 因此,徽章号码总是“1”,并且fireDate对于所有通知都是相同的。 即最后一个你申请。 因此,通知同时被解雇。

希望能帮助到你。

我想你每30秒收到很多通知是因为你没有取消以前的通知。 在代码的顶部添加这一行。

 [[UIApplication sharedApplication] cancelAllLocalNotifications];