UNCalendarNotificationTrigger не сохраняется, если повторы не верны

Я заметил, что если я создаю UNCalendarNotificationTrigger с пользовательской датой, он не добавится, если я не поставлю: let trigger = UNCalendarNotificationTrigger(dateMatching: components, repeats: **true**)

Пример Apple:

 let date = DateComponents() date.hour = 8 date.minute = 30 let trigger = UNCalendarNotificationTrigger(dateMatching: date, repeats: true) 

которые имеют смысл повторять == true.

В моем сценарии мне не нужно создавать одно уведомление, которое повторяется много раз, но мне нужно несколько notificaitons, выпущенных только один раз на конкретную дату календаря (что, конечно же, в будущем).

Если я это сделаю:

 let calendar = Calendar(identifier: .gregorian) let formatter = DateFormatter() formatter.dateFormat = "yyyyMMdd" let newdate = formatter.date(from: "20161201") let components = calendar.dateComponents(in: .current, from: newdate!) let trigger = UNCalendarNotificationTrigger(dateMatching: components, repeats: false) 

то я всегда получаю 0 ожидающих уведомлений …

  UNUserNotificationCenter.current().getPendingNotificationRequests(completionHandler: { (notifications) in print("num of pending notifications \(notifications.count)") }) num of pending notification 0 

Есть идеи?

EDIT1: добавление другого контекста, как указано в одном из ответов. Я фактически добавляю запрос к текущему UNUserNotificationQueue.

  let request = UNNotificationRequest(identifier: "future_calendar_event_\(date_yyyyMMdd)", content: content, trigger: trigger) UNUserNotificationCenter.current().add(request) { error in if let error = error { // Do something with error print(error.localizedDescription) } else { print("adding \((request.trigger as! UNCalendarNotificationTrigger).dateComponents.date)") } } 

У меня такая же проблема, и я решаю ее сейчас. Это связано с датой года.

Чтобы решить эту проблему, я тестирую следующий код:

1.

 let notificationCenter = UNUserNotificationCenter.current() let notificationDate = Date().addingTimeInterval(TimeInterval(10)) let component = calendar.dateComponents([.year,.day,.month,.hour,.minute,.second], from: notificationDate) print(component) let trigger = UNCalendarNotificationTrigger(dateMatching: component, repeats: false) let request = UNNotificationRequest(identifier: item.addingDate.description, content: content, trigger: trigger) self.notificationCenter.add(request){(error) in if let _ = error { assertionFailure() } } 

В консоли component печати:

 year: 106 month: 2 day: 14 hour: 12 minute: 3 second: 42 isLeapMonth: false 

И в этом случае уведомление не может быть найдено в ожидающем списке уведомлений.

2.Когда я установил год component явном виде до 2017 года:

 let notificationDate = Date().addingTimeInterval(TimeInterval(10)) var component = calendar.dateComponents([.year,.day,.month,.hour,.minute,.second], from: notificationDate) component.year = 2017 print(component) let trigger = UNCalendarNotificationTrigger(dateMatching: component, repeats: false) let request = UNNotificationRequest(identifier: item.addingDate.description, content: content, trigger: trigger) self.notificationCenter.add(request){(error) in if let _ = error { assertionFailure() } } 

В консоли component :

 year: 2017 month: 2 day: 14 hour: 12 minute: 3 second: 42 isLeapMonth: false 

Затем это уведомление можно найти в списке ожидающих уведомлений.

И затем я проверяю запросы ожидающих уведомлений, чтобы узнать, является ли компонент года даты запуска триггером равным 106 или 2017:

 notificationCenter.getPendingNotificationRequests(){[unowned self] requests in for request in requests { guard let trigger = request.trigger as? UNCalendarNotificationTrigger else {return} print(self.calendar.dateComponents([.year,.day,.month,.hour,.minute,.second], from: trigger.nextTriggerDate()!)) } } 

Я обнаружил, что следующие триггерные компоненты триггера:

 year: 106 month: 2 day: 14 hour: 12 minute: 3 second: 42 isLeapMonth: false 

Вывод

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

Дата по умолчанию Годкомпонентный год может быть непригодным, например, 106. Если вы хотите, чтобы уведомление было отправлено в 2017 году, вы должны установить компоненты года до 2017 года явно.

Возможно, это ошибка, потому что я устанавливаю дату dateComponents от триггера до 2017 года, но получаю 106 в nextTriggerDate ожидающего запроса на уведомление.

UNCalendarNotificationTrigger создает расписание, для которого должно происходить уведомление, но оно не выполняет планирование. Для этого вам нужно создать UNNotificationRequest а затем добавить его в центр уведомлений. Что-то вроде:

  let request = UNNotificationRequest(identifier: "MyTrigger", content: content, trigger: trigger) UNUserNotificationCenter.current().add(request) { error in if let error = error { // Do something with error } else { // Request was added successfully } } 
  • изменить страницы в UIPageViewController Автоматически с таймером в быстром 3?
  • Создание бета-документации XCode 8
  • Xcode 8 / Swift 3: didSelectRowAt vs didSelectRowAtIndexPath
  • Селектор в swift3
  • Кодировка Base64 с Swift 3
  • Alamofire async call
  • UIImagePickerController в Swift 3
  • В чем разница между Target и Action in swift?
  • UIView.animate - Swift 3 - завершение
  • как установить массив даты в fireDate в локальном уведомлении за раз
  • Как использовать регулярные выражения в Swift 3?
  • Interesting Posts

    Как установить программные параметры topBar и bottomBar UIView?

    Как я могу получить список классов, уже загруженных в память в определенном пакете (или двоичном)?

    Push Notification для существующего приложения в iOS

    Ограничение размера приложения и определение размера вашего приложения

    значок приложения iOs, не такой яркий, как на мониторе

    Цель c – ios: Как выбрать видео из Camera Roll?

    iOS – Размер MTU для передачи данных BLE между устройством iOS и внешним аксессуаром (BluetoothWatch)

    Ошибка компиляции iOS Swift и reloadRowsAtIndexPaths

    Как сгенерировать CGPoint-Array из UIBezierPath (для перемещения объекта по заданному пути)

    Работа с библиотеками в Xcode (т.е. ImageMagick, AdMob) включена в проект или ссылку?

    Файл XSode 4.4 .strings добавляет новую локализацию

    Вызов быстрого закрытия в закрытом помещении

    Как отредактировать NSManagedObjectModel, который был загружен из мама в iOS5

    Сжатие UIImage в данные изображения JPEG несколько раз

    iOS 5.0 GLKit GLKTextureLoader – где происходит glBindTexture?

    Давайте будем гением компьютера.