一个轻量的 macOS 菜单栏计时器,用来记录任务、标签、挂起任务和本地时间统计。数据保存在本机 JSON 文件中,不依赖账号、云服务或后端。
- 菜单栏常驻:点击菜单栏图标即可开始、暂停、恢复或结束计时。
- 任务标签:内置学习、工作、运动标签,也支持创建自定义标签。
- 任务挂起:最多挂起 5 个任务,适合临时切换上下文后再回来继续。
- 历史记录:支持查看、编辑、删除和手动补录任务记录。
- 统计视图:提供今日统计和最近 7 天的标签维度时间分布。
- 本地存储:任务、标签和运行状态保存到
~/Library/Application Support/Timer/。
Timer 是一个窗口样式的 macOS MenuBarExtra 应用,核心界面围绕三件事展开:
- 当前任务:任务名、标签、已计时长和暂停/结束操作。
- 挂起任务:展示已暂停的上下文,并可一键恢复或结束。
- 历史与统计:补录任务、修正记录,并查看日/周时间分布。
- macOS 15.6 或更高版本
- Xcode 16+ / 17+(用于本地开发和构建)
- Apple Developer Team 或本机自动签名配置(Xcode 运行时需要)
当前工程设置:
- Bundle ID:
Play.Timer - Deployment Target:
macOS 15.6 - Version:
1.0 - Architecture: macOS app, SwiftUI, MVVM
git clone https://github.com/Popcornnnnnnnn/Timer.git
cd Timer
open Timer.xcodeproj在 Xcode 中选择 Timer scheme 和 My Mac 目标,然后运行 Cmd + R。
也可以用命令行确认项目能构建:
xcodebuild -project Timer.xcodeproj -scheme Timer -destination 'platform=macOS' buildTimer 的核心数据模型是 TaskRecord、TimeSegment 和 Tag:
TaskRecord表示一条任务记录,包含任务名、标签、开始/结束时间和多个计时片段。TimeSegment让同一任务可以被暂停、挂起、恢复,并保留真实累计时长。Tag记录标签名称和颜色,并以 hex 字符串序列化。
主要管理对象:
TimerManager: 当前任务、挂起任务、计时状态和任务切换。DataManager: JSON 持久化、标签管理、历史任务读写。StatisticsManager: 今日统计、周统计和标签聚合。
Timer/
├── Timer/
│ ├── Components/ # 可复用 SwiftUI 组件
│ ├── Models/ # TaskRecord、TimeSegment、Tag
│ ├── Utilities/ # 常量和时间格式化
│ ├── ViewModels/ # 计时、数据、统计管理
│ └── Views/ # 菜单栏窗口、历史记录、统计视图
├── TimerTests/ # Swift Testing 单元测试入口
├── TimerUITests/ # XCTest UI 测试入口
├── Docs/ # 架构、使用说明、修复记录
└── Timer.xcodeproj
更详细的说明见:
应用数据保存在:
~/Library/Application Support/Timer/
├── tasks.json # 已完成任务记录
├── tags.json # 标签列表
└── appState.json # 当前任务和挂起任务状态
备份时复制整个 Timer 目录即可。清空该目录会重置本地数据。
- 标签颜色编辑
- 更强的历史筛选和搜索
- 月视图统计
- CSV 数据导出
- 全局快捷键
- 番茄钟模式
- iCloud 同步
本仓库目前更适合用 Xcode 直接打开开发。命令行构建已验证:
xcodebuild -project Timer.xcodeproj -scheme Timer -destination 'platform=macOS' build测试 target 目前仍是初始模板,后续可以优先补充这些单元测试:
TimeFormatter的边界格式化测试TaskRecord.totalDuration()的多片段累计测试DataManager的本地 JSON 编解码测试
MIT License. See LICENSE.