【免费下载链接】Mac-Duo
Wish you could bring the iPhone Duo effect to your MacBook?
想把 iPhone 的合盖空间感效果(Duo)搬到自己的 MacBook 上?这篇文章带你从源码构建 Mac Duo:用Swift Package Manager编译并打包成.app,完成ad-hoc 签名,并一次性解决新手最容易卡住的屏幕录制权限(Screen Recording)反复失效问题。全程只需命令行,无需 Xcode 工程文件。
📌 一句话概括:Mac Duo 是一个纯 Swift 的 SwiftPM 包,
./build.sh一条命令就能产出带 ad-hoc 签名的build/Mac Duo.app;唯一要额外花心思的,是 macOS 屏幕录制权限的授权方式。
📦 项目结构速览:这是一个标准的 SwiftPM 包
动手前先花 30 秒理解仓库布局,后面构建才不会迷路。Package.swift 声明了 3 个 target 加 1 组测试:
- LidAngleKit(Sources/LidAngleKit/LidAngleSensor.swift):封装读取 MacBook 合盖角度的 HID 传感器,不需要任何系统权限;
- MacDuo(Sources/MacDuo/):主程序,负责菜单栏、Metal 渲染与实时屏幕捕获;
- lidprobe(Sources/lidprobe/main.swift):传感器诊断小工具,用来确认机型是否带合盖角度传感器;
- MacDuoTests(Tests/MacDuoTests/):单元测试。
依赖极简,无需拉取第三方库,离线也能编译。
🧰 构建前置要求
- macOS 14 或更高(Resources/Info.plist 中
LSMinimumSystemVersion已写死为 14.0); - Xcode 或 Command Line Tools,含 Swift 6.0 及以上——因为 Package.swift 顶部声明了
// swift-tools-version: 6.0; - 一台带内置合盖角度传感器的 MacBook(传感器必须被 macOS 标记为内置,外接的同类传感器会被忽略)。
💡 仓库通过 mise.toml 固定了
swift = "latest",若你本机装了 mise,进入目录会自动切到最新 Swift 工具链。
🚀 一键构建:build.sh 打包 + ad-hoc 签名
整个构建被封装在 build.sh 里,无需手动敲swift build:
# 1. 克隆源码 git clone https://gitcode.com/gh_mirrors/mac/Mac-Duo.git cd Mac-Duo # 2. 构建 + ad-hoc 签名,产出 build/Mac Duo.app ./build.shbuild.sh背后做的事:
- 以 release 模式调用
swift build -c release --product MacDuo(同时构建lidprobe); - 把可执行文件、
Info.plist、本地化资源拷进build/Mac Duo.app的标准 bundle 结构; - 用ad-hoc 签名执行
codesign --force --options runtime --timestamp=none --sign -,再用codesign --verify --strict校验。
常用参数一览:
| 命令 | 作用 |
|---|---|
./build.sh | 构建并签名 |
./build.sh --run | 构建、签名并重启 App |
./build.sh --universal | 同时构建 Apple Silicon 与 Intel |
SIGN_IDENTITY="你的名字" ./build.sh | 改用你自己的签名证书 |
⚠️ 默认签名标识是
-(ad-hoc),产物路径为build/Mac Duo.app,从访达双击打开即可。
🔐 为什么 ad-hoc 签名会让屏幕录制权限"变脸"
这是新手最容易被坑的一步,理解了原理后面就不会慌:
- 传感器不抢权限:合盖角度直接来自 IOKit 的 HID 设备,读取无需授权(见 LidAngleSensor.swift);
- 屏幕捕获才要权限:实时画面用的是
ScreenCaptureKit(ScreenStreamer.swift),macOS 要求屏幕录制权限; - ad-hoc 签名的坑:macOS 的 TCC 权限表把授权绑定到 App 的代码签名。ad-hoc 每次构建都会重新生成签名,系统于是把新产物当作"另一个 App",之前授过的屏幕录制权限就失效了。
一句话:每次用 ad-hoc 重新构建后,都要重新授予屏幕录制权限——这是正常现象,不是 bug。
🖥️ 屏幕录制权限:三种授权方式
方式一:系统设置里手动勾选(推荐)
构建后首次打开build/Mac Duo.app,若合盖无效果:
- 打开系统设置 → 隐私与安全性 → 屏幕录制与系统录音;
- 找到Mac Duo并打开开关(若列表里没有,先完全退出再重新打开一次 App);
- 按提示重启 App,效果即刻生效。
方式二:让系统弹窗自动授权
直接运行./build.sh --run启动,macOS 会弹出屏幕录制授权弹窗,点击"允许"后重启 App 即可。
方式三:tccutil 重置(授权状态混乱时)
如果权限显示"已开启"却仍无效,通常是旧的 ad-hoc 记录作祟,先重置该 App 的屏幕录制授权:
tccutil reset ScreenCapture to.maki.MacDuo这里的 Bundle ID 取自 Info.plist 的
CFBundleIdentifier(to.maki.MacDuo)。重置后重新授权即可恢复。
🎯 可选:用 lidprobe 验证传感器
构建产物里附带了build/lidprobe(源码见 main.swift),用来确认你的 MacBook 是否带可用传感器:
./build/lidprobe # 实时打印合盖角度若输出no lid angle sensor found on this Mac,说明当前机型不受支持,App 会在菜单栏提示传感器不可用。
✅ 常见问题速查(FAQ)
| 症状 | 原因 | 解决 |
|---|---|---|
| 合盖没反应、画面不倾斜 | 未授予屏幕录制权限 | 按"方式一"授权并重启 App |
| 每次重新构建都要重新授权 | ad-hoc 签名每次都变化 | 属正常现象;或设SIGN_IDENTITY用固定证书 |
| 提示无传感器 | 机型不含内置合盖角度传感器 | 换支持的 MacBook,或用lidprobe确认 |
| 找不到 Mac Duo.app | 产物路径不熟 | 在build/Mac Duo.app,从访达打开 |
照着走,你就拥有了一个可运行、可调试的 Mac Duo 本地构建版本。传感器读取零权限、屏幕捕获只需一次性授权——把这三件事理顺,从源码跑起 Mac Duo 其实只有三步:clone → ./build.sh → 授权屏幕录制。
【免费下载链接】Mac-Duo
Wish you could bring the iPhone Duo effect to your MacBook?
相关推荐
Swift Package Manager 注册表登录指南:`swift package-registry login` 完整实战与源码解析
Swift Package Manager 注册表登录指南: swift package registry login 完整实战与源码解析 本指南围绕 Swif
开发工具构建工具Swift Package Manager 的 `swift package` 命令完全指南:创建、编辑、检查与维护 Swift 包
Swift Package Manager 的 swift package 命令完全指南:创建、编辑、检查与维护 Swift 包 swift package 是
开发工具构建工具Swift Package Collections 完全指南:创建、发布、签名与使用包集合
Swift Package Collections 完全指南:创建、发布、签名与使用包集合 导读 本文以 SwiftPM 官方文档 PackageCollect
开发工具构建工具
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考