Повтор локального уведомления удаляет предыдущие ожидающие локальные уведомления
Я хочу отправлять локальное уведомление через каждые 30 минут. Я реализовал повторяющиеся локальные уведомления, но он удаляет предыдущие локальные уведомления. Сценарий такой, как объяснено: мой клиент хочет получать ночные оповещения. Он хочет, чтобы, проснувшись утром, он мог проверить все уведомления сразу.
Вот код:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
// Override point for customization after application launch.
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .badge, .sound], completionHandler: {didAllow,error in })
return true
}
func applicationDidEnterBackground(_ application: UIApplication) {
let content = UNMutableNotificationContent()
content.title = "Hello"
content.subtitle = "I am your local notification"
content.body = "Yippppiiiieee...."
content.badge = 1
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 60, repeats: true)
let request = UNNotificationRequest(identifier: "testing", content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)
}
3 ответа
Во-первых, вы не должны использовать тот же идентификатор, так как он удаляет уже запланированные
let request = UNNotificationRequest(identifier: "testing", content: content, trigger: trigger)
во-вторых, вы должны вставить другой TimeInterval
let trigger = UNTimeIntervalNotificationTrigger(timeInterval: 60, repeats: true)
//
(1...10).forEach {
let content = UNMutableNotificationContent()
content.title = "Hello \($0)"
content.subtitle = "I am your local notification \($0)"
content.body = "Yippppiiiieee.... \($0)"
content.badge = 1
let trigger = UNTimeIntervalNotificationTrigger(timeInterval:TimeInterval($0*1800), repeats: false)
let request = UNNotificationRequest(identifier: "testing\($0)", content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)
}
Не используйте тот же идентификатор. Это отменит предыдущее уведомление.
Теперь вы спросите, как я могу определить, какое уведомление было прослушано, если я каждый раз генерирую случайную строку?
Допустим, у вас есть этот идентификатор с именем "coffeeTimeNotificationID". Просто добавьте значение метки времени ([NSDate timeIntervalSinceReferenceDate]]
) к этой строке. Теперь ваша строка будет выглядеть так:coffeeTimeNotificationID1232134314
".
Всякий раз, когда пользователь нажимает на это уведомление, просто искать "coffeeTimeNotificationID
", в строке идентификатора. Если вы найдете ее, вы будете знать, какой тип уведомления был прослушан.
Предыдущее ожидающее уведомление отменяется, потому что вы создаете новое с тем же identifier
, Согласно документации
Если вы укажете уникальный идентификатор, система создаст новое уведомление.
Если идентификатор соответствует ранее доставленному уведомлению, система снова предупреждает пользователя, заменяет старое уведомление новым и помещает новое уведомление вверху списка.
Если идентификатор соответствует ожидающему запросу, новый запрос заменяет ожидающий запрос.
Решение состоит в том, чтобы всегда создавать UNNotificationRequest
с новым идентификатором
var notificationCount = 0
func applicationDidEnterBackground(_ application: UIApplication) {
// (...)
notificationCount += 1
let request = UNNotificationRequest(identifier: "testing\(notificationCount)", content: content, trigger: trigger)
UNUserNotificationCenter.current().add(request, withCompletionHandler: nil)
}