0
を発射されて、私のアプリケーションでは、私はそれが繰り返し間隔持っていると UILocalNotificationを発射している(同様に:すべての 日、平日、...など)を、すべての通知をキャンセルしてすべての通知を再スケジューリングしていますが、すでに同じ番号の 通知が再度送信されています。 は、次回の予定日時に来る予定ですが、今後は になります。はキャンセルと繰り返し間隔で再スケジューリング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を渡す必要があります。 – salmancs43
はい、私はそれをしましたが、将来のリピート通知をキャンセルすることもあります。 –
あなたのIDは一意ではありません。あなたのアラームを保存するときに一意のIDを生成し、それを情報辞書に割り当てます。 – salmancs43