如何配置iOS的UNUserNotificationCenter排除当日,次日起每日推送通知?
搞定iOS每日推送:跳过注册当日的实现方案
嘿,我来帮你解决这个iOS通知推送的问题~你想要的是用户注册通知后,从第二天开始每天固定12:30推送,当天不触发对吧?这就给你拆解具体实现步骤:
核心思路
咱们要做的就是让第一次推送的触发时间落在注册日的次日,之后保持每日重复。用系统的UNCalendarNotificationTrigger就能轻松实现,关键是要精准控制第一次触发的日期。
具体代码实现
1. 先算出注册次日的日期
首先得拿到当前注册时间的第二天,确保第一次推送不会撞在当天:
// 获取当前注册的时间 let currentDate = Date() // 用系统日历来处理日期,自动适配时区和各种特殊日期 let calendar = Calendar.current // 计算次日日期,这里做个安全校验防止出错 guard let nextDay = calendar.date(byAdding: .day, value: 1, to: currentDate) else { print("日期计算失败,无法创建推送") return } // 提取次日的年、月、日信息 let nextDayComponents = calendar.dateComponents([.year, .month, .day], from: nextDay)
2. 组合推送时间和次日日期
把你原本要设置的12:30,和刚才拿到的次日年月日拼在一起,形成完整的触发时间组件:
var dateInfo = DateComponents() // 把次日的年月日填进去 dateInfo.year = nextDayComponents.year dateInfo.month = nextDayComponents.month dateInfo.day = nextDayComponents.day // 固定推送时间:12点30分 dateInfo.hour = 12 dateInfo.minute = 30
3. 创建重复推送的触发器
用组合好的日期组件创建触发器,设置repeats: true就能实现每日重复推送:
let trigger = UNCalendarNotificationTrigger(dateMatching: dateInfo, repeats: true)
4. 组装并添加通知请求
最后把通知内容、触发器和唯一标识组合成请求,加到通知中心就大功告成了:
// 配置你的通知内容 let content = UNMutableNotificationContent() content.title = NSString.localizedUserNotificationString(forKey: "每日提醒", arguments: nil) content.body = NSString.localizedUserNotificationString(forKey: "这是你的专属每日通知内容~", arguments: nil) content.sound = .default // 开启通知音效 // 创建唯一的通知请求ID,方便后续管理(比如取消推送) let request = UNNotificationRequest(identifier: "DailyNotification_1230", content: content, trigger: trigger) // 添加到通知中心 let notificationCenter = UNUserNotificationCenter.current() notificationCenter.add(request) { error in if let error = error { print("添加推送请求失败:\(error.localizedDescription)") } else { print("每日推送已设置成功,将从次日12:30开始触发") } }
小提醒
- 别忘了在使用推送前,先请求用户的通知权限哦,不然推送是不会生效的~
- 用
Calendar.current处理日期会自动适配用户的时区、闰年、不同月份的天数,不用自己手动处理这些麻烦的边界情况。 - 如果用户在当天13:00才注册,咱们的代码依然会确保第一次推送是次日12:30,完全符合“跳过注册当日”的需求。
内容的提问来源于stack exchange,提问作者EL Hirach Abderrazzak




