ПРОГРАММИРОВАНИЕ ПОД IPHONE, IPAD OBJECTIVE-C часть 3

Локальные уведомления (UILocalNotification)

 

Продолжая тему уведомлений хочу продемонстрировать пример работы с UILocalNotification. Это похоже на Push Notification (о нем будет расказано позже), но работает без сервера. Ближе к делу, давайте создадим новый проект на основе шаблона Single View Application и назовем его LocalNotification. Теперь перейдем в файл ViewController.m и изменим метод viewDidLoad:

 

<code data-result="[object Object]">- (void)viewDidLoad
{
    [super viewDidLoad];

    UILocalNotification *notification = [UILocalNotification new];
    notification.timeZone  = [NSTimeZone systemTimeZone];
    notification.fireDate  = [[NSDate date] dateByAddingTimeInterval:5.0f];
    notification.alertAction = @"More info"; 
    notification.alertBody = @"iMaladec Local Notification example";
    notification.soundName = UILocalNotificationDefaultSoundName;
    [[UIApplication sharedApplication] scheduleLocalNotification:notification];
    [notification release];
}</code>

 

Разберем код построчно:

 

— создаем объект клсса UILocalNotification (это и есть наше уведомление);

— устанавливаем временную зону;

— устанавливаем дату отображения вседомления (метод [NSDate date] возвращает текущую дату, а dateByAddingTimeIntervalприбавляет к дате количество секунд);

— устанавливаем текст кнопке, по нажатию на которую будет открываться приложение;

— устанавливаем текст уведомления;

— устанавливаем имя звукового файла, который будет проигрываться в момент вызова уведомления (файл должен находиться в проекте, а не в папке документов), в данном примере будет просто вибрировать устройство (на симуляторе не работает 🙂 );

— добавляем приложение в программу и освобождаем после него память.

 

Для достижения результата следует свернуть приложение в течении 5 секунд после его запуска.

 

Если вы хотите отменить вызов уведомления — следует использовать метод cancelAllLocalNotifications. Изменим метод viewDidLoad с учетом новых поправок.

 

<code data-result="[object Object]">- (void)viewDidLoad
{
    [super viewDidLoad];

    UIApplication *app                = [UIApplication sharedApplication];
    NSArray *oldNotifications         = [app scheduledLocalNotifications];

    if ([oldNotifications count] &gt; 0) {
        [app cancelAllLocalNotifications];
    }

    UILocalNotification *notification = [UILocalNotification new];
    notification.timeZone  = [NSTimeZone systemTimeZone];
    notification.fireDate  = [[NSDate date] dateByAddingTimeInterval:5.0f];
    notification.alertAction = @"More info"; 
    notification.alertBody = @"iMaladec Local Notification example";
    notification.soundName = UILocalNotificationDefaultSoundName;

    [app scheduleLocalNotification:notification];
    [notification release];
}</code>

 

Я перенес ссылку на объект Application в отдельную переменную (для упрощения кода). Затем, с помощью метода scheduledLocalNotifications, получил массив всех уведомлений и если этот массив не пустой — отменяю их все.

 

Так же, существует возможность отмены не всех уведомлений, а по специальному отбору, но для этого их нужно сначала пометить.

 

<code data-result="[object Object]">- (void)viewDidLoad
{
    [super viewDidLoad];

    UIApplication *app                = [UIApplication sharedApplication];
    NSArray *oldNotifications         = [app scheduledLocalNotifications];

//    if ([oldNotifications count] &gt; 0) {
//        [app cancelAllLocalNotifications];
//    }

    for (UILocalNotification *aNotif in oldNotifications) {
        if([[aNotif.userInfo objectForKey:@"ID"] isEqualToString:@"0"]) {
            [app cancelLocalNotification:aNotif];
        }
    }

    UILocalNotification *notification = [UILocalNotification new];
    notification.timeZone  = [NSTimeZone systemTimeZone];
    notification.fireDate  = [[NSDate date] dateByAddingTimeInterval:5.0f];
    notification.alertAction = @"More info"; 
    notification.alertBody = @"iMaladec Local Notification example";
    notification.soundName = UILocalNotificationDefaultSoundName;

    NSDictionary *infoDict = [NSDictionary dictionaryWithObject:@"0" forKey:@"id"]; 
    notification.userInfo = infoDict; 

    [app scheduleLocalNotification:notification];
    [notification release];
}</code>

 

Теперь, перед добавлением уведомления в приложение мы установили значение свойству userInfo. А преред отменой — проверяем все уведомления на равенство этому свойству.

 

Исходный код этого проекта можно скачать здесь.

Comments are closed.