Чтение онлайн

на главную - закладки

Жанры

iOS. Приемы программирования

Нахавандипур Вандад

Шрифт:

notification.timeZone = [[NSCalendar currentCalendar] timeZone];

notification.alertBody =

NSLocalizedString(@"A new item is downloaded.", nil);

/* Настройки действий */

notification.hasAction = YES;

notification.alertAction = NSLocalizedString(@"View", nil);

/* Настройки ярлыка */

notification.applicationIconBadgeNumber =

[UIApplication sharedApplication].applicationIconBadgeNumber + 1;

/* Дополнительная
информация, пользовательский словарь */

notification.userInfo = @{@"Key 1": @"Value 1",

@"Key 2": @"Value 2"};

/* Назначаем уведомление */

[[UIApplication sharedApplication] scheduleLocalNotification: notification];

self.window = [[UIWindow alloc]

initWithFrame: [[UIScreen mainScreen] bounds]];

self.window.backgroundColor = [UIColor whiteColor];

[self.window makeKeyAndVisible];

return YES;

}

Все это хорошо, но локальные уведомления практически бесполезны, пока мы не умеем на них реагировать и обрабатывать их при срабатывании. В разделе 15.5 подробнее рассказано об обработке таких уведомлений.

См. также

Раздел 15.0.

15.5. Слушание локальных уведомлений и реагирование на них

Постановка задачи

Вы научились планировать локальные уведомления (см. раздел 15.4). При поступлении этих уведомлений в приложение на них нужно правильно реагировать.

Решение

Реализуйте метод application: didReceiveLocalNotification: делегата вашего приложения и считайте ключ UIApplicationLaunchOptionsLocalNotificationKey, относящийся к словарю параметров запуска вашего приложения при вызове метода application: didFinishLaunchingWithOptions: в делегате приложения. В подразделе «Обсуждение» данного раздела подробнее объяснено, почему приходится обрабатывать локальное уведомление в двух местах, а не в одном.

Обсуждение

Когда происходит доставка локального уведомления и вам приходится его обрабатывать, приложение может находиться в одном из нескольких состояний. В зависимости от состояния обработка уведомления будет происходить по-разному. Вот ряд ситуаций, в которых iOS может доставить вашему приложению заранее запланированное локальное уведомление.

• В момент прихода локального уведомления приложение открыто и пользователь работает с ним. В таком случае при доставке уведомления вызывается метод application: didReceiveLocalNotification:.

• Локальное уведомление доставлено, но пользователь перевел приложение в фоновый режим. Как только пользователь дотрагивается до появившегося на экране уведомления, iOS может запустить приложение. В таком случае опять же вызывается метод application: didReceiveLocalNotification: делегата вашего приложения.

• В момент доставки локального уведомления приложение вообще неактивно. В данном случае вызывается метод application: didFinishLaunchingWithOptions: делегата приложения. Ключ UIApplicationLaunchOptionsLocalNotificationKey в словарном параметре didFinishLaunchingWithOptions этого метода содержит локальное уведомление, которое и привело к активизации приложения.

• Локальное уведомление поступает,

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

Разовьем код, рассмотренный в качестве примера в разделе 15.4. При запуске уведомления независимо от того, в каком состоянии в этот момент находится приложение, мы обработаем это уведомление (выведем для пользователя окно с предупреждением). Сначала используем код, изученный в разделе 15.4, в отдельном методе. Так мы сможем просто вызвать этот метод и назначить новое локальное уведомление. Вот почему поступаем именно так: в данном случае мы сможем посмотреть в центре уведомлений iOS, открылось ли приложение после того, как пользователь нажал появившееся на экране локальное уведомление. Если приложение открылось, то мы не будем запускать другое локальное уведомление. Однако если локальное уведомление не открыло наше приложение, то запланируем новое локальное уведомление. Далее приведен метод приложения, назначающий локальные уведомления, которые должны доставляться приложению через 8 секунд после вызова метода:

— (void) scheduleLocalNotification{

UILocalNotification *notification = [[UILocalNotification alloc] init];

/* Настройки времени и часового пояса */

notification.fireDate = [NSDate dateWithTimeIntervalSinceNow:8.0];

notification.timeZone = [[NSCalendar currentCalendar] timeZone];

notification.alertBody =

NSLocalizedString(@"A new item is downloaded.", nil);

/* Настройки действий */

notification.hasAction = YES;

notification.alertAction = NSLocalizedString(@"View", nil);

/* Настройки ярлыка */

notification.applicationIconBadgeNumber =

[UIApplication sharedApplication].applicationIconBadgeNumber + 1;

/* Дополнительная информация, пользовательский словарь */

notification.userInfo = @{@"Key 1": @"Value 1",

@"Key 2": @"Value 2"};

/* Назначаем уведомление */

[[UIApplication sharedApplication] scheduleLocalNotification: notification];

}

Метод, который мы здесь написали, называется scheduleLocalNotification. Как понятно из его названия, он просто создает объект уведомления и запрашивает iOS назначить это уведомление. Не путайте наш собственный метод scheduleLocalNotification с методом iOS, который называется scheduleLocalNotification: и относится к классу UIApplication (как и у всех методов iOS, в конце названия этого метода стоит двоеточие). Этот метод можно считать удобным вспомогательным инструментом, выполняющим сложную задачу назначения локального уведомления. При этом сам он просто создает объект уведомления, а назначение этого уведомления делегирует iOS.

Поделиться:
Популярные книги

Наномашины, ученик! Том 6

Новиков Николай Васильевич
6. Первый среди карапузов
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Наномашины, ученик! Том 6

Хозяин Теней 3

Петров Максим Николаевич
3. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Хозяин Теней 3

Сердце Дракона. Том 12

Клеванский Кирилл Сергеевич
12. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.29
рейтинг книги
Сердце Дракона. Том 12

Стражи душ

Кас Маркус
4. Артефактор
Фантастика:
городское фэнтези
попаданцы
аниме
5.00
рейтинг книги
Стражи душ

Поводырь

Щепетнов Евгений Владимирович
3. Ботаник
Фантастика:
фэнтези
6.17
рейтинг книги
Поводырь

Неофит

Листратов Валерий
3. Ушедший Род
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Неофит

Тьма и Хаос

Владимиров Денис
6. Глэрд
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Тьма и Хаос

Сильнейший Столп Империи. Книга 5

Ермоленков Алексей
5. Сильнейший Столп Империи
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Сильнейший Столп Империи. Книга 5

Бастард

Майерс Александр
1. Династия
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард

Вечный. Книга VI

Рокотов Алексей
6. Вечный
Фантастика:
рпг
фэнтези
5.00
рейтинг книги
Вечный. Книга VI

Я еще не барон

Дрейк Сириус
1. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я еще не барон

Двойник короля 19

Скабер Артемий
19. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Двойник короля 19

Кодекс Крови. Книга IХ

Борзых М.
9. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга IХ

Бастард Императора. Том 15

Орлов Андрей Юрьевич
15. Бастард Императора
Фантастика:
городское фэнтези
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Бастард Императора. Том 15