Запустить локальное уведомление в определенное время в iOS

Я пытаюсь создать таймер, который запускает локальное уведомление, чтобы уйти в то время, которое пользователь установил. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу понять, как можно настроить локальное уведомление, например, в 7:00 вечера. Почти все методы, обнаруженные при исследовании этой проблемы, включали местное уведомление, отправляемое в определенное время с текущей даты. Я пытаюсь разрешить пользователю выбирать 7:00 PM, а затем убрать уведомление в это время. Логично, что это может быть достигнуто за счет конечного времени (выбранного пользователем значения) - текущего времени, которое даст вам разницу во времени. Однако я не совсем уверен, как это сделать.

Любая помощь в отношении этой темы будет очень оценена, спасибо. Ниже приведен код, который я использую для запуска локального уведомления.

let center = UNUserNotificationCenter.current()

content.title = storedMessage
content.body = "Drag down to reset or disable alarm"
content.categoryIdentifier = "alarm"
content.userInfo = ["customData": "fizzbuzz"]
content.sound = UNNotificationSound.init(named: "1.mp3")
content.badge = 1

let trigger = UNTimeIntervalNotificationTrigger(timeInterval: timeAmount, repeats: false)
let request = UNNotificationRequest(identifier: "requestAlarm", content: content, trigger: trigger)
    center.add(request)


center.delegate = self

Ответ 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);
  }
  }];

Ответ 2

Для запуска уведомления о конкретном времени используйте код ниже.

let content = UNMutableNotificationContent()
                content.title = "Title"
                content.body = "Body"
                content.sound = UNNotificationSound.default()

                let gregorian = Calendar(identifier: .gregorian)
                let now = Date()
                var components = gregorian.dateComponents([.year, .month, .day, .hour, .minute, .second], from: now)

                // Change the time to 7:00:00 in your locale
                components.hour = 7
                components.minute = 0
                components.second = 0

                let date = gregorian.date(from: components)!

                let triggerDaily = Calendar.current.dateComponents([.hour,.minute,.second,], from: date)
                let trigger = UNCalendarNotificationTrigger(dateMatching: triggerDaily, repeats: true)


                let request = UNNotificationRequest(identifier: CommonViewController.Identifier, content: content, trigger: trigger)
                print("INSIDE NOTIFICATION")

                UNUserNotificationCenter.current().add(request, withCompletionHandler: {(error) in
                    if let error = error {
                        print("SOMETHING WENT WRONG")
                    }
                })

А чтобы запускать постоянно через определенный промежуток времени, например, через каждые 2 минуты, используйте следующую строку для запуска.

let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 120, repeats: true)

Ответ 3

Для Swift вы можете использовать этот код:

  let calendar = Calendar.current
    let components = DateComponents(year: 2018, month: 05, day: 06, hour: 20, minute: 22) // Set the date here when you want Notification
    let date = calendar.date(from: components)
    let comp2 = calendar.dateComponents([.year,.month,.day,.hour,.minute], from: date!)
    let trigger = UNCalendarNotificationTrigger(dateMatching: comp2, repeats: true)

    let content = UNMutableNotificationContent()
    content.title = "Notification Demo"
    content.subtitle = "Demo"
    content.body = "Notification on specific date!!"

    let request = UNNotificationRequest(
        identifier: "identifier",
        content: content,
        trigger: trigger
    )

    UNUserNotificationCenter.current().add(request, withCompletionHandler: { error in
        if error != nil {
            //handle error
        } else {
            //notification set up successfully
        }
    })

Надеюсь это поможет.

Ответ 4

попробуй это

    let dateformateer = NSDateFormatter()
    dateformateer.timeStyle = .ShortStyle

    let notification = UILocalNotification()
    var datecomponent = NSDateComponents()

    datecomponent = NSCalendar.currentCalendar().components([NSCalendarUnit.Day,NSCalendarUnit.Month,NSCalendarUnit.Hour,NSCalendarUnit.Year, NSCalendarUnit.Minute],fromDate: Datepicker.date)


    var fixdate = NSDate()
    fixdate = NSCalendar.currentCalendar().dateFromComponents(datecomponent)!
    notification.fireDate = fixdate
    notification.alertTitle = "Title"
    notification.alertBody = "Body"
   UIApplication.sharedApplication().scheduleLocalNotification(notification)' 

Ответ 5

Это самый простой способ добавить уведомление в определенное время, и он основан на документации разработчика Apple: https://developer.apple.com/documentation/usernotifications

Вот моя реализация в модульной функции:

public func simpleAddNotification(hour: Int, minute: Int, identifier: String, title: String, body: String) {
    // Initialize User Notification Center Object
    let center = UNUserNotificationCenter.current()

    // The content of the Notification
    let content = UNMutableNotificationContent()
    content.title = title
    content.body = body
    content.sound = .default

    // The selected time to notify the user
    var dateComponents = DateComponents()
    dateComponents.calendar = Calendar.current
    dateComponents.hour = hour
    dateComponents.minute = minute

    // The time/repeat trigger
    let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: true)

    // Initializing the Notification Request object to add to the Notification Center
    let request = UNNotificationRequest(identifier: identifier, content: content, trigger: trigger)

    // Adding the notification to the center
    center.add(request) { (error) in
        if (error) != nil {
            print(error!.localizedDescription)
        }
    }
}