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

ЖАНРЫ

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

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

Шрифт:

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];

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

[[NSNotificationCenter defaultCenter]

removeObserver: self

name: UIDeviceOrientationDidChangeNotification

object: nil];

}

@end

Теперь запустите приложение на устройстве. После того как на экране отобразится контроллер вида, нажмите кнопку Home (Домой) для перевода приложения в фоновый режим. После этого попробуйте пару раз изменить ориентацию устройства, а потом перезапустите приложение. Просмотрите результаты и обратите внимание на то, что, когда приложение открывается, обычно направляется одно уведомление к методу orientationChanged:.

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

Решение

Зарегистрируйтесь для получения уведомлений NSUserDefaultsDidChangeNotification.

Обсуждение

В приложениях, написанных для iOS, файл пакета настроек может быть предоставлен пользователю для внесения собственных настроек. Эти настройки будут доступны пользователю в приложении (Settings) на устройстве. Чтобы лучше понять, как работает этот механизм, создадим пакет с настройками.

1. В Xcode выберите File — New File (Файл — Новый файл).

2. Убедитесь, что слева задана категория iOS.

3. Выберите подкатегорию Resources (Ресурсы).

4. В качестве типа файла укажите пакет настроек (Settings Bundle), а потом нажмите Next (Далее).

5. Назовите файл Settings.bundle.

6. Нажмите Save (Сохранить).

Итак, теперь у вас в Xcode есть файл под названием Settings.bundle. Оставьте этот файл как есть, не вносите в него никаких изменений. Нажмите кнопку Home (Домой) и перейдите в приложение Settings (Настройки). Если вы назовете свое приложение foo, то в окне настроек, показанном на рис. 15.4, также будет указано Foo. (Мое приложение я назвал Handling local System Notifications, это название вы видите на рисунке.)

Поделиться с друзьями: