Repeating local notification removes previous pending local notifications

1.1k views Asked by At

I want to send local notification after every 30 minutes. I have implemented repeating local notification but it removes the preceding local notifications. The scenario is as explained : My client wants to get night alerts. He wants that when he wakes up in the morning he can check all the notification alerts at once.

Here is the code:

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

There are 3 answers

7
Shehata Gamal On BEST ANSWER

First you shouldn't use the same identifier as it removes already scheduled ones

 let request = UNNotificationRequest(identifier: "testing", content: content, trigger: trigger)

second you have to insert different 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)

}
1
mag_zbc On

Previous pending notification is canceled, because you create a new one with the same identifier. As per documentation

If you provide a unique identifier, the system creates a new notification.

If the identifier matches a previously delivered notification, the system alerts the user again, replaces the old notification with the new one, and places the new notification at the top of the list.

If the identifier matches a pending request, the new request replaces the pending request.

The solution is to always create UNNotificationRequest with a new identifier

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)
}
0
devdoe On

Don't use the same identifier. It will override the previous notification.

Now you would ask, how will I identify which notification was tapped If I generate a random string every time?

So let's say, you have this identifier named "coffeeTimeNotificationID". Just append a timestamp value ([NSDate timeIntervalSinceReferenceDate]]) to this string. Now your string would look like this: "coffeeTimeNotificationID1232134314".

Whenever user taps on this notification, just search for "coffeeTimeNotificationID", in the identifier string. If you find it, you'll know what type of notification was tapped.