这是macOS安全机制的核心。
:代码签名和公证,系统依然会弹出权限请求的对话框。
下面我来详细解释一下为什么,以及这几个安全机制各自扮演的角色。
签名、公证、和运行时权限是三道不同的“安全门”
您可以把macOS的这套安全体系理解为进入一个重要建筑的三道安检程序,它们的目的各不相同,缺一不可。
1. 代码签名 (Code Signing):验证“你是谁”
-
目的:确认应用的开发者身份,并保证应用自签名后没有被篡改过。
-
好比:这是第一道门,检查您的身份证。保安(Gatekeeper)需要确认两件事:
- 你确实是张三,而不是别人冒充的(身份验证)。
- 你的身份证没有被涂改或伪造(完整性)。
-
用户体验:如果一个应用没有签名或者签名无效,macOS会阻止其运行,并警告用户“无法验证开发者”或“文件已损坏”(因为内容被修改,签名失效)。
2. 公证 (Notarization):确认“你没有明显危险”
- 目的:这是苹果对您的应用进行的自动扫描,检查其中是否包含已知的恶意软件或安全风险。
- 好比:这是第二道门,对您的行李进行安检扫描。保安(苹果的服务器)用X光机检查你的包里有没有枪支、炸药等违禁品。这不代表你进入大楼后可以为所欲为,只代表你进入时没有携带明显的危险品。
- 用户体验:经过公证的应用,用户在首次打开时会看到一个更友好的提示:“Apple 已检查其未包含恶意软件”。这给了用户更大的信心。如果应用没有被公证,在较新的macOS版本上,Gatekeeper默认会阻止其运行。
3. 运行时权限 (Runtime Permissions / TCC):授权“你能做什么”
-
目的:在应用已经被信任(通过了签名和公证)并开始运行后,精细地控制它能访问哪些敏感数据或系统功能。这个机制也叫做 TCC (Transparency, Consent, and Control) 。
-
好比:这是第三道门,也是最关键的一道。你已经进入了大楼(应用已运行),但你想进入特定的房间(如“会议室”、“档案室”)。你必须向大楼的管理员(操作系统)申请,并由大楼的主人(用户)亲自授权:“是的,我允许张三进入会议室”。
-
用户体验:这就是您所说的“弹出来让你去选择”的对话框。例如:
“App名称”想要访问您的相机。“App名称”想要访问您“下载”文件夹中的文件。“App名称”想要录制此电脑的屏幕。
总结与对比
为了更清晰地说明,这里有一个表格来对比这三者的区别:
| 安全机制 | 目的 | 何时发生 | 对用户/开发者的意义 |
|---|---|---|---|
| 代码签名 (Code Signing) | 验证开发者身份和代码完整性 | 开发者编译时 & 用户首次运行前 | 信任的基石。告诉系统:“我(开发者)是谁,我保证代码没被改过。” |
| 苹果公证 (Notarization) | 检查应用是否包含已知恶意软件 | 开发者分发前 & 用户首次运行前 | 安全的预检。告诉系统:“苹果已扫描过我,认为我没有恶意内容。” |
| 运行时权限 (TCC) | 保护用户隐私和数据,由用户授权 | 应用运行时,当它首次尝试访问敏感资源时 | 隐私的守护。告诉用户:“这个App现在想做这件事(如用麦克风),你同意吗?” |
结论
代码签名和公证解决的是应用运行前的信任问题,它们向用户和系统保证了这个App的来源是可靠的,并且没有携带已知的恶意代码。
而运行时权限解决的是应用运行后的行为控制问题,它把访问敏感数据(如通讯录、照片、位置、文件)的最终决定权交还给用户。
所以,即使您的mac应用已经完美地设置了开发者签名和苹果公证,当它第一次尝试访问摄像头、麦克风、用户的个人文件夹等受保护的资源时,macOS必定会弹出权限请求对话框,让用户来决定是否批准。这是一个核心的隐私保护设计,无法通过签名或公证来绕过。