Repeating local notification removes previous pending local notifications

白昼怎懂夜的黑 提交于 2019-12-25 02:17:03

问题


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)

}

回答1:


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)

}



回答2:


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)
}



回答3:


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.



来源:https://stackoverflow.com/questions/51721396/repeating-local-notification-removes-previous-pending-local-notifications

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!