☰
Mac Duo 源码构建完整指南:Swift Package Manager 打包、ad-hoc 签名与屏幕录制权限问题一次解决
2026/10/13 15:00:52 网站建设 项目流程

【免费下载链接】Mac-Duo

Wish you could bring the iPhone Duo effect to your MacBook?

项目地址:https://gitcode.com/gh_mirrors/mac/Mac-Duo
点击查看免费下载

想把 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.sh

build.sh背后做的事:

  1. 以 release 模式调用swift build -c release --product MacDuo(同时构建lidprobe);
  2. 把可执行文件、Info.plist、本地化资源拷进build/Mac Duo.app的标准 bundle 结构;
  3. 用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,若合盖无效果:

  1. 打开系统设置 → 隐私与安全性 → 屏幕录制与系统录音;
  2. 找到Mac Duo并打开开关(若列表里没有,先完全退出再重新打开一次 App);
  3. 按提示重启 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?

项目地址:https://gitcode.com/gh_mirrors/mac/Mac-Duo
点击查看免费下载

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询