Вандад Нахавандипур - iOS. Приемы программирования
- Название:iOS. Приемы программирования
- Автор:
- Жанр:
- Издательство:Питер
- Год:2014
- Город:Санкт-Петербург
- ISBN:978-5-496-01016-0
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Вандад Нахавандипур - iOS. Приемы программирования краткое содержание
Книга, которую вы держите в руках, представляет собой новый, полностью переписанный сборник приемов программирования по работе с iOS. Он поможет вам справиться с наболевшими проблемами, с которыми приходится сталкиваться при разработке приложений для iPhone, iPad и iPod Touch. Вы быстро освоите всю информацию, необходимую для начала работы с iOS 7 SDK, в частности познакомитесь с решениями для добавления в ваши приложения реалистичной физики или движений — в этом вам помогут API UIKit Dynamics.
Вы изучите новые многочисленные способы хранения и защиты данных, отправки и получения уведомлений, улучшения и анимации графики, управления файлами и каталогами, а также рассмотрите многие другие темы. При описании каждого приема программирования приводятся образцы кода, которые вы можете смело использовать.
iOS. Приемы программирования - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
• Локальное уведомление доставлено, но пользователь перевел приложение в фоновый режим. Как только пользователь дотрагивается до появившегося на экране уведомления, 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.
Теперь в методе 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.
Читать дальшеИнтервал:
Закладка: