重复本地通知会删除以前的待处理本地通知

时间:2018-08-07 07:41:06

标签: ios swift localnotification unnotificationrequest unnotificationtrigger

我想每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 个答案:

答案 0 :(得分:0)

先前的待处理通知被取消,因为您使用相同的identifier创建了一个新通知。按照documentation

  

如果您提供唯一标识符,则系统会创建一个新通知。

     

如果标识符与先前传递的通知匹配,则系统再次提醒用户,用新的通知替换旧的通知,并将新的通知放在列表的顶部。

     

如果标识符与待处理请求匹配,则新请求将替换待处理请求。

解决方案是始终使用新标识符创建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)
}

答案 1 :(得分:0)

首先,您不应使用相同的标识符,因为它会删除已安排的标识符

 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)

}

答案 2 :(得分:0)

请勿使用相同的标识符。它将覆盖先前的通知。

现在您会问,如果每次生成一个随机字符串,我将如何识别被窃听的通知?

因此,假设您有一个名为“ coffeeTimeNotificationID”的标识符。只需将时间戳值([NSDate timeIntervalSinceReferenceDate]])附加到此字符串即可。现在您的字符串应如下所示:“ coffeeTimeNotificationID1232134314”。

每当用户点击此通知时,只需在标识符字符串中搜索“ coffeeTimeNotificationID”即可。如果找到它,您将知道点击了哪种通知。