Повтор локального уведомления удаляет предыдущие ожидающие локальные уведомления

Я хочу отправлять локальное уведомление через каждые 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)
}
Другие вопросы по тегам