Как создать и отменить уникальное уведомление 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 с именем «будильник», iOS увидит все уведомления как одно и то же уведомление, и следующий метод не будет работать так, как я хочу:

- (void)cancelAlarm {

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

}

Поэтому мне нужен способ назвать эти UILocalNotifications по мере их создания, например. будильник 1 будильник 2... будильник 5, чтобы я мог отменить правильный.

Заранее спасибо.


person Michael Campsall    schedule 10.02.2012    source источник
comment
Вы можете сохранить их в NSMutableArray или NSMutableDictionary (назначив им ключ) и освободить их, пройдя по контейнеру.   -  person Joel Kravets    schedule 11.02.2012
comment
Спасибо, я попробую.   -  person Michael Campsall    schedule 12.02.2012


Ответы (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 и он создает новое уведомление, он устанавливает свое строковое свойство «имя» в качестве значения для kTimerNameKey. Поэтому, когда этот экземпляр вызывает -cancelAlarm, он перечисляет массив уведомлений в поисках уведомления с его именем для этого ключа. И если он находит один, он удаляет его.

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

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

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

person NJones    schedule 16.02.2012
comment
Большое спасибо еще раз! Очень понятное объяснение и хороший пример кода. Все имеет смысл и работает как шарм. Однако мне было любопытно, почему необходимо копировать cheduledNotifications. - person Michael Campsall; 17.02.2012
comment
@jemicha Рад, что смог помочь. Отвечая на ваш вопрос, зачем нужно было копировать scheduledLocalNotifications, это не так. Это пример моей крайней паранойи. Если Apple когда-либо раскроет свои внутренние NSMutableArray уведомлений либо через изменение политики (что маловероятно, это смехотворно), либо из-за ошибки, эта копия позволит избежать возможных проблем. Но опять же, если вы пропустите это, вы, вероятно, никогда не увидите разницы. - person NJones; 18.02.2012
comment
Где вы ставите dictionaryWithObject:self.name - как вы меняете self.name на уникальный идентификатор? - person Supertecnoboff; 20.03.2016