0

我想每 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)

}
4

3 回答 3

0

先前的待处理通知被取消,因为您创建了一个具有相同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)
}
于 2018-08-07T07:44:17.233 回答
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)

}
于 2018-08-07T07:44:49.783 回答
0

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

现在你会问,如果我每次都生成一个随机字符串,我将如何识别哪个通知被点击了?

因此,假设您有一个名为“coffeeTimeNotificationID”的标识符。只需将时间戳值 ( [NSDate timeIntervalSinceReferenceDate]]) 附加到此字符串即可。现在你的字符串看起来像这样:“ coffeeTimeNotificationID1232134314”。

coffeeTimeNotificationID每当用户点击此通知时,只需在标识符字符串中搜索“ ”。如果你找到它,你就会知道点击了哪种类型的通知。

于 2018-08-07T08:46:57.997 回答