Boring Notch 日历与提醒全解析:把今天的所有安排塞进刘海

发布时间:2026/11/6 1:32:37
Boring Notch 日历与提醒全解析:把今天的所有安排塞进刘海

Boring Notch 日历与提醒全解析:把今天的所有安排塞进刘海

【免费下载链接】boring.notchTheBoringNotch: Not so boring notch That Rocks 🎸🎶项目地址: https://gitcode.com/gh_mirrors/bor/boring.notch

Mac 上的日程经常是散的:工作会在一个日历里,私人安排在一个日历里,Reminders 里还躺着几条没截止日期的事。开个重要会之前,你得手动切换三四个 App 确认时间。Boring Notch 的日历与提醒功能直接解决这个问题——它从系统的 EventKit 读取日程与提醒数据,把今天的安排推到刘海的展示区,不用离开当前窗口就能看到下一个会在几点开始。

谁负责什么:四个文件的分工

先看代码结构,后面会清楚很多。整条功能链由四个文件构成,各管一摊:

  • CalendarManager(单例):持有当前日期、事件列表和日历选择状态,负责协调授权与刷新
  • CalendarService:封装 EventKit,处理授权请求、事件查询和提醒完成状态的回写
  • BoringCalendar:UI 层,日期滚轮和事件列表都在这
  • SettingsView里的CalendarSettings:设置页的总开关和逐日历勾选框

说白了,Manager 管状态,Service 摸系统 API,View 只管展示和转发事件。CalendarManager.swift 和 CalendarServiceProviding.swift 是数据链路的两个核心,下面的场景都绕着它们展开。

日程数据从哪来

全部来自EKEventStore。第一次用日历面板时,应用先查授权状态,如果是notDetermined就触发系统弹窗:

let status = EKEventStore.authorizationStatus(for: .event) if status == .notDetermined { let granted = try await store.requestFullAccessToEvents() }

提醒授权走同一套流程,只是类型换成.reminder。⚠️ 如果用户拒绝授权,设置页会直接提示"去系统设置里开启",并给出跳转链接,而不是默默给你一个空面板。

当你第一次打开日历面板时

授权通过后,面板默认加载当天数据。日期是一条横向滚轮(WheelPicker):覆盖往前 7 天、往后 14 天,滚一格走一天,中心位置就是当前选中日期。滚轮滚动或直接点某个日期,CalendarView的onChange会调用calendarManager.updateCurrentDate(...),下方事件列表跟着刷新。

还有个细节:列表默认开启"智能滚动",打开面板时自动把下一个未结束的事件滚到最上面,视线天然落在最要紧的那条上。

如果你只想显示工作日历

不想让个人日历把面板搞花,可以在设置里逐个取消勾选。选择状态用Defaults持久化:

switch Defaults[.calendarSelectionState] { case .all: selectedCalendarIDs = Set(allCalendars.map(\.id)) case .selected(let ids): selectedCalendarIDs = ids }

全不选会自动回落到.all,全选也归一化成.all,这个小归一化逻辑避免状态漂移。改动后setCalendarSelected会立刻触发updateEvents()重拉列表,实时生效。

提醒事项和日历数据怎么同步

最巧的一点是两类数据不分开显示。CalendarService拉事件时会同时查EKReminder,统统转成统一的EventModel,且只保留有 due date 的提醒。于是同一个列表里,日历事件带左侧色条,提醒事项带左侧圆圈。点圆圈会直接写回系统:

reminder.isCompleted = completed try store.save(reminder, commit: true)

这一步其实就是把完成状态交给系统托管——你在 Boring Notch 里勾选的提醒,会在 Reminders 应用和同账号的其他设备上一并更新。

当你在日历 App 里改了事件

不需要手动刷新。CalendarManager在 init 里就监听.EKEventStoreChanged系统通知:任何一处事件变动(在 Calendar 里新建会议、从另一台设备修改),都会自动重拉日历和事件列表。这就是面板数据和系统日历始终一致的原因。

进阶配置:让刘海日程更干净

设置里 Calendar 页可以调的开关都对应 Constants.swift 里的 key:

  • showCalendar:总开关,默认关,刘海里完全不出现日历面板
  • hideCompletedReminders:隐藏已勾选提醒,默认开
  • hideAllDayEvents:过滤全天事件,免得被一排 "All-day" 刷屏
  • showFullEventTitles:允许标题换行,否则单行截断
  • autoScrollToNextEvent:打开面板时自动滚到下一个事件

💡 还有个使用细节:点击事件行会通过事件 URL 打开对应日历应用的详情页,要改会议内容时不用自己去找日历 App。

把它跑起来

想上手的顺序很简单:先在设置里打开 Show Calendar 完成授权,再把不关心的日历批量取消勾选,日常只留工作日历最清爽。克隆仓库就能直接读代码:

git clone https://gitcode.com/gh_mirrors/bor/boring.notch

【免费下载链接】boring.notchTheBoringNotch: Not so boring notch That Rocks 🎸🎶项目地址: https://gitcode.com/gh_mirrors/bor/boring.notch

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考