Разовьем код, рассмотренный в качестве примера в разделе 15.4. При запуске уведомления независимо от того, в каком состоянии в этот момент находится приложение, мы обработаем это уведомление (выведем для пользователя окно с предупреждением). Сначала используем код, изученный в разделе 15.4, в отдельном методе. Так мы сможем просто вызвать этот метод и назначить новое локальное уведомление. Вот почему поступаем именно так: в данном случае мы сможем посмотреть в центре уведомлений iOS, открылось ли приложение после того, как пользователь нажал появившееся на экране локальное уведомление. Если приложение открылось, то мы
— (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:, где оперировали имеющимся уведомлением и отображали для пользователя предупреждение. Вот простая реализация вышеупомянутого метода: