UILocalNotification 每 30 秒
Posted
技术标签:
【中文标题】UILocalNotification 每 30 秒【英文标题】:UILocalNotification every 30 seconds 【发布时间】:2013-10-13 19:40:56 【问题描述】:我正在尝试使用以下逻辑将UILocalNotification
设置为每 30 秒运行一次,但它似乎行为不端。有两个问题:
-
当通知被触发时,似乎同时有很多通知,而不是每 30 秒 1 个。
应用程序图标徽章数量似乎没有增加。它只是保持在 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];
【问题讨论】:
“当通知被触发时”是什么意思?您是否一次看到许多通知警报,或者方法application:didReceiveLocalNotification:
被多次调用?
我的意思是我同时看到许多通知警报。
您是否通过致电cancelAllLocalNotifications
取消所有之前的预定提醒?
【参考方案1】:
试试这个。
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;
【讨论】:
【参考方案2】:目前无法实现带间隔的自定义重复。
但是,通知系统最多可以排队 64 条通知,因此您可以做的最接近的事情是手动设置所需数量的通知(每个通知都有不同的徽章编号和不同的 fireDate),然后当您的通知列表不足时,通过设置新通知列表来更新它们。
这将返回您在队列中的通知数量:
[[[UIApplication sharedApplication] scheduledLocalNotifications] count]
我还建议您阅读这篇文章以获得更多帮助:
ios badge number live update
祝你好运!
【讨论】:
【参考方案3】:关于第二点,您增加的是副本的徽章编号,而不是原始通知。由于原件的徽章编号为零,因此您总是会得到一个徽章编号为零的副本,并且增加它会使其始终为 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];
【讨论】:
【参考方案4】:根据 NSObject 类参考:
copy - 返回copyWithZone返回的对象:
而copyWithZone 返回一个浅拷贝。 所以它就像所有通知都具有相同的属性。 因此,徽章编号始终为“1”,并且所有通知的 fireDate 都相同。即您申请的最后一个。 因此,通知会同时被触发。
希望,它会有所帮助。
【讨论】:
谢谢 - 你知道是否有办法可以复制它们以使值不完全相同? 为什么不创建一个新实例?据我所知,要进行深度复制,您必须实现该对象的 copyWithZone : ,这在 UILocalNotification 类的情况下不是解决方案。【参考方案5】:我认为您每 30 秒收到很多通知是因为您没有取消之前的通知。在代码顶部添加这一行。
[[UIApplication sharedApplication] cancelAllLocalNotifications];
【讨论】:
以上是关于UILocalNotification 每 30 秒的主要内容,如果未能解决你的问题,请参考以下文章
如何设置 UILocalNotification 连续 30 天
UILocalNotification - 在 NSDate 前 30 分钟触发
UILocalNotification 声音每隔一段时间播放一次