Как создать и отменить уникальную UILocalNotification из пользовательского класса?

В настоящее время у меня есть таймер с предупреждением (локальное уведомление).

Я хочу создать класс таймера из этого кода, чтобы создать несколько таймеров и уведомлений (не более 5), и я борюсь с тем, как создавать и отменить уникальные уведомления с помощью метода класса.

- (UILocalNotification *) startAlarm {

    [self cancelAlarm]; //clear any previous alarms

    alarm = [[UILocalNotification alloc] init];
    alarm.alertBody = @"alert msg"
    alarm.fireDate = [NSDate dateWithTimeInterval: alarmDuration sinceDate: startTime]; 
    alarm.soundName = UILocalNotificationDefaultSoundName; 

    [[UIApplication sharedApplication] scheduleLocalNotification:alarm];

}

Мое предположение заключается в том, что если у меня есть метод класса, который создает UILocalNotification под названием "alarm", iOS увидит, что все уведомления являются одним и тем же уведомлением, а следующий метод не будет работать так, как я хочу:

- (void)cancelAlarm {

    if (alarm) {    
        [[UIApplication sharedApplication] cancelLocalNotification:alarm];
    }

}

Итак, мне нужен способ назвать эти UILocalNotifications, поскольку они созданы, например. alarm1 alarm2... alarm5, поэтому я могу отменить правильный.

Спасибо заранее.

Ответ 1

Ответ на вашу проблему лежит в параметре словаря userInfo, который есть у каждого UILocalNotification. Вы можете установить значения для ключей в этом словаре, чтобы идентифицировать уведомление.

Чтобы реализовать это, все, что вам нужно сделать, это иметь свой класс таймера с NSString "name". И используйте некоторую строку класса для ключа для этого значения. Вот базовый пример, основанный на вашем коде:

#define kTimerNameKey @"kTimerNameKey"

-(void)cancelAlarm{
    for (UILocalNotification *notification in [[[UIApplication sharedApplication] scheduledLocalNotifications] copy]){
        NSDictionary *userInfo = notification.userInfo;
        if ([self.name isEqualToString:[userInfo objectForKey:kTimerNameKey]]){
            [[UIApplication sharedApplication] cancelLocalNotification:notification];
        }
    }
}
-(void)scheduleAlarm{
    [self cancelAlarm]; //clear any previous alarms
    UILocalNotification *alarm = [[UILocalNotification alloc] init];
    alarm.alertBody = @"alert msg";
    alarm.fireDate = [NSDate dateWithTimeInterval:alarmDuration sinceDate:startTime]; 
    alarm.soundName = UILocalNotificationDefaultSoundName; 
    NSDictionary *userInfo = [NSDictionary dictionaryWithObject:self.name forKey:kTimerNameKey];
    alarm.userInfo = userInfo;
    [[UIApplication sharedApplication] scheduleLocalNotification:alarm];
}

Эта реализация должна быть относительно понятной. В основном, когда экземпляр класса таймера вызвал -scheduleAlarm и он создает новое уведомление, он устанавливает для него свойство string "name" как значение для kTimerNameKey. Поэтому, когда этот экземпляр вызывает -cancelAlarm, он перечисляет массив уведомлений, ищущих уведомление с этим именем для этого ключа. И если он находит один, он удаляет его.

Я предполагаю, что ваш следующий вопрос будет заключаться в том, как дать каждому свойству имя таймера уникальную строку. Поскольку я знаю, что вы используете IB для их создания (из вашего другого вопроса по этому вопросу), вы, вероятно, сделаете это в viewDidLoad что-то вроде:

self.timerA.name = @"timerA";
self.timerB.name = @"timerB";

Вы также можете связать свойство name с ярлыком заголовка, который у вас может быть.