Mac 软件提示已损坏无法打开的解决方法 xattr
为什么提示「已损坏」
这个提示很有误导性——文件其实一点没坏,是 macOS 的 Gatekeeper 在拦。
原理是这样:浏览器、下载工具从网上下载文件时,会给文件加一个叫 com.apple.quarantine 的扩展属性(extended attribute),标记「这东西来自互联网,不可信」。之后首次打开时 Gatekeeper 会检查这个标记,然后去验证 App 的代码签名和公证(notarization)。签名不存在、签名失效、或者没经过苹果公证,就会弹出「已损坏,无法打开」。
会撞上这个的典型情况有几类:开源软件作者没花钱买苹果开发者证书;从 GitHub Releases 下的构建产物;被第三方修改过导致原签名失效的 App;还有跨架构编译的一些工具。这些都不是真的损坏。
顺便说下,如果 App 有签名只是没公证,提示语通常是「无法打开,因为它来自身份不明的开发者」,这种右键点 App 选「打开」就能绕过,不用命令行。提示「已损坏」的是更严格的情况,右键打开也不管用。
解决方法
思路就是把那个 quarantine 标记清掉,让 Gatekeeper 不再对它做检查。
打开终端,输入 xattr -cr ,然后将应用程序拖入到终端中, 如下,回车后重新打开 app 运行
拖拽是为了让终端自动填入正确的路径,避免手打时空格、中文之类的转义问题出错。注意 xattr -cr 后面要留一个空格再拖:
xattr -cr /Users/yourname/Downloads/chrome-mac/Chromium.app
拆解一下参数。xattr 是操作文件扩展属性的命令,-c(clear)清除所有扩展属性,-r(recursive)递归处理目录下所有文件——.app 本质是个目录,里面每个文件都可能带标记,所以必须加 -r。
更精准的写法是只删 quarantine 这一个属性,不动其他扩展属性:
xattr -dr com.apple.quarantine /path/to/App.app
-d 是删除指定属性。日常用 -cr 也没问题,.app 包里一般没有其他重要的扩展属性。
想先确认到底有没有这个标记,用 xattr -l 看一下:
xattr -l /path/to/App.app
输出里有 com.apple.quarantine 就说明是这个问题,没有的话得往别的方向排查(比如架构不匹配、依赖缺失)。
清了标记还打不开:重新签名
有的 App 清完 quarantine 依然报「已损坏」,多半是签名本身就是坏的。比如 Electron 打包的 any-listen,自带的只是 ad-hoc 签名,而且签名不完整。用 codesign 和 spctl 一查就能看出来:
codesign -dv /Applications/any-listen.app
# Signature=adhoc
spctl -a -vv /Applications/any-listen.app
# code has no resources but signature indicates they must be present
这种情况在本机给它重新做一次 ad-hoc 签名就行:
xattr -cr /Applications/any-listen.app
codesign --force --deep --sign - /Applications/any-listen.app
codesign --verify --deep /Applications/any-listen.app && echo OK
--sign - 表示 ad-hoc 签名,不需要开发者证书;--deep 会把包里的 Framework、Helper 一起重签。
经常遇到的话,在 ~/.zprofile 里加个函数,以后一条命令搞定:
# 解除 macOS「已损坏」拦截:清除隔离标记并重新签名
unq() { xattr -cr "$1" && codesign --force --deep --sign - "$1"; }
用法:unq /Applications/xxx.app。App 每次升级覆盖安装后,隔离标记和原签名都会回来,到时候再跑一遍即可。
一劳永逸:允许任何来源
不想每个 App 都处理一遍的话,可以直接关掉 Gatekeeper:
sudo spctl --master-disable
在新版 macOS(Sequoia 及之后)上,光执行这条命令还不够。还得打开「系统设置 → 隐私与安全性 → 安全性」,把「允许以下来源的应用程序」手动改成 任何来源:

改完之后,新下载的 App 不再弹「已损坏」。想恢复默认保护:
sudo spctl --master-enable
这是全局开关,等于对所有来源的软件都放弃了签名和公证检查,包括恶意软件。只装可信来源的话问题不大;平时下载来路比较杂,还是用上面的 unq 逐个放行更稳妥。
另外,网上流传的 defaults write com.apple.LaunchServices LSQuarantine -bool NO 在新版 macOS 上已经无效,不用试。
需要注意的风险
这条命令等于手动跳过了系统的安全检查,所以只对你信任来源的软件用。从官方仓库、知名开源项目下的构建产物可以放心处理;来路不明的破解版、第三方下载站的东西,绕过校验就是把自己暴露在风险里了。清掉标记之后系统不会再有任何提示,一切后果自己承担。
另外别对整个 /Applications 递归执行 xattr -cr。虽然多数情况没事,但那等于把所有应用的扩展属性一起清了,范围太大不可控。按需处理单个 App 就够。

还没有留言,来发表第一条吧~