macos gatekeeper 对未公证应用采用分层触发的运行时验证:仅在首次启动时,当应用带有 com.apple.quarantine 属性且未通过 apple 公证时弹出“无法验证开发者”警告;用户右键选择“仍要打开”后即移除隔离属性并缓存信任,后续启动不再拦截;该机制自 macos 10.14.5 起强制实施,且随系统版本更新(如 ventura、sequoia)持续收紧时效与权限限制。
macos gatekeeper 对未公证(notarized)应用的限制,不是简单地“一刀切”拒绝,而是一套分层触发、按需拦截的运行时验证逻辑。它不阻止你下载或存放应用,只在首次启动时介入检查——而且只拦一次,放行后就记住你。
核心触发条件:quarantine 属性 + 缺失公证
Gatekeeper 的拦截动作,由两个关键因素共同决定:
- com.apple.quarantine 扩展属性存在:所有通过网络下载(Safari、Chrome、邮件附件、AirDrop 等)的应用,系统会自动打上这个标记,就像贴了张“新来者”标签;
- 未通过 Apple 公证服务(Notarization):即使有有效的 Developer ID 签名,若未提交苹果审核并获得公证票证(notarization ticket),Gatekeeper 在 macOS Ventura 及后续版本中就会拒绝启动。
两者同时满足时,双击就会弹出“无法验证开发者”警告。这不是错误,而是 Gatekeeper 正常工作的信号。
拦截不是永久封禁,而是“首次信任确认”
Gatekeeper 的设计本质是延迟授权,而非彻底阻断:
- 右键 → “打开” → 点“仍要打开”,系统会移除 quarantine 属性,并将该 App 的签名哈希加入本地信任缓存;
- 之后再双击,Gatekeeper 不再校验,直接运行;
- 这个信任仅限该 App 实例,换一个同名但不同签名/版本的应用,仍需重新确认。
公证缺失 ≠ 应用危险,但影响启动路径
未公证的 App 通常来自以下可信场景,却仍被拦:
- 开源项目官网发布的最新版(如 VS Code、Postman 的 .dmg 直链);
- 开发者本地构建的测试版(Electron、Flutter 桌面应用);
- 企业内部分发的定制工具(未走苹果公证流程);
- 你自己用 Automator 或 Platypus 打包的脚本 App(无签名也无公证)。
苹果不判断内容是否安全,只判断“是否经过它的验证流水线”。没走完这一步,就默认不放行启动——这是策略,不是结论。
系统版本越新,公证要求越刚性
从 macOS 10.14.5 开始强制要求公证,后续版本持续收紧:
- macOS Monterey(12)起,“已损坏”提示基本消失,统一为“无法验证开发者”;
- macOS Ventura(13)及更新系统中,“仍要打开”按钮仅在拦截发生后 1 分钟内有效,超时需手动去“隐私与安全性”设置里点击;
- macOS Sequoia(15)进一步限制辅助功能调用权限,即使成功启动,未公证 App 在请求 Accessibility 权限时也可能二次被拒。











