Я хочу установить UILocalNotification, который исчезнет с экрана блокировки и центра уведомлений через пять минут (если пользователь не будет нажимать на него).

Могу ли я установить тайм-аут для уведомления? Или, может быть, запустить еще одно уведомление, которое его удалит?

7
Chiko 29 Апр 2014 в 16:24

2 ответа

Лучший ответ

Отказ от ответственности: код будет работать, только если вы разбудите приложение. В моем случае этот код вызывается из application(_:handleActionWithIdentifier:for:completionHandler:), который запускается из локального уведомления, которое, в свою очередь, вызывается из мониторинга маяка Bluetooth. Так что ввод диапазона радиомаяка Bluetooth разбудит приложение для меня. Что будет пробуждать приложение в вашем случае, решать вам - например, это может быть тихое уведомление от вашего бэкэнда. Также я сомневаюсь, что iOS позволит таймеру работать в течение 5 минут, в моем случае 20-секундный таймер срабатывает с очень высокой вероятностью (хотя я понимаю, что это не на 100% гарантировано, и иногда уведомление может оставаться, однако это не критично в мое дело).

Закрытие уведомления через 20 секунд:

if #available(iOS 10.0, *) {
    ... <setting up an iOS 10 notification content and trigger>
    notificationCenter.add(UNNotificationRequest(identifier: "myidentifier", 
                                                content: content, 
                                                trigger: trigger))
    Timer.scheduledTimer(timeInterval: 20.0, 
                               target: self, 
                             selector: #selector(self.cancelDeliveredNotification), 
                             userInfo: nil, 
                              repeats: false)
} else {
    let notification = UILocalNotification()
    ... <setting up an iOS8/9 notification>
    Timer.scheduledTimer(timeInterval: 20.0, 
                               target: self, 
                             selector: #selector(self.cancelDeliveredNotification), 
                             userInfo: notification as Any?, 
                              repeats: false)

Функция отмены:

func cancelDeliveredNotification(_ sender: Timer) {
    if #available(iOS 10.0, *) {
         UNUserNotificationCenter.current().removeDeliveredNotifications(withIdentifiers: ["myidentifier"])
    } else {
         if let notificationToCancel = sender.userInfo as? UILocalNotification {
             UIApplication.shared.cancelLocalNotification(notificationToCancel)
    }
}

В качестве альтернативы вы также можете сделать UNUserNotificationCenter.current().removeAllDeliveredNotifications()

0
Vitalii 30 Авг 2019 в 10:26

Я считаю, что Facebook делает это, отправляя тихое push-уведомление со своих серверы, которые запускают этот код в приложении:

[[UIApplication sharedApplication] setApplicationIconBadgeNumber: 0];
[[UIApplication sharedApplication] cancelAllLocalNotifications];

Чтобы решение оставалось полностью локальным для устройства, вы можете установить NSTimer, который затем может запускать указанный выше код с правильным интервалом. Это связано с огромным предупреждением о том, что если ваше приложение приостановлено в фоновом режиме, ваш таймер не сработает, пока он не вернется в активное состояние.

2
jszumski 18 Апр 2015 в 04:44