You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何配置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

火山引擎 最新活动