【发布时间】:2016-04-01 11:19:28
【问题描述】:
我正在做警报应用程序,在我的应用程序中我已经解雇了 带有它的 UILocalNotification 具有重复间隔(同样:每个 日,工作日,..等),在解雇它后,我取消了所有 通知并再次重新安排所有通知,但相同 已经触发的通知又来了,而不是它应该 为它的未来时间而来,它有下一个开火日期,但它的到来 再次。
我的代码:
-(void) setAlarmNotification:(NSDictionary *)dictionaryForAlarm {
UILocalNotification *localNotification = [[UILocalNotification alloc]init];
[localNotification setUserInfo:dictionaryForAlarm];
[localNotification setAlertBody:[NSString stringWithFormat:kDefaultNotificationMessage]];
[localNotification setSoundName:[NSString stringWithFormat:@"%@.%@",[dictionaryForAlarm objectForKey:kAlarmSoundName],[[GlobalClass getSoundDetails:[dictionaryForAlarm objectForKey:kAlarmSoundName]] objectForKey:kSoundExtention]]];
[localNotification setTimeZone:[NSTimeZone localTimeZone]];
// setting weather to provide snooze option or not
if([[dictionaryForAlarm objectForKey:kAlarmSnooze] integerValue]){
[localNotification setCategory:kNotificationCategoryIdentity];
}
// Set Notification with repeat/ also check its not firing the snooze notification
if(([[dictionaryForAlarm objectForKey:kAlarmRepeatState] intValue] == ALARMREPEATSTATEE_ON) && ([[dictionaryForAlarm objectForKey:kAlarmSnoozeState] intValue] == ALARMSNOOZESTATE_OFF)){
NSString *stringForRepetAlarmDays = [dictionaryForAlarm objectForKey:kAlarmRepeat];
NSCalendar *calendar = [NSCalendar currentCalendar];
NSDateComponents *componentsForFireDate = [calendar components:(NSCalendarUnitYear | NSCalendarUnitWeekOfYear | NSCalendarUnitHour | NSCalendarUnitMinute| NSCalendarUnitSecond | NSCalendarUnitWeekday) fromDate: [dictionaryForAlarm objectForKey:kAlarmSnoozeDate]];
if([stringForRepetAlarmDays intValue] == REPEATALARM_ALL){
// every day
localNotification.repeatInterval = NSCalendarUnitDay;
localNotification.fireDate=[calendar dateFromComponents:componentsForFireDate];
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
[self repetativeLocalnotificationDictionary:dictionaryForAlarm andFireDate:[calendar dateFromComponents:componentsForFireDate] withRepeatInterval:NSCalendarUnitDay isForSnooze:NO];
}else{
NSArray *arrayForRepeatDays = [stringForRepetAlarmDays componentsSeparatedByString:@","]; // geting the days array @"1,2,3.." => [@"1",@"2",.]
if(arrayForRepeatDays.count > 1){
// custom days
for (NSString *dayOfWeek in arrayForRepeatDays) {
// Creating multiple objects for each day to fire //$$$$$
UILocalNotification *localNotificationRepeat = [[UILocalNotification alloc]init];
[localNotificationRepeat setUserInfo:dictionaryForAlarm];
[localNotificationRepeat setAlertBody:[NSString stringWithFormat:kDefaultNotificationMessage]];
[localNotificationRepeat setSoundName:[NSString stringWithFormat:@"%@.%@",[dictionaryForAlarm objectForKey:kAlarmSoundName],[[GlobalClass getSoundDetails:[dictionaryForAlarm objectForKey:kAlarmSoundName]] objectForKey:kSoundExtention]]];
[localNotificationRepeat setTimeZone:[NSTimeZone localTimeZone]];
// setting weather to provide snooze option or not
if([[dictionaryForAlarm objectForKey:kAlarmSnooze] integerValue]){
[localNotificationRepeat setCategory:kNotificationCategoryIdentity];
}
[componentsForFireDate setWeekday:[dayOfWeek integerValue]];
localNotificationRepeat.repeatInterval = NSCalendarUnitWeekOfYear;;
localNotificationRepeat.fireDate=[calendar dateFromComponents:componentsForFireDate];
[[UIApplication sharedApplication] scheduleLocalNotification:localNotificationRepeat];
[self repetativeLocalnotificationDictionary:dictionaryForAlarm andFireDate:[calendar dateFromComponents:componentsForFireDate] withRepeatInterval:NSCalendarUnitWeekOfYear isForSnooze:NO];
}
}else{
// single repeat
[componentsForFireDate setWeekday: [arrayForRepeatDays[0] intValue]] ;
localNotification.repeatInterval = NSCalendarUnitWeekOfYear;
localNotification.fireDate=[calendar dateFromComponents:componentsForFireDate];
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
[self repetativeLocalnotificationDictionary:dictionaryForAlarm andFireDate:[calendar dateFromComponents:componentsForFireDate] withRepeatInterval:NSCalendarUnitWeekOfYear isForSnooze:NO];
}
}
}else{
[localNotification setFireDate:[dictionaryForAlarm objectForKey:kAlarmSnoozeDate]];
[[UIApplication sharedApplication] scheduleLocalNotification:localNotification];
[self repetativeLocalnotificationDictionary:dictionaryForAlarm andFireDate:[dictionaryForAlarm objectForKey:kAlarmSnoozeDate] withRepeatInterval:NSCalendarUnitDay isForSnooze:NO];
}
}
- (void)cancelAlarmNotification:(NSString *)stringForNotificationID {
UIApplication *app = [UIApplication sharedApplication];
NSArray *arrayForNotifications = [app scheduledLocalNotifications];
for (int i=0; i<[arrayForNotifications count]; i++)
{
UILocalNotification* localNotification = [arrayForNotifications objectAtIndex:i];
if ([[localNotification.userInfo valueForKey:kAlarmID] isEqualToString:stringForNotificationID])
{
//Cancelling local notification
[app cancelLocalNotification:localNotification];
}
}
}
-(void)repetativeLocalnotificationDictionary:(NSDictionary *) notificationInfo andFireDate:(NSDate *)fireDate withRepeatInterval:(NSCalendarUnit) repeatInterval isForSnooze:(BOOL) fromSnooze {
UILocalNotification *repeatNotification = [[UILocalNotification alloc]init];
[repeatNotification setFireDate:[NSDate dateWithTimeInterval:kDefaultImmediateNotificationTime sinceDate:fireDate]];
[repeatNotification setUserInfo:notificationInfo];
[repeatNotification setAlertBody:[NSString stringWithFormat:kDefaultNotificationMessage]];
[repeatNotification setSoundName:[NSString stringWithFormat:@"%@.%@",[notificationInfo objectForKey:kAlarmSoundName],[[GlobalClass getSoundDetails:[notificationInfo objectForKey:kAlarmSoundName]] objectForKey:kSoundExtention]]];
[repeatNotification setTimeZone:[NSTimeZone localTimeZone]];
[repeatNotification setRepeatInterval:repeatInterval];
// setting weather to provide snooze option or not
if([[notificationInfo objectForKey:kAlarmSnooze] integerValue]){
[repeatNotification setCategory:kNotificationCategoryIdentity];
}
[[UIApplication sharedApplication] scheduleLocalNotification:repeatNotification];
}
- 如果我遗漏了什么,请告诉我
提前谢谢你!
【问题讨论】:
-
你应该传递一个唯一的 id 来取消通知。
-
是的,我已经这样做了,但这也取消了未来的重复通知
-
你的 id 不是唯一的。保存警报时生成一个唯一的 ID 并在信息字典中分配它。