macOS 应用"已损坏"无法打开?一文搞懂 Gatekeeper 与解决方案

1 阅读5分钟

遇到「"xxx.app"已损坏,无法打开」别急着删!这是 macOS Gatekeeper 的安全拦截。按 Control + 右键 尝试打开,或用 xattr -d com.apple.quarantine 命令移除隔离属性即可。


😱 问题现象

当你兴冲冲地下载了一个开源工具或第三方应用,双击准备运行时,macOS 却弹出这样的警告:

「"xxx.app"已损坏,无法打开。你应该将它移到废纸篓。」

或者:

「无法打开"xxx.app",因为 Apple 无法检查其是否包含恶意软件。」

等等!别急着点"移到废纸篓"! 这大概率不是应用真的损坏了,而是 macOS 的安全机制在"作妖"。


🔍 为什么会出现这个问题?

要理解这个问题,我们需要了解 macOS 的三层安全防护机制:

1. Gatekeeper(守门员)

从 macOS 10.7 Lion 开始,Apple 引入了 Gatekeeper 机制,用来控制应用安装来源:

安全级别设置位置说明
仅 App Store系统设置 → 隐私与安全性最安全,只能安装商店应用
App Store + 认证开发者同上(默认)允许商店和已签名应用
任何来源终端命令开启关闭 Gatekeeper(不推荐)

当你下载的应用不满足以下条件时,就会触发拦截:

  • ✅ 来自 App Store
  • ✅ 来自 Apple 认证开发者(有开发者证书签名)
  • ✅ 通过 Apple 公证(Notarization)

2. 隔离属性(Quarantine)

macOS 会给从互联网下载的文件打上 隔离标记com.apple.quarantine),就像给文件贴上一个"外来人员"标签:

# 查看文件是否有隔离属性
xattr /Applications/xxx.app

# 输出示例:
# com.apple.quarantine
# com.apple.metadata:kMDItemWhereFroms

触发条件

  • 通过浏览器(Safari/Chrome/Firefox)下载
  • 通过邮件附件接收
  • 通过第三方网盘/IM 工具传输

绕过方式

  • 使用 curl 命令行下载(不会打隔离标记)
  • 使用 Homebrew 安装(自动处理)

3. 应用签名与公证

开发者要让自己的应用通过 Gatekeeper,需要:

  1. 加入 Apple Developer Program(年费 $99)
  2. 代码签名(Code Signing):用证书给应用签名
  3. 提交公证(Notarization):上传到 Apple 服务器扫描
  4. stapler 固定:将公证凭证嵌入应用

成本问题

  • 很多开源开发者负担不起 $99/年的费用
  • 个人开发者可能觉得没必要为免费工具付费
  • 一些老旧应用公证过期

这就是为什么很多正版、安全的开源软件会被 macOS 拦截。


🛠️ 解决方案(从简单到复杂)

方案一:Control + 右键打开(最简单,推荐尝试)

这是 macOS 提供的"后门",给用户的自主选择权:

操作步骤

  1. 打开 访达 → 应用程序
  2. 找到报错的 xxx.app
  3. 按住 Control 键(或右键),点击应用图标
  4. 选择 "打开"(注意不是直接双击)
  5. 弹出警告对话框时,点击 "打开"(这次按钮是可点击的)

原理:Control+右键 告诉系统"用户明确知道自己在做什么",允许绕过本次拦截。

局限性:每次更新应用后可能需要重复操作。


方案二:终端移除隔离属性(最可靠)

直接移除系统的"隔离标记",一劳永逸:

# 方法 1:指定完整路径(理论上这个命令就够用了)
xattr -d com.apple.quarantine /Applications/xxx.app

# 方法 2:使用通配符(如果记得应用名称的一部分)
xattr -d com.apple.quarantine /Applications/*xxx*.app

# 方法 3:自动查找并移除(适合不知道安装位置的情况)
APP_PATH=$(mdfind -name 'xxx.app' | head -1)
xattr -d com.apple.quarantine "$APP_PATH"

验证是否成功

# 再次查看属性,应该没有 com.apple.quarantine 了
xattr /Applications/xxx.app

# 如果输出为空或只有其他属性,说明成功

优点

  • 彻底解决问题
  • 不影响应用功能
  • 更新后无需重新操作

注意:需要管理员密码时使用 sudo

sudo xattr -d com.apple.quarantine /Applications/xxx.app

方案三:系统设置授权(图形界面)

如果你刚尝试打开应用被拦截,可以在设置中找到"后悔药":

  1. 打开 系统设置(System Settings)
  2. 左侧选择 隐私与安全性(Privacy & Security)
  3. 向下滚动到 安全性 部分
  4. 会看到一行提示:

    "xxx.app" 已被阻止使用,因为来自身份不明的开发者。

  5. 点击 "仍要打开"(Open Anyway)

注意:这个选项只在应用被阻止后的很短时间内出现(通常几分钟),超时后就不再显示。


方案四:临时关闭 Gatekeeper(终极方案,谨慎使用)

如果以上方法都不行,可以临时关闭 Gatekeeper:

# 查看当前 Gatekeeper 状态
spctl --status

# 输出:
# assessments enabled  → 开启状态
# assessments disabled → 关闭状态

# 关闭 Gatekeeper(需要输入管理员密码)
sudo spctl --master-disable

# 现在打开应用...

# 完成后重新开启(强烈建议)
sudo spctl --master-enable

关闭后,系统设置中会出现"任何来源"选项:

⚠️ 警告

  • 关闭 Gatekeeper 后,macOS 不会拦截任何应用
  • 只建议在安装可信应用时临时关闭
  • 安装完成后务必重新开启

方案五:重新下载(如果是真的损坏)

如果以上方法都无效,可能应用真的损坏了

检查方法

# 检查应用完整性
codesign -v /Applications/xxx.app

# 如果输出包含 "invalid signature" 或 "corrupt"
# 说明应用文件确实有问题

解决

  1. 删除当前应用
  2. 官方网站重新下载
  3. 优先选择 Homebrew 安装(自动处理签名问题):
    brew install --cask xxx
    

📝 总结

问题解决
"已损坏,无法打开"xattr -d com.apple.quarantine /Applications/xxx.app
"无法检查是否包含恶意软件"Control + 右键 → 打开
设置里没有"仍要打开"用终端命令移除隔离属性sudo spctl --master-disable
以上都无效检查是否真的损坏,重新下载

📚 延伸阅读