三个核心理念
具体到可以被验证。凡是 macOS 本身有限制的地方,本页会直说,而不是含糊其辞。
快
速度决定了架构,而不是反过来。Rust 引擎是直接链入应用的静态库:没有 IPC、没有序列化、没有辅助进程。
- 变更检测耗时 0.53 µs
- 采用轮询,因此无需事件监听,也就不必为了感知复制而索取辅助功能权限
- 底层就是直接的 Objective-C 消息发送
轻
闲置的剪贴板管理器应该是不存在的。监听线程在复制发生后以 400 µs 轮询,无变化时退避至 250 ms。
- UI 层没有任何定时器
- 历史保存在内存中,条数由你决定
- Release 包体 1.9 MB
私密
你可以让内容完全不进入剪贴板就完成粘贴,因此其他进程无法观察到它。这是真实的保证 —— 代价也同样真实,列在下方。
- 被标记为隐藏的条目永不记录
- 敏感内容在「存储时」即打码,而不只是显示时
- 数据不离开你的 Mac
数据在 Apple 芯片上实测,并由测试套件断言,而非手工测一次。
「私密」能诚实意味着什么
多数剪贴板管理器在这个问题上夸大了其词。这里是准确的版本。
一个不舒服的事实
内容一旦进入系统剪贴板,Mac 上任何应用都能读取。这不是缺失的功能,而是 macOS 的设计。没有任何 API 可以把内容写进剪贴板而不被他人读取。
NSPasteboardContentsOptionsCurrentHostOnly 阻止的是同步到你的其他设备,不是其他应用。AppKit 里根本没有 concealed 或 transient 标志;org.nspasteboard.ConcealedType 只是靠应用自愿遵守的约定。而 NSPasteboardAccessBehavior 管的是你自己能不能读,从来管不着别人。
所以:不经过剪贴板粘贴
开启该设置后,选择「不经过剪贴板粘贴」,内容会以合成按键直接输入到最前面的应用。内容全程不进入任何共享通道,因此其他进程在物理上无法观察到它。这是唯一能真正兑现这项保证的机制。
它诚实的代价
它需要辅助功能权限 —— 因为向其他应用注入事件正是该权限所管辖的能力。它更慢,事件按打字速度投递。而且它仅限文本:图片没有对应的按键表示,仍需走剪贴板路径。
| 措施 | 真正保证的是什么 |
|---|---|
| 历史记录存在应用容器内 | 其他应用读不到你的历史。共享的永远只有那一次剪贴板写入,而不是整份记录。 |
| 跳过隐藏条目 | 密码管理器标记为隐藏的条目永不记录 —— 这是尊重明确意图,而不是猜测。 |
| 敏感内容打码 | 卡号、API 密钥、JWT、私钥、带凭据的连接串、邮箱、身份证号,在记录时即打码,而不只是显示时。 |
| 替换自身前必须确认 | 下载的更新先校验、再呈现。MacCV 绝不静默改写自己的包体。 |
MacCV 无法阻止其他应用读取剪贴板 —— 没有东西能做到。如果你需要这个,请使用「不经过剪贴板粘贴」,或者不要把机密放上剪贴板。本页把这点写明,因为一个你无法验证的隐私声明,比没有声明更糟。
剪贴板里的一切,而不只是文本
多数管理器会把内容压扁成字符串:复制一个表格得到制表符分隔的文本,从设计工具复制得到一张位图。MacCV 保留每一种表示,并逐字节回放。
| 类别 | 类型 |
|---|---|
| 文本 | public.utf8-plain-text、制表符分隔文本 |
| 富文本 | public.rtf、com.apple.flat-rtfd、public.html |
| 图片 | public.png、public.tiff、com.adobe.pdf |
| 文件 | public.file-url —— 多文件复制保持多条目 |
| 链接 | public.url |
| 颜色 | com.apple.cocoa.pasteboard.color,解析为 sRGB |
| 声音 | com.apple.cocoa.pasteboard.sound |
| 字体、标尺 | com.apple.cocoa.pasteboard.font、…ruler |
| 其他 | 自定义 UTI,原样保存、原样回放 |
一次复制可以同时携带多种格式 —— 从 Safari 复制一段文字会同时带来纯文本、RTF 和 HTML —— MacCV 会全部保留,因此无论目标应用要哪种格式都能正确粘贴。
不会报「已损坏」的更新
一个下载自身新版本并替换自己的应用,会从父进程继承隔离属性,而 macOS 拒绝启动被隔离且未公证的包。通常的结果就是那个令人困惑的「MacCV 已损坏,无法打开」对话框。避免它的关键在于操作顺序。
- 下载到暂存目录
- 校验 SHA-256 —— 不匹配则删除文件并终止
- 用
spctl校验代码签名 - 只有此时才清除
com.apple.quarantine - 如实报告每一步的结论
如果在校验之前清除该属性,就等于彻底废掉了它的意义 —— 所以签名校验不通过的更新会被如实报告并保持隔离,而不是悄悄装上。MacCV 同样不会替换自己正在运行的包体:在一个应用运行时做半途而废的替换,比请你手动拖一个文件更糟;因此校验通过的包体会在访达中显示,由你完成最后一步。
自行构建
需要 macOS 27、Xcode 27、Rust 1.85+ 与 XcodeGen。引擎可独立构建与测试;Xcode 工程由单个 YAML 文件生成。
git clone https://github.com/yxxbc/Maccv.git
cd Maccv
cargo test # Rust 引擎,109 个测试
cargo build --release -p maccv-ffi
cd apps/mac
xcodegen generate # project.yml 是工程的事实来源
xcodebuild -scheme MacCV -configuration Release build
每一层都能自检,包括编译出的应用:它会针对进程私有剪贴板端到端验证 Swift → C ABI → Rust 整条链路,因此绝不会动到你真实的剪贴板。
接下来
已交付
全类型保真、自适应监听、多条目复制、菜单栏面板、不经过剪贴板粘贴、敏感内容打码、带签名校验的应用内更新,以及双语界面。
计划中
重启后保留的磁盘历史、全局快捷键、拖放、固定条目与按应用规则。
将来
代码公证,使其打开时不再出现 Gatekeeper 提示。