这不是签名或权限问题,而是Info.plist中LSMinimumSystemVersion低于当前macOS版本导致的硬拦截;必须修改该值为当前系统版本(如15.7),并清除quarantine属性,否则无法启动。

直接结论:这不是签名或权限问题,而是应用包内 Info.plist 声明的最低系统版本(LSMinimumSystemVersion)低于当前 macOS 版本,系统在启动前就硬拦截了——必须改这个值,否则双击必弹“系统版本过高不兼容”。
为什么改 Info.plist 是唯一有效解法
macOS 在启动任何 GUI 应用前,会先读取其 Contents/Info.plist 文件里的 LSMinimumSystemVersion 字段。如果该值(比如 10.15.6)小于你当前系统版本(如 15.7),系统直接拒绝加载进程,不走签名验证、不报“已损坏”,也不给调试机会。网上常见的“右键打开”“禁用 Gatekeeper”“重装命令行工具”全无效,因为根本没到那一步。
- 这个检查发生在 Launch Services 层,早于任何用户态代码执行
- 即使你用
xattr -d com.apple.quarantine清除隔离属性,依然会卡在这一步 - 某些老应用(如 Xcode 11、Qt Creator 4.12)内置的 LLVM 工具链(
clang,llvm-config)也以.app形式分发,同样受此限制
手动修改 Info.plist 的实操要点
路径必须进包内改,不能只改外层目录;值必须带小数点,不能省略末位。
- 右键应用 → “显示包内容” → 进入
Contents目录 → 找到Info.plist - 用 Xcode 或 VS Code 打开(不要用预览或访达默认文本编辑器,易乱码)
- 搜索
LSMinimumSystemVersion,把对应字符串值改成当前系统版本,例如:15.7(不是15,也不是157) - 保存后终端执行:
sudo chmod 644 /Applications/YourApp.app/Contents/Info.plist(避免只读权限导致写入失败) - 再运行:
xattr -d com.apple.quarantine /Applications/YourApp.app(清除隔离,否则仍卡“已损坏”)
批量修复多个旧 LLVM 工具包的脚本
如果你装了一堆旧版 LLVM 相关应用(比如 llvm-10.0.0.pkg 安装后生成的 LLVM.app),逐个手改太累。以下命令可自动遍历 /Applications 下所有含 Info.plist 的应用并更新:
osver=$(sw_vers -productVersion | cut -d. -f1,2); for app in /Applications/*.app; do if [ -f "$app/Contents/Info.plist" ]; then plutil -replace LSMinimumSystemVersion -string "$osver" "$app/Contents/Info.plist" 2>/dev/null; fi; done
注意:plutil 是 macOS 自带工具,无需额外安装;脚本只改 LSMinimumSystemVersion 字段,不影响其他配置;改完即生效,不用重启。
绕过检查的临时方法(仅应急,不推荐长期用)
终端运行:defaults write com.apple.LaunchServices LSMinimumSystemVersion -string "15.7",然后 killall Dock。这会让 Launch Services 在启动时忽略应用自身的 LSMinimumSystemVersion 声明,但仅限本次会话——系统重启后失效,且无法解决应用内部运行时做的二次版本检测(比如某些 LLVM 工具会在 main() 里调用 NSProcessInfo.processInfo.operatingSystemVersion 再校验一次)。
真正稳定的做法,还是老老实实进包里改 Info.plist。容易被忽略的是:改完必须同时清除 quarantine 属性,否则 macOS 仍会拦在第二道门。

















