更新本地通知的触发时间并取消先前的通知。

5
我知道有一些关于如何删除本地通知的问题,可以在这里那里找到。我也查看了本地通知类参考,发现了一些方法,如重复时间间隔、触发日期、警报正文、时区等等...但我无法找到关于如何修改已设置的触发日期的信息。比如说,如果用户设置了一个今天下午4:50的通知,但如果用户希望修改设置的日期/时间,那么通知将在两个场合都触发,这是编程伦理方面的错误!
实际上,我想要的是取消之前的通知,即将日期修改为编辑后的日期,并在新日期上设置和触发通知。
以下是我设置通知的样本代码:
- (void)setNotification
{
    //Set notification after confirmation of saved data

    Class cls = NSClassFromString(@"UILocalNotification");
    reminderNotification = [[cls alloc] init];

    if (cls != nil) 
    {        
       NSDateFormatter *dateFormat = [[[NSDateFormatter alloc]init]autorelease];
       [dateFormat setDateFormat:@"YYYY-MM-dd HH:mm:ss"];
       NSDate *notificationDate = [dateFormat dateFromString:textField2.text];
       reminderNotification.fireDate = notificationDate;
       reminderNotification.timeZone = [NSTimeZone defaultTimeZone];
       NSString *reminderText = [NSString stringWithFormat:@"%@ 's %@ on %@",textField.text,textField1.text,strDate];
       reminderNotification.alertBody = reminderText;
       reminderNotification.alertAction = @"View";
       reminderNotification.soundName = @"lazy_afternoon.mp3";
       reminderNotification.applicationIconBadgeNumber = 1;
       NSDictionary *userDict = [NSDictionary dictionaryWithObject:self.textField1.text forKey:kReminder];
       reminderNotification.userInfo = userDict;
       [[UIApplication sharedApplication] scheduleLocalNotification:reminderNotification];
       [reminderNotification release];
    }
}

如何处理这个任务?
2个回答

18

使用此方法来安排通知,其中notificationID必须是唯一的

 -(void) scheduleNotificationForDate:(NSDate *)date AlertBody:(NSString *)alertBody ActionButtonTitle:(NSString *)actionButtonTitle NotificationID:(NSString *)notificationID{

    UILocalNotification *localNotification = [[UILocalNotification alloc] init];
    localNotification.fireDate = date;
    localNotification.timeZone = [NSTimeZone localTimeZone];
    localNotification.alertBody = alertBody;
    localNotification.alertAction = actionButtonTitle;
    localNotification.soundName = @"yourSound.wav";

    NSDictionary *infoDict = [NSDictionary dictionaryWithObject:notificationID forKey:notificationID];
    localNotification.userInfo = infoDict;

    [[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
}

使用此方法取消具有特定通知 ID 的通知

- (void)cancelLocalNotification:(NSString*)notificationID {
    //loop through all scheduled notifications and cancel the one we're looking for
    UILocalNotification *cancelThisNotification = nil;
    BOOL hasNotification = NO;

    for (UILocalNotification *someNotification in [[UIApplication sharedApplication] scheduledLocalNotifications]) {
        if([[someNotification.userInfo objectForKey:notificationID] isEqualToString:notificationID]) {
            cancelThisNotification = someNotification;
            hasNotification = YES;
            break;
        }
    }
    if (hasNotification == YES) {
        NSLog(@"%@ ",cancelThisNotification);
        [[UIApplication sharedApplication] cancelLocalNotification:cancelThisNotification];        
    }
}

参考资料: UILocalNotification


有一个小疑问,我能否在计划通知中声明通知ID,而不是将其放置在方法本身中 :) - Eshwar Chaitanya
哦,你的意思是即使我只调用[self setNotification]方法而没有调用void scheduleNotification方法,通知也会被设置。 - Eshwar Chaitanya
是的,我理解您的观点,Bala先生。但我的问题是,通知已经在setNotification方法中安排好了,那么在“-(void) scheduleNotificationForNotificationID:(NSString *)notificationID”方法中应该怎么做呢?我是否需要设置相同的通知,也就是在那里再次编写相同的代码? - Eshwar Chaitanya
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/12861/discussion-between-bala-and-eshwar-chaitanya - Bala
Bala,请登录Skype,我有一个问题,请。 - Eshwar Chaitanya
显示剩余7条评论

3

一旦设置了通知,唯一修改的方法是取消旧的通知并重建新的通知,所以您可以这样做:搜索现有的通知并将其取消。

for(UILocalNotification *aNotif in [[UIApplication sharedApplication] scheduledLocalNotifications]) {
        if([[aNotif.userInfo objectForKey:@"id"] isEqualToString:nId]) {
            [[UIApplication sharedApplication]cancelLocalNotification:aNotif];
        }
    }

然后创建新的通知。


抱歉,我无法理解这里的关键是什么,我是否应该为每个通知创建一个ID,如果是的话,如何设置它,请详细说明。我对本地通知还不熟悉,请看一下我的代码,谢谢 :) - Eshwar Chaitanya
很简单,你只需要有一个唯一的密钥,生成并存储它,然后使用它可以发送通知,并使用相同的密钥取消通知。如果你只有一个通知,可以将其存储在NSUserDefaults中,否则你需要使用数据库来存储多个条目。 - Dhruv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接