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

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

Жанры

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

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

Шрифт:

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

— (BOOL) application:(UIApplication *)application

didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{

if (launchOptions[UIApplicationLaunchOptionsLocalNotificationKey]!= nil){

UILocalNotification *notification =

launchOptions[UIApplicationLaunchOptionsLocalNotificationKey];

[self application: application didReceiveLocalNotification: notification];

} else {

[self scheduleLocalNotification];

}

self.window = [[UIWindow alloc]

initWithFrame: [[UIScreen mainScreen] bounds]];

self.window.backgroundColor = [UIColor whiteColor];

[self.window makeKeyAndVisible];

return YES;

}

Когда

в предыдущем коде наше приложение запускалось в результате поступления локального уведомления, мы перенаправляли локальное уведомление в метод application: didReceiveLocalNotification:, где оперировали имеющимся уведомлением и отображали для пользователя предупреждение. Вот простая реализация вышеупомянутого метода:

— (void) application:(UIApplication *)application

didReceiveLocalNotification:(UILocalNotification *)notification{

NSString *key1Value = notification.userInfo[@"Key 1"];

NSString *key2Value = notification.userInfo[@"Key 2"];

if ([key1Value length] > 0 &&

[key2Value length] > 0){

UIAlertView *alert =

[[UIAlertView alloc] initWithTitle: nil

message:@"Handling the local notification"

delegate: nil

cancelButtonTitle:@"OK"

otherButtonTitles: nil];

[alert show];

}

}

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

См. также

Разделы 15.0 и 15.4.

15.6. Обработка локальных системных уведомлений

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

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

Решение

Нужно просто слушать конкретное уведомление из числа тех, которые операционная система iOS посылает приложениям, переходящим в приоритетный режим. Далее перечислены некоторые из таких уведомлений:

• NSCurrentLocaleDidChangeNotification — доставляется приложениям, когда изменяется локализация устройства. Например, на странице Settings (Настройки) пользователь активизирует испанский язык вместо английского;

• NSUserDefaultsDidChangeNotification — запускается, когда пользователь изменяет настройки приложения на странице Settings (Настройки)

устройства с iOS — при условии, что пользователь может изменить какую-либо настройку в вашем приложении;

• UIDeviceBatteryStateDidChangeNotification — запускается всякий раз, когда на устройстве с iOS изменяется состояние батареи. Например, если устройство подключается к компьютеру, когда приложение работает в приоритетном режиме, а потом отключается от компьютера, но приложение к этому моменту уже находится в фоновом режиме, то приложение получит такое уведомление (предполагается, что оно зарегистрировано на получение таких уведомлений). В подобном случае для считывания состояния можно узнать значение свойства batteryState экземпляра класса UIDevice;

• UIDeviceProximityStateDidChangeNotification — направляется приложению всякий раз, когда изменяется состояние датчика близости (Proximity Sensor). Последнее состояние можно узнать в свойстве proximityState экземпляра UIDevice.

Обсуждение

Пока ваше приложение работает в фоновом режиме, может произойти многое! Например, пользователь может вдруг изменить локализацию устройства с iOS на странице Settings (Настройки) и задать, к примеру, испанский язык вместо английского. Приложения могут регистрироваться для получения таких уведомлений. Эти уведомления будут объединяться, а потом вместе доставляться приложению, переходящему в приоритетный режим. Объясню, что я понимаю в данном случае под объединением). Предположим, что ваше приложение работает в приоритетном режиме и вы зарегистрировали его для получения уведомлений UIDeviceOrientationDidChangeNotification. Вот пользователь нажимает кнопку Home (Домой), и ваше приложение уходит в фоновый режим. Потом пользователь изменяет ориентацию устройства с книжной на альбомную правую, затем возвращает книжную ориентацию и, наконец, переводит в альбомную левую. И когда пользователь вернет ваше приложение в приоритетный режим, оно получит всего одно уведомление типа UIDeviceOrientationDidChangeNotification. Это и есть объединение. Все остальные изменения ориентации, которые происходили, пока ваше приложение не было открыто, игнорируются (действительно, они не имеют значения, раз программы не было на экране, когда они происходили), и система не будет сообщать информацию о них вашему приложению. Тем не менее система доставит вам как минимум одно уведомление по каждому аспекту, связанному с устройством, — в частности, по ориентации. Так вы сможете узнать самую актуальную информацию о том, в каком положении находится устройство.

Вот реализация простого контроллера вида, в котором эта техника используется для определения изменений ориентации:

#import «ViewController.h»

@implementation ViewController

— (void) orientationChanged:(NSNotification *)paramNotification{

NSLog(@"Orientation Changed");

}

— (void)viewDidAppear:(BOOL)paramAnimated{

[super viewDidAppear: paramAnimated];

/* Слушаем уведомление */

[[NSNotificationCenter defaultCenter]

addObserver: self

selector:@selector(orientationChanged:)

name: UIDeviceOrientationDidChangeNotification

object: nil];

}

— (void) viewDidDisappear:(BOOL)paramAnimated{

[super viewDidDisappear: paramAnimated];

/* Прекращаем слушать уведомление */

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

Наномашины, ученик! Том 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