前阵子我在圆桌合写 《你的第一台 Apple 设备是什么?》 中提到我使用了 OpenCore Legacy Patcher(以下简称 OCLP)为 MacBook Pro Mid 2014 安装 macOS Ventura,让旧设备也能继续使用最新的系统。然而调教过程中发现,所有的应用都无法请求一些常见的系统权限,如照片、摄像头、麦克风等。应用不请求权限,也就无从选择允许还是拒绝。而像照片这类权限,在系统设置里面也没办法直接为某一应用授权,很难办。

经过一番搜索,目前已找到解决办法。本文将分享这一探索的过程。

TL;DR

如果你使用 OCLP 安装 macOS 13.3+,遇到应用无法请求系统权限的问题:

  1. 下载 tccplus 并解压至合适的目录,如用户的 Home 目录;
  2. 打开 Terminal,进入相应目录;
  3. 输入命令,形如 ./tccplus [add/reset] SERVICE [BUNDLE_ID]。例如需要为 微信 添加 麦克风 权限,则输入:
./tccplus add Microphone com.tencent.xinWeChat

Voilà! 这样就可以了!

理论上,我们只要准备好应用的 Bundle Identifier(捆绑标识符),就可以为它添加各种隐私权限。Bundle Identifier 的获取方式见后文。

系统隐私设置,没用

应用不请求权限,首先想到是不是能去系统设置那边手动为它加上。然而 macOS 的隐私设置很奇怪,你可以看到在「系统设置 - 隐私与安全」中,隐私权限管理有两种情况:

  • 有些项目会在已授权应用列表下方提供「+/-」按钮,供用户自行添加或删除授权应用(如辅助功能、屏幕录制等);
  • 有些项目只会展示曾经请求过该权限的应用,但不提供「+/-」按钮,就导致假如应用自己不请求权限,我们在系统设置里也没办法为它添加授权(如照片、摄像头、麦克风等)。

具体情况可参照 在 Mac 上更改隐私与安全性设置 - 官方 Apple 支持 (中国)

系统隐私权限设置中的两种情况(1)
系统隐私权限设置中的两种情况(2)

不是很明白区分对待的原因。但显然,假如我们这时需要为哪个会议应用开启摄像头、麦克风权限,那还是得另辟蹊径的。

关于 TCC 数据库

「系统设置 - 隐私与安全」中的项目,与 TCC 数据库关联。TCC 代表 「Transparency, Consent, and Control」(透明度、同意和控制),是 macOS 中的一种安全机制,用于管理应用对隐私数据和系统功能的访问权限。

我们在「系统设置 - 隐私与安全」修改应用的隐私权限和文件的访问权限时,这些操作其实都会记录在 TCC 数据库中。当应用再次尝试访问受保护的数据或功能时,macOS 会查询 TCC 数据库,看看该应用是否已被授权。如果查询到应用被授权,则允许其访问相应的数据或功能;反之则不然。

TCC 数据库通常存放在用户的 Library 目录下,完整路径是 ~/Library/Application Support/com.apple.TCC/TCC.db由于 TCC 数据库受到系统的保护,而直接修改数据库文件并非明智、安全的做法,所以我们需要通过「系统设置 - 隐私与安全」来管理应用的权限,并同步至 TCC 数据库。

但问题正如上文所说——系统设置里面也管不了,数据库文件我也不敢动,还有没有什么其他简单的方法呢?

tccutil,也没用

我想到过去重置隐私权限时使用过的 macOS 内建命令行工具 tccutil,顾名思义,即 TCC Utility,TCC 实用工具。(都叫做这个名字了,应该能管理 TCC 数据库了吧?)

之前用到的重置命令非常简单,例如使用 tccutil reset Microphone 就可以重置所有应用的麦克风权限;使用 tccutil reset All 就可以重置所有的隐私权限;后面加上 Bundle Identifier 就可以单独重置某一个应用的权限。

但当我在 Terminal 输入 man tccutil,想查看它的 Man Page 时,却发现它目前竟然只支持一个命令,也就是 reset(也就是说你只能重置权限,不能添加。)

tccutil man page

怎么可以这样。没办法只能上网搜寻 OCLP、permission 等关键字。

tccplus,救星登场

好在天下不可能只有我一个人遇到这种状况。查到 OCLP 官方帮助文档中,有一个条目 是关于此的:

Currently for Ventura 13.3 and newer, due to new patches required, permissions are yet again broken.

另有查到 一个帖子 有相同说法:

This is an OpenCore issue that's actually related to Apple Mobile File Integrity (AMFI), not SIP. Do not set SIP back to On or your computer won't boot. The macOS 13.3.x update broke a lot of things that worked in 13.2.x.

两者都指出,在 macOS 13.3+ 存在类似的无法请求隐私权限的问题,并都推荐了一个工具——tccplus

怎么说呢,完美解决

从该项目的 README 中得知,tccplus 使用了 macOS 的 TCC.framework 来修改隐私权限。它的使用方式与 tccutil 十分相似,也是形如 tccplus [add/reset] SERVICE [BUNDLE_ID]相当于一个增强版的 tccutil。其中 SERVICE 即需要修改的隐私权限项目,如 CameraMicrophoneAll 等,具体可在 tccplus 文档中查看。

其实说白了关键的任务还是获取应用的 Bundle Identifier。有了它我们就可以为应用增加或重置各种权限。

Bundle Identifier 由应用开发者在每一个应用的 Info.plist 文件中指定,通常形如 com.example.appname。因此我们可以使用 grep 工具在 Info.plist 文件中检索并输出它:

grep 'CFBundleIdentifier' -A 1 /Applications/<APPLICATION NAME>/Contents/Info.plist

其中 CFBundleIdentifier 是我们需要检索的 key,-Agrep 的一个参数,用于显示匹配行及其后面的指定行数。这里我们指定 -A 1,表示显示匹配行及其后面的 1 行内容。

因此这行命令用白话来说就是:

使用 grep 工具检索指定的文件 /Applications/<APPLICATION NAME>/Contents/Info.plist,查找包含字符串 CFBundleIdentifier 的行,并显示该行及其后面的 1 行内容。

文件路径 /Applications/<APPLICATION NAME>/Contents/Info.plist 也不需要手动填写:在需要查询的应用上右键,选择「显示包内容」,找到 Info.plist 文件,直接拖入 Terminal 窗口,即可显示详细路径。

还是以微信为例,输出会像这样:

grep 'CFBundleIdentifier' -A 1 /Applications/WeChat.app/Contents/Info.plist

    <key>CFBundleIdentifier</key>
    <string>com.tencent.xinWeChat</string>

也可以使用 osascript 工具执行 AppleScript 脚本获取:

osascript -e 'id of app "APPLICATION NAME"'

也是非常直白,AppleScript 的 id of app 命令就是用于获取指定应用的 Bundle Identifier。

同样以微信为例:

osascript -e 'id of app "WeChat.app"'

com.tencent.xinWeChat

有了 Bundle Identifier,就可以直接在 tccplus 中使用了:

成功为微信添加麦克风权限的提示

另,在查询资料的过程中,看到有网友为 tccplus 制作了一个 AppleScript GUI。有了图形界面,使用起来可能会更加友好。这里是 介绍视频,供参考。

写在最后

可能你在阅读过程中会觉得,这么折腾旧设备为哪般。坦白讲我几乎用不到这台 MacBook Pro 的麦克风或者摄像头(甚至扬声器都很少用到?)我会发现这个问题也实属偶然。这台设备已然无法承载那些「繁重」的任务,我有一次拿相机拍的 4K 视频在给它剪辑看看会怎么样,然后发现 proxy 模式开着都够呛的。

所以为什么还要折腾它呢,既然用不着,权限没有就没有嘛?一是因为发现问题就要解决,过程中也学习到了以前不了解的 greposascript 等工具;二是因为,也不知道为什么,「压榨」旧设备的能力这件事实在太好玩了,想起以前有一段时间很热衷在 PSP 上面安装 GBA、N64 模拟器瞎玩,而那台 PSP 壳子都有点破破的了。

Anyway,随着时间推移,OCLP 补丁的发布、版本的升级,这个 issue 应该是可以被解决的。但 tccplus 不失为一个好工具,以备不时之需。

感谢阅读。