如何配置UNNotification:特定时间触发后每周重复,且跳过下周一?
实现跳过下周一、之后每周一上午10点重复的通知
当然可以做到!你需要的是跳过下周一,从下下周一开始,每周一上午10点自动触发通知,这个需求其实只需要结合「指定首次触发的具体日期」和「每周重复的日历规则」就能实现,下面是具体的实现思路和代码:
核心思路
我们要先确定第一次触发通知的具体时间(下下周周一的10点),然后创建包含「周一、10点」这些重复规则的日历组件,这样当通知第一次触发后,就会自动按照每周一10点的规则重复。
代码实现
// 1. 计算下下周的周一上午10点作为首次触发时间 let calendar = Calendar.current var firstFireDateComponents = calendar.dateComponents([.year, .month, .day], from: Date()) // 先获取下周一的日期 if let nextMonday = calendar.nextDate(after: Date(), matching: DateComponents(weekday: 2), matchingPolicy: .nextTime) { // 再加7天,得到下下周的周一 if let firstFireDate = calendar.date(byAdding: .day, value: 7, to: nextMonday) { // 设置上午10点的时间 firstFireDateComponents = calendar.dateComponents([.year, .month, .day, .hour, .minute], from: firstFireDate) firstFireDateComponents.hour = 10 firstFireDateComponents.minute = 0 } } // 2. 创建包含重复规则的日历组件:保留weekday(iOS中1是周日,2是周一,可根据地区日历调整)、hour、minute var repeatComponents = DateComponents() repeatComponents.weekday = 2 repeatComponents.hour = 10 repeatComponents.minute = 0 // 3. 创建触发条件:首次触发用指定的下下周周一10点,开启重复后系统会沿用周一10点的规则 let trigger = UNCalendarNotificationTrigger(dateMatching: firstFireDateComponents, repeats: true) // 后续创建通知请求并添加到通知中心 let content = UNMutableNotificationContent() content.title = "每周提醒" content.body = "周一上午10点的提醒来了!" let request = UNNotificationRequest(identifier: "WeeklyMondayReminder", content: content, trigger: trigger) UNUserNotificationCenter.current().add(request) { error in if let error = error { print("添加通知失败:\(error.localizedDescription)") } }
关键说明
- 关于
weekday取值:iOS的Calendar中weekday默认1代表周日、2代表周一,如果你所在地区日历起始不同,可以通过calendar.firstWeekday确认后调整数值。 - 为什么能跳过下周一:因为我们把首次触发时间直接设为下下周的周一10点,开启重复后系统会自动识别该时间对应的「周一10点」规则,之后每周同一时间触发,自然跳过了下周一。
- 验证时间:可以用
calendar.date(from: firstFireDateComponents)打印首次触发的具体日期,确认是否符合预期。
内容的提问来源于stack exchange,提问作者James White
相关产品推荐
相关产品推荐

