每30秒UILocalNotification

时间:2013-10-13 19:40:56

标签: iphone ios objective-c ios7 uilocalnotification

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

  1. 当通知被解雇时,似乎有很多都是一次性发生,而不是每30秒1次。
  2. 应用程序图标徽章编号似乎没有增加。它只停留在1。
  3. 请有人帮我弄清楚我做错了吗?

    // 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];
    

5 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

目前无法通过间隔实现自定义重复。

但是,通知系统最多可以排队64个通知,因此您可以做的最接近的事情是根据需要手动设置任意数量的通知(每个通知具有不同的徽章编号和不同的fireDate)然后具有您的通知列表会在您运行不足时通过设置新通知列表进行更新。

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

[[[UIApplication sharedApplication] scheduledLocalNotifications] count]

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

iOS badge number live update

祝你好运!

答案 2 :(得分: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];

答案 3 :(得分:0)

根据NSObject类引用:

copy - 返回copyWithZone返回的对象:

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

希望,这有帮助。

答案 4 :(得分:0)

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

[[UIApplication sharedApplication] cancelAllLocalNotifications];