Как отменить пользовательские уведомления

Как я могу отключить/отменить уже установленное уведомление?

Вот моя функция расписания.

func scheduleNotif(date: DateComponents, completion: @escaping (_ Success: Bool) -> ()) {

    let notif = UNMutableNotificationContent()

    notif.title = "Your quote for today is ready."
    notif.body = "Click here to open an app."

    let dateTrigger = UNCalendarNotificationTrigger(dateMatching: date, repeats: true)
    let request = UNNotificationRequest(identifier: "myNotif", content: notif, trigger: dateTrigger)

    UNUserNotificationCenter.current().add(request, withCompletionHandler: { error in

        if error != nil {
            print(error)
            completion(false)
        } else {
            completion(true)
        }
    })
}

person Denis Kakačka    schedule 12.11.2016    source источник


Ответы (3)


Для отмены всех ожидающих уведомлений вы можете использовать это:

UNUserNotificationCenter.current().removeAllPendingNotificationRequests()

Для отмены определенных уведомлений,

UNUserNotificationCenter.current().getPendingNotificationRequests { (notificationRequests) in
   var identifiers: [String] = []
   for notification:UNNotificationRequest in notificationRequests {
       if notification.identifier == "identifierCancel" {
          identifiers.append(notification.identifier)
       }
   }
   UNUserNotificationCenter.current().removePendingNotificationRequests(withIdentifiers: identifiers)
}
person KrishnaCA    schedule 12.11.2016
comment
Внутри AppDelegate, где мы хотим вызвать эту функцию?, внутри didReceiveRemoteNotification или application(received remoteMessage: MessagingRemoteMessage) - person Kavin Kumar Arumugam; 20.06.2018
comment
Это для отмены запланированного локального уведомления. Его можно вызывать из любого места, поскольку UNUserNotificationCenter.current() является одноэлементным объектом. - person KrishnaCA; 21.06.2018

Способ идентификации того же UNNotification основан на identifier, переданном при создании UNNotificationRequest.

В вашем примере выше,

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

На самом деле вы жестко закодировали identifier как "myNotif". Таким образом, всякий раз, когда вы хотите удалить уже установленное уведомление, вы можете сделать это:

UNUserNotificationCenter.current().removePendingNotificationRequests(withIdentifiers: "myNotif")

Однако обратите внимание, что когда вы жестко кодируете идентификатор, каждый раз, когда вы добавляете request к UNUserNotificationCenter, уведомление фактически заменяется.

Например, если вы запланировали "myNotif" request на 1 минуту позже, но вызовете другую функцию, чтобы запланировать "myNotif" на 1 час позже, она будет заменена. Таким образом, только самое последнее "myNotif" через час будет в pendingNotificationRequest.

person Zac Kwan    schedule 12.11.2016

Как уже упоминалось здесь, вы можете отменить все уведомления с помощью следующего кода:

UIApplication.sharedApplication().cancelAllLocalNotifications()

person Yannick Winter    schedule 12.11.2016