1

我正在尝试UILocalNotification使用以下逻辑将 a 设置为每 30 秒运行一次,但它似乎行为不端。有2个问题:

  1. 当通知被触发时,似乎同时有很多通知,而不是每 30 秒 1 个。
  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];
4

5 回答 5

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;
于 2013-10-23T06:42:54.933 回答
1

目前无法实现带间隔的自定义重复。

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

这将返回您在队列中的通知数量:

[[[UIApplication sharedApplication] scheduledLocalNotifications] count]

还有这篇文章,我建议您阅读以获得进一步的帮助:

iOS 徽章编号实时更新

祝你好运!

于 2013-10-23T19:35:33.530 回答
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];
于 2013-10-13T20:10:15.003 回答
0

根据 NSObject 类参考:

copy - 返回由 copyWithZone 返回的对象:

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

希望能帮助到你。

于 2013-10-21T14:09:33.640 回答
0

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

[[UIApplication sharedApplication] cancelAllLocalNotifications];
于 2013-10-26T10:22:51.140 回答