【问题标题】:Cancelling and Rescheduling UILocalNotification with repeat interval is firing again使用重复间隔取消和重新安排 UILocalNotification 再次触发
【发布时间】: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 并在信息字典中分配它。

标签: ios uilocalnotification


【解决方案1】:

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

-(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 ] ;
                }
            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    • 1970-01-01
    相关资源
    最近更新 更多