Repeating local notification removes previous pend

2019-08-20 09:35发布

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条回答
成全新的幸福
2楼-- · 2019-08-20 09:54

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.

查看更多
\"骚年 ilove
3楼-- · 2019-08-20 10:06

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)

}
查看更多
We Are One
4楼-- · 2019-08-20 10:09

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)
}
查看更多
登录 后发表回答