任务截止日期到达时触发本地通知问题排查(Calendar Trigger异常)
解决Calendar Trigger本地通知不触发的问题
问题根源分析
- 代码未使用传入的
date参数,反而用Date().addingTimeInterval(5)生成时间,等于完全忽略了任务的截止日期 - 提取的
dateComponents仅包含.year、.month、.day、.hour,缺少分钟和秒,会导致通知被设置到对应小时的整点时刻;如果这个整点已经过去,系统会直接忽略该触发事件 - 两个通知请求使用了同一个
id,即便添加request2也会覆盖request,且当前代码也未执行添加request2的操作
修复后的代码
func setupNotifications(id: String, contentTitle: String, contentBody: String, date: Date) { center.getNotificationSettings { (settings) in guard settings.authorizationStatus == .authorized else { return } let content = UNMutableNotificationContent() content.title = contentTitle content.body = contentBody content.sound = .default // 使用传入的date参数,提取完整的时分秒信息 let dateComponents = Calendar.current.dateComponents([.year, .month, .day, .hour, .minute, .second], from: date) // 确保触发时间是未来的,避免系统忽略过去的时间 guard Calendar.current.date(from: dateComponents)?.compare(Date()) == .orderedDescending else { print("通知时间不能是过去的时间") return } let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: false) let request = UNNotificationRequest(identifier: id, content: content, trigger: trigger) self.center.add(request) { error in if let error = error { print("添加通知失败: \(error.localizedDescription)") } } } }
额外注意事项
- 测试Calendar Trigger时,不要设置过去的时间,系统不会触发已过期的通知
- 每个通知请求的
identifier需保持唯一,避免被其他请求覆盖 - 添加错误处理,可快速排查通知添加失败的具体原因
内容的提问来源于stack exchange,提问作者heyhocombo
相关产品推荐
相关产品推荐

