惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - 三生石上(FineUI控件)
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
月光博客
月光博客
博客园 - 【当耐特】
Hugging Face - Blog
Hugging Face - Blog
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
爱范儿
爱范儿
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
博客园_首页
雷峰网
雷峰网
量子位
有赞技术团队
有赞技术团队
博客园 - 叶小钗
博客园 - 聂微东
V
V2EX
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 司徒正美
小众软件
小众软件
The Cloudflare Blog
阮一峰的网络日志
阮一峰的网络日志
Apple Machine Learning Research
Apple Machine Learning Research
Jina AI
Jina AI
人人都是产品经理
人人都是产品经理

少数派

派早报:Google 发布 Fitbit Air 等 - 少数派 「新人报到」確認需求,再開始 - 少数派 从 SOLO 独立开发者社区,我看到了越来越多开发者开始做自己的产品 - 少数派 我怎么管理那些"不常做,但总会忘"的生活事项 - 少数派 人形机器人量产元年,数据才是具身智能的“生死线” - 少数派 BuhoLaunchpad 高度还原 Mac 启动台:开发历程与思考 - 少数派 五年陪伴依然不舍,DIY 换壳后让罗技 MX Master 3 继续服役 - 少数派 新玩意 240|少数派的编辑们最近买了啥? - 少数派 一日一技|为什么你应该关闭 iOS 的键盘声音 - 少数派 我做了个插件和 Skills,一键提取任何网站的设计规范 Design.md - 少数派 住在三四线城市的你,该开始录播客了 - 少数派 甘南秘境,大白高国 - 少数派 AI的审美:谁让把我变成川内倫子 - 少数派 返工怎能不烦恼,打工人片单总有一部是你的「嘴替」 - 少数派 为了让「上厕所」更健康,我做了一个小工具 - 少数派 AI + Skill,能够让生成的文章去除 AI 味吗? - 少数派 新玩意|韶音OpenDots ONE 耳夹式耳机 - 少数派 《美满》| 在每一个春天的晚上相爱(362) - 少数派 新玩意|优篮子 PS01 MagSnap 磁吸支架 - 少数派 自我整合手记 | 我开始早睡了:用稳定规则,为自由托底 - 少数派 用龙虾(OpenClaw)两个多月,我最深的12个体会 - 少数派 听歌时间到,12 张你可能错过的 2025 华语乐坛好专辑 - 少数派 承诺能追吗 - 少数派 macOS 26启动台没了? 我做了个不一样的App启动器 - Keboard - 少数派 《四海为家的人》| INTJ对话INTJ(361) - 少数派 你发过的那些黑历史,是时候一次清干净了 - 少数派 新玩意:安安静静玩,越玩越专注:计客密码机 - 少数派 iPad 用户首次体验 Android 平板:vivo Pad6 Pro - 少数派 数据逻辑强 - 少数派 极北行+ | 一路向北,探访日本至北之地 | 001 - 少数派
一日一技|用 tccplus 解决 OCLP macOS 无法请求系统权限的问...
2023-07-17 · via 少数派

前阵子我在圆桌合写 《你的第一台 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 等关键字。

好在天下不可能只有我一个人遇到这种状况。查到 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 不失为一个好工具,以备不时之需。

感谢阅读。