2017-01-04 24 views
4

Я испытываю странную ошибку с iOS 10.2 с UNTimeIntervalNotificationTrigger и UNUserNotificationCenterDelegate. В основном уведомление, которое я создаю, сразу же получает делегат, а затем снова на правильном внутреннем. Это происходит только тогда, когда для свойства повторов установлено значение true на триггере.iOS 10.2 UNUserNotificationCenterDelegate/UNTimeIntervalNotificationTrigger Ошибка?

Кто-нибудь еще видел эту проблему? Сейчас я думаю, что мне нужно проверить дату запуска в делегате и сравнить с сохраненной зарегистрированной датой, но я хочу избежать этого, если это возможно.

Пример кода для создания уведомлений

let content = UNMutableNotificationContent() 
content.body = "My notification message" 
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 60, repeats: true) 
let request = UNNotificationRequest(identifier: "MY_IDENTIFIER", content: content, trigger: trigger) 

UNUserNotificationCenter.current().add(request, withCompletionHandler: nil) 

UNUserNotificationCenterDelegate обжигают непосредственно после .Add

func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { 
     // Code called here instantly when trigger repeats = true 
     // Code called again at proper interval as well (60 seconds) 
} 

Если изменить триггер повторами фальшивыми, это не происходит

let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 60, repeats: false) 
+0

Документы говорят: «Если повторы истинны, значение параметра timeInterval должно быть 60 секунд или больше». Заставляет меня задаться вопросом, не лучше ли было бы выбрать больший интервал и посмотреть, что произойдет тогда, так как вы правы на линии, так или иначе. – matt

+0

Фактически он установлен на несколько дней, я просто изменил его на 60 для примера кода здесь. –

ответ

0

Я до сих пор не нашел проблемы с корнем или видел/слышал кого-либо еще с проблемой. Между тем это было мое исправление (хотя я бы хотел, чтобы он работал правильно).

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

scheduledTimes[identifier] = CACurrentMediaTime() 
UNUserNotificationCenter.current().add(request, withCompletionHandler: nil) 

Тогда в делегат, я могу сравнить его с текущим временем, чтобы увидеть, если я должен игнорировать его или нет:

func userNotificationCenter(_ center: UNUserNotificationCenter, willPresent notification: UNNotification, withCompletionHandler completionHandler: @escaping (UNNotificationPresentationOptions) -> Void) { 
    let identifier = notification.request.identifier 

    // Required for 10.2? 
    // Adding a notification request to the notification center immediately fires this delegate when the trigger is set to repeat 
    if let scheduledTime = scheduledTimes[identifier] { 
     if CACurrentMediaTime() - scheduledTime < 1.0 { 
      completionHandler([]) 
      return 
     } 
    } 

    // Parse the notification into an internal notification and show it 

    completionHandler([]) 
} 

время между добавлением и вызов делегата очень короткий, примерно 0,04 в среднем.

 Смежные вопросы

  • Нет связанных вопросов^_^