使用重复间隔取消和重新安排UILocalNotification将再次触发

时间:2016-04-01 11:19:29

标签: ios 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];
}
  • 告诉我,如果我遗漏了什么

提前谢谢你!

1 个答案:

答案 0 :(得分:0)

这是每天发布通知的代码。

-(void) scheduleLocalNotificationDaily:(NSDate *)fireDate
{

       NSDictionary * infoDict = @{
                     @"alarmUiqueId" : uID,

                     };

    NSDateComponents *comp = [[NSCalendar currentCalendar] components:NSCalendarUnitSecond
                                                             fromDate:fireDate];
    fireDate = [fireDate dateByAddingTimeInterval:-comp.second];
    UILocalNotification *localNotif = [[UILocalNotification alloc] init];
    localNotif.fireDate = fireDate;
    localNotif.timeZone = [NSTimeZone localTimeZone];    
    localNotif.alertBody = @"Time to wake Up";
    localNotif.alertAction = @"Show me";

    localNotif.soundName = @"3D bird tone.mp3";


        localNotif.userInfo = infoDict;

    localNotif.repeatInterval = NSCalendarUnitDay;
    NSLog(@" date %lu",kCFCalendarUnitDay);
    [[UIApplication sharedApplication] scheduleLocalNotification:localNotif];


}

以及在交换机或其他地方取消此特定通知。

for(UILocalNotification *notification in notificationArray)
            {

                NSLog(@"%@",[notification.userInfo valueForKey:@"alarmUiqueId"]);
                NSLog(@"%@",alrm.uniqueId);
                if ([[notification.userInfo valueForKey:@"alarmUiqueId" ] isEqualToNumber: alrm.uniqueId])
                {
                    [[UIApplication sharedApplication] cancelLocalNotification:notification ] ;
                }
            }