- 双站点支持 - 同时监控最多 2 个 NewAPI 站点
- 菜单栏显示 - 实时显示今日消耗或累计消耗
- 自动刷新 - 可自定义刷新间隔(最低 30 秒)
- 智能图标 - 根据站点名称首字母自动生成 SF Symbol 图标
- 今日消耗 - 自动记录每日 0 点快照,精确计算当日消耗
- 昨日对比 - 显示昨日消耗数据,方便趋势分析
- 累计额度 - 查看 API 已用额度、剩余额度和总额度
- 无限额度支持 - 自动识别无限额度账户
- 每日自动推送 - 每天 0 点自动发送消耗报告到 Discord/Slack
- 睡眠唤醒补发 - Mac 睡眠后唤醒自动检查并补发日报
- 去重保护 - 确保每天只发送一次,不会重复推送
- 趋势对比 - 日报包含今日/昨日消耗对比和趋势分析
- 原生 SwiftUI - 完全使用 SwiftUI 构建,性能优异
- 轻量级 - 内存占用低,不影响系统性能
- 开机自启 - 可设置开机自动启动
- 数据持久化 - 使用 @AppStorage 自动保存配置
- 前往 Releases 页面
- 下载最新的
NewAPIMonitor-MacOS-vX.X.X.zip - 解压并拖动
NewAPIMonitor.app到应用程序文件夹 - 首次打开时,右键点击应用选择"打开"(绕过 Gatekeeper)
# 克隆仓库
git clone https://github.com/xt1990xt1990/NewAPIMonitor-MacOS.git
cd NewAPIMonitor-MacOS
# 使用 Xcode 打开项目
open NewAPIMonitor.xcodeproj
# 在 Xcode 中按 Cmd+R 运行系统要求
- macOS 11.0 (Big Sur) 或更高版本
- Xcode 15.0+ (仅编译时需要)
首次启动后,点击菜单栏图标 → 设置:
| 配置项 | 说明 | 示例 |
|---|---|---|
| 站点名称 | 自定义站点名称 | OpenAI API |
| API 地址 | NewAPI 服务地址 | https://api.example.com |
| 访问令牌 | NewAPI 管理员 Token | sk-xxxxx |
| 启用站点 | 是否监控此站点 | ✅ |
💡 提示:站点名称首字母会自动生成菜单栏图标(如
O→o.circle.fill)
在设置中调整 刷新间隔(30-3600 秒),建议:
- 频繁使用:60 秒
- 一般使用:300 秒(5 分钟)
- 低频使用:600 秒(10 分钟)
如需每日自动推送消耗报告:
-
获取 Discord Webhook URL:
- 进入 Discord 服务器设置 → 整合 → Webhook
- 创建新 Webhook 并复制 URL
-
在应用设置中:
- 粘贴 Webhook URL
- 勾选 启用 Webhook
- 点击 测试连接 验证
-
每天 0 点自动发送日报,包含:
- 今日消耗 / 昨日消耗
- 消耗趋势(上升/下降/持平)
- 累计消耗
🔵 $2.34 ┃ 🟢 $1.56
- 站点配置(名称、URL、Token)
- 刷新间隔设置
- Webhook 配置
- 数据重置
📈 NewAPI 每日消耗报告
2026年3月23日 星期日
🔹 OpenAI API
今日: $2.34 | 昨日: $1.89
📈 较昨日上升 | 累计: $45.67
🔹 Claude API
今日: $1.56 | 昨日: $1.78
📉 较昨日下降 | 累计: $32.10
- SwiftUI - 声明式 UI 框架
- Combine - 响应式编程
- @AppStorage - 数据持久化
- URLSession - 网络请求
- DispatchSourceTimer - 精确定时器
// 使用 DispatchSourceTimer (wall clock) 确保睡眠唤醒后触发
let timer = DispatchSource.makeTimerSource(queue: .main)
timer.schedule(wallDeadline: .now() + interval, leeway: .seconds(1))// 监听 NSWorkspace.didWakeNotification
NSWorkspace.shared.notificationCenter.addObserver(
forName: NSWorkspace.didWakeNotification,
object: nil,
queue: .main
) { _ in
// 检查并补发日报
}// 使用 @AppStorage 持久化发送状态
@AppStorage("webhook_report_sent_date") var webhookReportSentDate: String = ""NewAPIMonitor/
├── NewAPIMonitorApp.swift # 应用入口
├── MonitorState.swift # 核心状态管理
├── MenuBarView.swift # 菜单栏视图
├── SettingsView.swift # 设置界面
├── APIService.swift # API 请求服务
├── WebhookService.swift # Webhook 服务
└── SettingsWindowManager.swift # 设置窗口管理
# Debug 构建
xcodebuild -scheme NewAPIMonitor -configuration Debug build
# Release 构建
xcodebuild -scheme NewAPIMonitor -configuration Release build
# 打包
cd ~/Library/Developer/Xcode/DerivedData/.../Build/Products/Release
zip -r NewAPIMonitor.zip NewAPIMonitor.app- 🕛 使用 DispatchSourceTimer (wall clock) 替代 Combine delay
- 🔔 监听系统唤醒事件,自动检查并补发日报
- 🔒 新增日报去重机制,防止重复发送
- 修复 Mac 睡眠导致午夜快照轮转不触发的问题
- 修复 Mac 睡眠导致 Webhook 日报不发送的问题
- 三层保障机制确保日报可靠发送
- 使用 @AppStorage 持久化发送状态
- 正确清理定时器和通知观察者
- 🎉 首次发布
- 支持双站点监控
- 实时菜单栏显示
- Webhook 日报推送
A: 请检查:
- 站点是否已启用
- API 地址和 Token 是否正确
- 网络连接是否正常
- 查看设置中的错误提示
A: 可能原因:
- Mac 在午夜时处于睡眠状态 → v1.1.0 已修复,唤醒后会自动补发
- Webhook URL 配置错误 → 使用"测试连接"验证
- Discord/Slack 服务异常 → 检查服务状态
A: 在设置界面点击 重置所有数据 按钮,将清除:
- 所有快照数据
- 今日/昨日消耗记录
- Webhook 发送状态
A: 目前支持所有兼容 Discord Webhook 格式的服务:
- Discord
- Slack (需使用 Discord 兼容模式)
- 其他支持 Embed 格式的服务
欢迎提交 Issue 和 Pull Request!
- Fork 本仓库
- 创建特性分支 (
git checkout -b feature/AmazingFeature) - 提交更改 (
git commit -m 'Add some AmazingFeature') - 推送到分支 (
git push origin feature/AmazingFeature) - 开启 Pull Request
- 遵循 Swift 官方代码风格
- 使用有意义的提交信息
- 添加必要的注释和文档
- 确保代码通过编译
本项目采用 MIT 许可证 - 详见 LICENSE 文件
- Issues: GitHub Issues
- Discussions: GitHub Discussions
如果这个项目对你有帮助,请给个 ⭐️ Star 支持一下!
Made with ❤️ by xt1990xt1990