尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Boring Notch 技术指南:把 MacBook 刘海变成音乐控制中心、日历与系统 HUD
桌面应用【免费下载链接】boring.notchTheBoringNotch: Not so boring notch That Rocks 项目地址https://gitcode.com/gh_mirrors/bor/boring.notch点击查看免费下载Boring Notch仓库boring.notch是一个 macOS 菜单栏应用它把带刘海的 MacBook 顶部的黑色缺口区域notch改造成一个可交互的动态刘海悬停展开后显示音乐播放控制与频谱可视化、日历与待办、电池状态还能替换系统音量/亮度 HUD、支持 AirDrop 风格的文件搁架Shelf。本文基于仓库中的 README.md 完整介绍其安装、使用与构建方式并深入源码剖析它的刘海窗口管理、多显示器适配、媒体控制与拖放检测等核心实现。项目定位与核心能力从 README.md 的描述可以概括出 Boring Notch 的功能主线播放实时活动Playback live activity把当前歌曲标题、歌手、专辑封面与播放控制常驻在刘海内配合可视化频谱日历与待办集成显示下一个日历事件与提醒事项充电指示显示充电状态与电量百分比文件搁架Shelf类似 AirDrop 的拖放文件暂存区支持跨设备共享QuickShare系统 HUD 替换音量、亮度、键盘背光等系统弹窗被替换为刘海内联样式可自定义尺寸针对刘海屏与非刘海屏提供不同的高度匹配策略。README 中给出的 Roadmap 展示了功能完成度已打勾的为当前已实现能力功能状态Playback live activity✅ 已实现Calendar / Reminders 集成✅ 已实现摄像头镜像Mirror✅ 已实现充电指示与电量百分比✅ 已实现可自定义手势控制✅ 已实现带 AirDrop 的 Shelf 功能✅ 已实现刘海尺寸自定义适配不同显示尺寸✅ 已实现系统 HUD 替换音量、亮度、背光✅ 已实现蓝牙设备实时活动⬜ 规划中天气集成 / 可自定义布局 / 锁屏小组件 / 扩展系统⬜ 规划中系统要求与安装系统要求macOS 14 Sonoma 或更高版本Apple Silicon 或 Intel Mac 均可运行。这一要求与工程配置一致boringNotch.xcodeproj/project.pbxproj 中两个构建配置的MACOSX_DEPLOYMENT_TARGET均为14.0产品名为Boring NotchBundle ID 为theboringteam.boringnotch。方式一手动下载 DMG 安装从 Releases 下载boringNotch.dmgREADME 提供直链按钮打开后把Boring Notch拖入/Applications由于项目方尚未注册 Apple Developer 账号应用未经过公证notarization首次启动时 macOS 会提示来自未识别的开发者。这是预期行为只需绕过一次推荐终端命令始终有效xattr -dr com.apple.quarantine /Applications/Boring Notch.app该命令递归删除应用包上的com.apple.quarantine隔离扩展属性Gatekeeper 的隔离标记之后正常双击打开即可。README 特别说明此法比系统设置入口更可靠——它不需要管理员权限且不会受 System Settings 偶发失效的影响。备选系统设置尝试打开应用出现安全警告后点OK打开系统设置 → 隐私与安全性Privacy Security滚动到底部在 Boring Notch 的警告处点击仍要打开Open Anyway按提示确认。注意此方式对部分用户不生效例如非管理员账户失败时请改用终端命令。方式二Homebrew Cask 安装brew install --cask TheBoredTeam/boring-notch/boring-notchHomebrew 安装会绕过上面描述的 macOS 安全警告cask 安装器自行处理 quarantine 逻辑是日常使用最省事的方式。使用说明按 README.md 的 Usage 章节应用的基本交互模型为启动应用后刘海区域即被接管成为屏幕顶部的主角悬停刘海mouse hover即可展开露出全部功能在展开状态下使用内嵌控件控制音乐播放点击菜单栏的图标进入设置面板自定义刘海外观、尺寸、功能开关。菜单项图标在源码中是sparkleREADME 文案里写作starboringNotch/boringNotchApp.swift 中MenuBarExtra(boring.notch, systemImage: sparkle, ...)构建了一个纯菜单栏场景Scene内部提供 Settings⌘,、检查更新Sparkle、重启与退出。从源码结构看应用通过 Info.plist 中的LSUIElement YES见 project.pbxproj 的INFOPLIST_KEY_LSUIElement以无 Dock 图标的纯菜单栏代理方式运行boringNotch/boringNotchApp.swift 中applicationShouldTerminateAfterLastWindowClosed返回false保证关闭刘海窗口不会退出应用。构建运行从源码编译README 给出的构建流程如下前置条件macOS 15.6 或更高版本Xcode 26 或更高版本高于运行时要求的 macOS 14因为构建需要较新的 SDK。步骤# 1. 克隆仓库使用你手中的仓库地址 git clone 本仓库地址 cd boring.notch # 2. 用 Xcode 打开工程 open boringNotch.xcodeproj # 3. 点击 Run 或按 Cmd R 构建并运行依赖全部通过 Swift Package Manager 解析锁文件 boringNotch.xcodeproj/project.xcworkspace/xcshareddata/swiftpm/Package.resolved 中锁定了 Sparkle 2.9.1自动更新、Defaults 9.0.6类型安全的用户偏好、KeyboardShortcuts 2.4.0全局快捷键、LaunchAtLogin-Modern 1.1.0登录项、Lottie 4.5.2动画、SkyLightWindow 1.0.0私有框架窗口能力等包Xcode 打开工程时会自动下载。发布产物方面仓库提供 Configuration/dmg/create_dmg.sh一个基于dmgbuildPython依赖由 hash 锁定的 Configuration/dmg/requirements.txt 安装的 DMG 打包脚本用法为./create_dmg.sh app_path dmg_output volume_name会自动从 app 的 Info.plist 提取图标。这解释了 Release 中boringNotch.dmg的来源。源码剖析刘海窗口是如何实现的无边框悬浮面板 SkyLight 锁屏显示刘海窗口的核心是 boringNotch/components/Notch/BoringNotchSkyLightWindow.swift。BoringNotchSkyLightWindow继承NSPanel关键配置为styleMask [.borderless, .nonactivatingPanel, .utilityWindow, .hudWindow]无边框、不抢占键盘焦点、作为工具窗与 HUD 窗运行见 boringNotch/boringNotchApp.swift 的createBoringNotchWindowlevel .mainMenu 3窗口层级压在系统菜单栏之上这正是它敢覆盖刘海区域的前提collectionBehavior [.fullScreenAuxiliary, .stationary, .canJoinAllSpaces, .ignoresCycle]可随全屏应用显示、不参与 Mission Control 与 Spaces 切换强制darkAqua外观hasShadow false阴影由 SwiftUI 内部自己画见下文圆角 insetcanBecomeKey/canBecomeMain均为false保证窗口永远不打断当前应用的输入焦点。更值得注意的是锁屏显示能力窗口默认调用disableSkyLight()当DistributedNotificationCenter收到com.apple.screenIsLocked通知且用户开启showOnLockScreen偏好时enableSkyLight()把窗口委托给 SkyLightmacOS 的窗口合成私有框架使窗口出现在锁屏之上解锁后延迟 150ms 再disableSkyLight()以避免闪烁boringNotch/boringNotchApp.swift。undelegateWindow的实现BoringNotchSkyLightWindow.swift直接dlopen加载 SkyLight.framework 并调用私有符号SLSRemoveWindowsFromSpaces——这类私有能力正是需要 SkyLightWindow SPM 包的原因。此外窗口订阅Defaults.publisher(.hideFromScreenRecording)开启该偏好时把sharingType设为.none使刘海在屏幕录制/投屏中不可见BoringNotchSkyLightWindow.swift。尺寸自适应刘海屏与非刘海屏的区别README.md 的 Roadmap 提到Notch sizing customization, finetuning on different display sizes其实现集中在 boringNotch/sizing/matters.swiftlet openNotchSize: CGSize .init(width: 640, height: 190) let windowSize: CGSize .init(width: openNotchSize.width, height: openNotchSize.height shadowPadding) // shadowPadding 20 let cornerRadiusInsets (opened: (top: 19, bottom: 24), closed: (top: 6, bottom: 14))展开态固定为 640×190窗口本体再加 20pt 的阴影内边距圆角 inset 区分展开/闭合两态用于绘制圆角矩形boringNotch/components/Notch/NotchShape.swift。闭合态尺寸由getClosedNotchSize(screenUUID:)动态计算宽度利用NSScreen.auxiliaryTopLeftArea/auxiliaryTopRightAreamacOS 提供的刘海两侧辅助区域用屏幕总宽减去左右辅助区宽度得到真实刘海宽度无刘海屏退回默认 185pt高度先判断screen.safeAreaInsets.top 0是否为刘海屏再按用户偏好的模式取值boringNotch/sizing/matters.swift刘海屏notchHeightMode默认.matchRealNotchSize直接使用safeAreaInsets.top即与真实刘海像素对齐非刘海屏nonNotchHeightMode默认.matchMenuBar取frame.maxY - visibleFrame.maxY即与菜单栏等高也可以手动指定固定高度notchHeight/nonNotchHeight默认均为 32pt。这些偏好键集中声明在 boringNotch/models/Constants.swift基于 sindresorhus/Defaults 的类型安全 API例如偏好键类型默认值作用showOnAllDisplaysBoolfalse在所有显示器上各显示一个刘海notchHeight/nonNotchHeightCGFloat32刘海屏/非刘海屏的手动高度notchHeightMode/nonNotchHeightModeWindowHeightModematchRealNotchSize / matchMenuBar高度匹配策略openNotchOnHover/extendHoverAreaBooltrue / false悬停展开与扩大热区minimumHoverDurationTimeInterval0.3悬停多少秒后展开hudReplacementBoolfalse替换系统音量/亮度 HUDboringShelf/expandedDragDetectionBooltrue / true搁架与拖文件到刘海检测mediaControllerMediaControllerTypenowPlaying音乐控制后端sneakPeekStylesSneakPeekStylestandard全局偷看一眼播放信息的样式多显示器管理屏幕 UUID 与窗口池AppDelegateboringNotch/boringNotchApp.swift维护了一个windows: [String: NSWindow]与viewModels: [String: BoringViewModel]的映射key 为显示器 UUID。其屏幕适配逻辑监听NSApplication.didChangeScreenParametersNotification在screenConfigurationDidChange()中通过对比屏幕数量、displayUUID集合与frame集合判断是否真的发生拓扑变化有变化则清理并重建窗口池adjustWindowPosition()在所有显示器模式下为每台显示器创建一个刘海窗口并删除已断开显示器的窗口单屏模式下支持preferredScreenUUID固定屏幕或automaticallySwitchDisplay跟随主屏外接显示器拔插时自动迁移窗口定位公式在positionWindowx screenFrame.midX - windowWidth/2、y screenFrame.maxY - windowHeight即屏幕顶边正中。每块屏幕对应独立的BoringViewModelboringNotch/models/BoringViewModel.swift由BoringViewCoordinator统一协调当前视图音乐/日历/搁架等 tab 状态。媒体控制中心从 MediaRemote 到多后端抽象README 的核心卖点dynamic music control center, complete with a vibrant visualizer由 boringNotch/managers/MusicManager.swift 与 boringNotch/MediaControllers/ 目录实现。统一协议MediaControllerProtocol 定义了playbackStatePublisherCombine 发布PlaybackState、play/pause/togglePlay/nextTrack/previousTrack/seek/setVolume/toggleShuffle/toggleRepeat以及能力探测supportsVolumeControl、supportsFavorite。MusicManager作为单例持有activeController监听mediaControllerChanged通知热切换后端并把各后端的PlaybackState聚合为 UI 所需的Published属性songTitle、albumArt、elapsedTime等。后端选择boringNotch/models/Constants.swift后端说明nowPlaying通用正在播放覆盖系统内所有受 MediaRemote 管理的应用默认appleMusic针对 Apple Music 的专用控制spotify针对 Spotify沙盒内通过 AppleEvents 临时例外youtubeMusicYouTube Music带独立鉴权模块见 boringNotch/MediaControllers/YouTube Music Controller/Now Playing 后端的私有框架桥接boringNotch/MediaControllers/NowPlayingController.swift 通过CFBundleCreate加载/System/Library/PrivateFrameworks/MediaRemote.framework并用CFBundleGetFunctionPointerForName取MRMediaRemoteSendCommand、MRMediaRemoteSetElapsedTime、MRMediaRemoteSetShuffleMode、MRMediaRemoteSetRepeatMode四个函数指针做命令下发。而监听正在播放则走另一条路启动仓库内自带的 mediaremote-adapterPerl 脚本 预编译的MediaRemoteAdapter.frameworkMediaRemoteAdapterTestClient可执行文件子进程以 JSON Lines 流式输出 now playing 变化。这正是 README 致谢中提到的开源项目 MediaRemoteAdapter 的用途——它让应用在 macOS 15.4系统收紧 Now Playing 接口后仍能读取播放源。可用性探测boringNotch/helpers/MediaChecker.swift 以/usr/bin/perl执行mediaremote-adapter.pl framework testClient test带 10 秒超时依据退出码判断当前系统是否还允许 MediaRemote 访问isNowPlayingDeprecated。若已失效且用户选择了nowPlaying应用会在启动时弹出针对音乐权限的引导页boringNotch/boringNotchApp.swift并建议回退到appleMusic后端defaultMediaController的计算逻辑Constants.swift。播放数据的 UI 呈现专辑封面翻转动画、进度、歌词、可视化由 boringNotch/components/Music/MusicVisualizer.swift配合 Metal 着色器 boringNotch/metal/visualizer.metal等组件负责useMusicVisualizer、coloredSpectrogram等偏好键控制其样式。Shelf 搁架与拖文件进刘海README 中的Shelf functionality with AirDrop对应 boringNotch/components/Shelf/ 模块ViewsShelfView、ShelfItemView、ServicesQuickShareService、ShelfDropService等、ViewModels 三层。README 致谢指出其初版参考了开源项目 NotchDrop。拖放检测的巧思在 boringNotch/observers/DragDetector.swift全局NSEvent监控器本身拿不到拖拽内容实现上以NSPasteboard(name: .drag)的changeCount变化 fileURL/url/string类型校验来判定确实拖拽了有效内容再判断鼠标是否进入屏幕顶部中央的notchRegion尺寸取openNotchSize即 640×190 的展开区域进入即回调onDragEntersNotchRegion。boringNotch/boringNotchApp.swift 中setupDragDetectors()据此在展开瞬间自动把刘海切到 shelf 视图实现文件拖过来刘海自动张开接收的交互。偏好键expandedDragDetection默认 true控制该行为copyOnDrag、autoRemoveShelfItems则控制复制与自动清理。系统 HUD 替换Roadmap 中的System HUD replacements (volume, brightness, backlight)由 boringNotch/managers/VolumeManager.swift 与 boringNotch/managers/BrightnessManager.swift 实现开启hudReplacement后系统音量/亮度弹窗被抑制改由刘海内联 HUD 呈现boringNotch/components/Live activities/InlineHUD.swift、OpenNotchHUD.swift。相关偏好还包括inlineHUD内联样式、showOpenNotchHUDPercentage默认 true展开刘海时显示百分比、optionKeyAction按住 Option 按媒体键时的行为打开系统设置/显示 HUD/无操作。媒体键本身的拦截由 boringNotch/observers/MediaKeyInterceptor.swift 完成。沙盒与权限声明boringNotch/boringNotch.entitlements 声明了应用实际使用的系统能力与 README 功能一一对应app-sandbox true应用运行在沙盒内automation.apple-events truetemporary-exception.apple-events白名单com.spotify.client、com.apple.Music通过 AppleScript 控制两个音乐 App如 NowPlayingController.swift 中用 AppleScript 设置 Music 收藏device.cameraMirror 镜像功能对应 boringNotch/managers/WebcamManager.swiftpersonal-information.calendars bookmark 文件访问日历集成与 Shelf 的文件持久化temporary-exception.mach-lookup.global-name中声明了 Sparkle 更新所需的 XPC 服务名$(PRODUCT_BUNDLE_IDENTIFIER)-spks/-spki与 BoringNotchXPCHelper/ 辅助工具对应network.client/server音乐控制YouTube Music API、软件更新等网络访问。Info.plist 层面还声明了NSCalendarsUsageDescription日历、NSCameraUsageDescription摄像头、NSRemindersUsageDescription提醒事项、NSAppleEventsUsageDescription控制音乐等用途描述字符串见 project.pbxproj。更新与配置要点自动更新基于 SparkleSPM 锁定 2.9.1appcast 见 updater/appcast.xml菜单与设置页均提供检查更新boringNotch/components/Settings/SoftwareUpdater.swift。全局快捷键KeyboardShortcuts 提供toggleNotchOpen开关刘海多屏模式下自动定位鼠标所在屏幕与toggleSneakPeek全局播放信息偷看持续 3 秒见 boringNotch/boringNotchApp.swift。权限引导首次启动会走 Onboarding 流程欢迎页 → 权限请求 → 音乐控制器选择首次启动还会播放 boring.m4a 欢迎音效playWelcomeSound()。小结Boring Notch 用一个 640×190 的无边框 HUD 面板 私有框架桥接 偏好驱动的多屏布局三板斧把刘海从一块死区变成了功能中枢BoringNotchSkyLightWindow解决窗口压过菜单栏且不打断焦点getClosedNotchSize解决不同机型尺寸对齐MediaControllerProtocol多后端抽象解决macOS 收紧 Now Playing 接口后的兼容性DragDetector的 pasteboard 探测技巧则解决了无法直接监听系统拖拽的问题。上述实现细节都可以在仓库对应路径中直接验证适合作为 macOS 刘海类工具notch apps的参考实现来阅读。赞分享桌面应用【免费下载链接】boring.notchTheBoringNotch: Not so boring notch That Rocks 项目地址https://gitcode.com/gh_mirrors/bor/boring.notch点击查看免费下载相关推荐Comic Translate多格式文件支持从图片到压缩包的全方位兼容Comic Translate多格式文件支持从图片到压缩包的全方位兼容 Comic Translate是一款功能强大的桌面应用专为漫画翻译设计支持从图片到人工智能大模型桌面应用图像处理OCR计算机视觉Boring Notch终极指南让你的MacBook刘海变身音乐控制中心Boring Notch终极指南让你的MacBook刘海变身音乐控制中心 想让你的MacBook刘海从单调的状态栏变成酷炫的音乐控制中心吗Boring No桌面应用Boring Notch完整指南免费开源让MacBook刘海变身音乐控制中心你是否曾经觉得MacBook屏幕顶部的刘海区域除了显示基本信息外几乎毫无用处那个占据着宝贵屏幕空间的设计难道真的只能这样单调下去吗今天我要向你介绍一个桌面应用上一篇TERRA 16方向导航箭头原理揭秘相对航向计算与箭头选择的数学逻辑下一篇VideoSrt终极指南SRT、LRC、普通文本输出格式的完美选择方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED

相关推荐

深度解析无线鼠标蓝牙芯片封装:技术演进与封测行业新机遇

深度解析无线鼠标蓝牙芯片封装:技术演进与封测行业新机遇

无线鼠标蓝牙芯片封装的技术核心与行业痛点 无线鼠标作为外设市场渗透率最高的品类之一,其核心组件蓝牙芯片的封装技术正经历从传统向高度集成化的转型。无线鼠标蓝牙芯片封装的关键挑战在于如何在小尺寸、低功耗与高稳定性之间取得平衡。蓝牙芯片通常需要集成射频前…

📅 2026/10/14 6:15:12
Agent可视化生成方案:IR、DSL与SDK的工程化实践

Agent可视化生成方案:IR、DSL与SDK的工程化实践

1. 为什么“让 AI 硬写”这条路越来越走不通过去一年我接触了不少 Agent 项目,从早期的纯 Prompt 编排到后来的多智能体协作,一个很明显的感受是:让大模型直接输出最终产物,在 Demo 阶段很惊艳,一上生产就露馅。你让它…

📅 2026/10/14 6:15:12
多进程并发ECHO服务器实战:从Socket到fork的工业级实现

多进程并发ECHO服务器实战:从Socket到fork的工业级实现

1. 从单进程到多进程:为什么ECHO服务器是网络编程的试金石做网络编程的人都有一个共识:ECHO服务器就像编程语言里的"Hello World",看起来简单,但真正要把它写扎实、写出工业级水准,里面藏着大量门道。我见过…

📅 2026/10/14 6:15:12
MORE NEWS

更多资讯

📰

JSP房产中介管理系统部署实战:从环境搭建到二次开发全流程解析

最近帮一位学生朋友折腾了一套房产中介管理系统的JSP源码,项目包标题写得很直白:“jsp房产中介管理系统j32r6”,附带完整源码、数据库脚本、调试部署服务。这种带全套交付的Java Web项目,在课程设计和毕业设计阶段特别常见。说句实…

📰

基于SpringBoot的在线诊疗管理系统设计与实现全流程指南

做毕业设计选到“在线诊疗管理系统”的同学,第一反应大概都是“这题目是不是有点大”——SpringBoot、在线诊疗、远程就医这些词堆在一起,听起来像要做一个完整产品。但实际动手拆开看,这个方向反而是近几年Java类毕设里性价比很高的一类&…

📰

XML查看器核心能力解析:错误定位、树形导航与大文件处理

简介:这是一款面向开发与测试人员的XML查看与语法校验工具,以轻量、便捷的方式解决XML结构难读、格式错误不易发现的问题。安装后只需在XML文件上右键选择View即可快速打开,清晰的分层展示与即时语法反馈能帮助使用者迅速定位问题节点&#x…

📰

凌晨两点的决策:架构师故障取舍与职场进阶

凌晨两点的决策,这六个字可能是很多工程师职业生涯里最不愿面对、却又最能说明问题的考题。白天我们有评审、有文档、有同事可以商量;到了凌晨两点,监控告警把手机震到桌面嗡嗡响,会议室里可能只剩两个睡眼惺忪的人,所…

📰

改进蚁群算法在多目标路径规划中的探索与实践

先说实话,蚁群优化算法(ACO)这条路,我从最开始觉得"就是照着蚂蚁找食物的过程写个概率公式",到现在真正拿它做多目标路径规划里的核心搜索框架,中间踩的坑比想象中多得多。标题里那句"改进蚁…

📰

docker迁移SOP

整体流程 目录 一、先确认当前环境二、先解决数据盘开机挂载三、创建新的 Docker 数据目录四、确认 rsync五、记录当前运行中的容器六、停止业务容器七、停止 Docker 和 containerd八、复制 Docker 数据九、配置 containerd 新目录十、配置 Docker 新目录十一、增加 systemd …

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬