Ответ 1
Ну, в iOS 10 Apple устарела UILocalNotification, что означает, что пришло время ознакомиться с новой системой уведомлений.
Настройка Это длинный пост, поэтому можно легко начать с импорта новой структуры уведомлений:
// Swift
import UserNotifications
// Objective-C (with modules enabled)
@import UserNotifications;
Управление уведомлениями через общий объект UNUserNotificationCenter:
// Swift
let center = UNUserNotificationCenter.current()
// Objective-C
UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
Авторизация Как и в случае с более ранней структурой уведомлений, вы должны иметь разрешение пользователей на типы уведомлений, которые будет использовать ваше приложение. Сделайте запрос на раннем этапе вашего жизненного цикла приложения, например, в приложении: didFinishLaunchingWithOptions:. При первом запросе авторизации вашего приложения система показывает пользователю предупреждение, после чего они могут управлять разрешениями из настроек:
// Swift
let options: UNAuthorizationOptions = [.alert, .sound];
// Objective-C
UNAuthorizationOptions options = UNAuthorizationOptionAlert + UNAuthorizationOptionSound;
Вы делаете фактический запрос авторизации с помощью центра общих уведомлений:
// Swift
center.requestAuthorization(options: options) { (granted, error) in
if !granted {
print("Something went wrong")
}
}
// Objective-C
[center requestAuthorizationWithOptions:options
completionHandler:^(BOOL granted, NSError * _Nullable error) {
if (!granted) {
NSLog(@"Something went wrong");
}
}];
Структура вызывает обработчик завершения с логическим значением, указывающим, был ли предоставлен доступ, и объект ошибки, который будет равен нулю, если ошибка не возникла.
Примечание. Пользователь может изменить настройки уведомлений для вашего приложения в любое время. Вы можете проверить разрешенные настройки с помощью метода getNotificationSettings. Это асинхронно вызывает блок завершения с объектом UNNotificationSettings, который вы можете использовать для проверки статуса авторизации или отдельных настроек уведомления:
// Swift
center.getNotificationSettings { (settings) in
if settings.authorizationStatus != .authorized {
// Notifications not allowed
}
}
// Objective-C
[center getNotificationSettingsWithCompletionHandler:^(UNNotificationSettings * _Nonnull settings) {
if (settings.authorizationStatus != UNAuthorizationStatusAuthorized) {
// Notifications not allowed
}
}];
Создание запроса на уведомление Запрос уведомления UNNotificationRequest содержит контент и условие триггера:
Содержание уведомления
Содержимое уведомления представляет собой экземпляр объекта UNMutableNotificationContent со следующими параметрами, установленными по мере необходимости:
title: Строка, содержащая основную причину предупреждения.
субтитры: строка, содержащая субтитры предупреждений (если требуется)
body: Строка, содержащая текст сообщения предупреждения
Значок: номер для показа на значке приложений.
звук: звук, который будет воспроизводиться при подаче оповещения. Используйте UNNotificationSound.default() или создайте пользовательский звук из файла. launchImageName: имя образа запуска, которое будет использоваться при запуске приложения в ответ на уведомление.
userInfo: словарь пользовательской информации для передачи в уведомлении Вложения: массив объектов UNNotificationAttachment. Используйте для включения аудио, изображения или видеоконтента.
Обратите внимание, что при локализации строк предупреждений, таких как заголовок, лучше использовать localizedUserNotificationString (forKey: arguments:), который задерживает загрузку локализации до тех пор, пока не будет отправлено уведомление.
Быстрый пример:
// Swift
let content = UNMutableNotificationContent()
content.title = "Don't forget"
content.body = "Buy some milk"
content.sound = UNNotificationSound.default()
// Objective-C
UNMutableNotificationContent *content = [UNMutableNotificationContent new];
content.title = @"Don't forget";
content.body = @"Buy some milk";
content.sound = [UNNotificationSound defaultSound];
Тревога уведомления
Запуск уведомления о времени, календаре или местоположении. Триггер может повторяться:
Интервал времени: Запланировать уведомление на несколько секунд позже. Например, чтобы запустить через пять минут:
// Swift
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 300, repeats: false)
// Objective-C
UNTimeIntervalNotificationTrigger *trigger = [UNTimeIntervalNotificationTrigger triggerWithTimeInterval:300
repeats:NO];
Календарь: запуск в определенную дату и время. Триггер создается с использованием компонента компонентов даты, что упрощает некоторые повторяющиеся интервалы. Чтобы преобразовать дату в ее дату, компоненты используют текущий календарь. Например:
// Swift
let date = Date(timeIntervalSinceNow: 3600)
let triggerDate = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute, .second], from: date)
// Objective-C
NSDate *date = [NSDate dateWithTimeIntervalSinceNow:3600];
NSDateComponents *triggerDate = [[NSCalendar currentCalendar]
components:NSCalendarUnitYear +
NSCalendarUnitMonth + NSCalendarUnitDay +
NSCalendarUnitHour + NSCalendarUnitMinute +
NSCalendarUnitSecond fromDate:date];
Чтобы создать триггер из компонентов даты:
// Swift
let trigger = UNCalendarNotificationTrigger(dateMatching: triggerDate, repeats: false)
// Objective-C
UNCalendarNotificationTrigger *trigger = [UNCalendarNotificationTrigger triggerWithDateMatchingComponents:triggerDate
repeats:NO];
Чтобы создать триггер, который повторяется с определенным интервалом, используйте правильный набор компонентов даты. Например, чтобы ежедневное уведомление повторялось, нам нужны только час, минуты и секунды:
let triggerDaily = Calendar.current.dateComponents([hour, .minute, .second], from: date)
let trigger = UNCalendarNotificationTrigger(dateMatching: triggerDaily, repeats: true)
Чтобы повторять еженедельно в то же время, нам также нужен будний день:
let triggerWeekly = Calendar.current.dateComponents([.weekday, .hour, .minute, .second], from: date)
let trigger = UNCalendarNotificationTrigger(dateMatching: triggerWeekly, repeats: true)
Планирование
При подготовке контента и триггера мы создаем новый запрос на уведомление и добавляем его в центр уведомлений. Для каждого запроса на уведомление требуется идентификатор строки для справки в будущем:
// Swift
let identifier = "UYLLocalNotification"
let request = UNNotificationRequest(identifier: identifier, content: content, trigger: trigger)
center.add(request, withCompletionHandler: { (error) in
if let error = error {
// Something went wrong
}
})
// Objective-C
NSString *identifier = @"UYLLocalNotification";
UNNotificationRequest *request = [UNNotificationRequest requestWithIdentifier:identifier
content:content trigger:trigger]
[center addNotificationRequest:request withCompletionHandler:^(NSError * _Nullable error) {
if (error != nil) {
NSLog(@"Something went wrong: %@",error);
}
}];