macOS 签名与权限
桌面应用在 macOS 上处理代码签名、Apple Developer 注册、TCC 权限和 Tauri 配置的完整流程
你将学到
- macOS TCC 权限机制是怎么回事,什么操作会触发权限弹窗
- 为什么开发包每次构建后都要重新授权
- 免费 Apple Account 和付费 Developer Program 该选哪个
- 从创建 CSR 到配置 Tauri 签名身份的完整步骤
- 如何固定开发身份避免权限互相污染
- Developer ID 和 notarization 在正式分发中的角色
macOS 桌面开发里最容易让人踩坑的就是"权限授权"。麦克风、输入监听、辅助功能、自动粘贴这些能力,不只看应用名字,还看 bundle identifier、代码签名、安装路径和最终的 app bundle。开发时频繁重建、换路径、换签名方式,就可能每次都要重新授权。
这篇以 Tauri 为例,但 Electron 也适用同一套 macOS 规则。如果你还没有理解 Apple Developer Program、Bundle ID、App ID、证书和描述文件的关系,先看 Apple 平台配置。
macOS 权限是怎么回事
macOS 隐私权限由 TCC(Transparency, Consent, and Control)管理。当你的应用第一次请求某个敏感能力时,系统会弹窗让用户决定。这个决定和应用的"身份"绑定,不是和应用名绑定。
常见能力和对应权限:
| 能力 | 触发方式 | 系统权限 |
|---|---|---|
| 录音 | getUserMedia、原生录音 API | Microphone |
| 全局快捷键 | 快捷键插件、系统事件监听 | Accessibility 或 Input Monitoring |
| 监听修饰键 | CGEventTapCreate、低层键盘事件 | Input Monitoring,部分场景还会碰到 Accessibility |
| 自动粘贴到当前应用 | AppleScript、System Events、模拟键盘 | Automation 和 Accessibility |
| 截屏或屏幕识别 | 截图 API、窗口捕获 | Screen Recording |
命令行可以重置这些记录,让系统下次重新弹窗:
tccutil reset Microphone com.example.desktop
tccutil reset Accessibility com.example.desktop
tccutil reset ListenEvent com.example.desktop
tccutil reset AppleEvents com.example.desktop别把 reset 当日常流程。它会清掉已有授权,只适合处理旧 bundle id、旧签名、误点拒绝或系统设置里残留的脏记录。
为什么开发包反复要权限
TCC 不是只按应用显示名保存授权。下面这些变化都会让 macOS 重新判断应用身份:
- Bundle ID 变了 — 比如从
com.example.app改成com.example.desktop - 安装路径变了 — 比如从
target/release/bundle/macos换到/Applications - 代码签名变了 — 比如每次都是 ad-hoc 签名,或签名 hash 差异明显
- Info.plist 没被签名封存 — 系统无法把 bundle 信息稳定绑定到签名
- dev 和 release 共用一个 bundle id — 权限记录互相污染
可以先用这两个命令看现状:
security find-identity -v -p codesigning
codesign -dv --verbose=4 path/to/MyApp.app重点看:
Identifier是否和Info.plist里的CFBundleIdentifier一致Signature是否是adhoc- 有没有
TeamIdentifier Info.plist是否显示为not bound
如果 security find-identity 显示 0 valid identities found,说明钥匙串里还没有可用的代码签名身份。
免费账号 vs 付费 Developer Program
只做学习和本机开发,可以先用免费 Apple Account。Apple 官方说了,没加入 Apple Developer Program 的账号也能配合 Xcode 做个人开发测试(Xcode 里的 Personal Team)。
但 Certificates, Identifiers & Profiles 这些开发者后台资源通常要求加入 Apple Developer Program。如果你访问证书页面看到:
Access Unavailable
This resource is only for developers enrolled in a developer program or members of an organization's team in a developer program.意思很直接:当前 Apple Account 没有这个资源的访问权,或者没切到有权限的团队。
怎么选
| 目标 | 推荐账号/证书 | 说明 |
|---|---|---|
| 本机调试,暂时不分发 | Xcode Personal Team 或本机自签名 | 降低开发摩擦,但能力有限 |
| Tauri 手工签名开发包 | Apple Development | 稳定本机开发身份;网页后台创建通常需要 Program 权限 |
| 发给别人下载使用 | Developer ID Application + notarization | 需要 Apple Developer Program |
| 上架 Mac App Store | Mac App Distribution | 需要 Apple Developer Program |
Tauri 官方也写了:macOS 签名可以用付费或免费 Apple Developer account;免费账号只能测试和开发,不能公证应用,打开时仍会显示未验证提示。正式分发要走 Developer ID 和 notarization。
设置开发签名
从 CSR 到证书安装,按顺序走。
创建 CSR
CSR 是 Certificate Signing Request。Apple 需要它来给你的公钥签发证书,私钥留在本机钥匙串里。
用 Keychain Access:
- 打开 Keychain Access
- 菜单选择
Certificate Assistant > Request a Certificate From a Certificate Authority - 填邮箱和常用名称
- 选择
Saved to disk - 保存为
CertificateSigningRequest.certSigningRequest
也可以用命令行:
mkdir -p ~/Downloads/myapp-apple-signing
certtool r ~/Downloads/myapp-apple-signing/CertificateSigningRequest.certSigningRequest a
certtool V ~/Downloads/myapp-apple-signing/CertificateSigningRequest.certSigningRequestcerttool 是交互式命令。用途选 s,签名算法选 2(RSA with SHA256)。Common Name 和 Email Address 填你自己的信息。
创建并安装 Apple Development 证书
- 打开 Apple Developer 后台 的
Certificates, Identifiers & Profiles - 新建 Certificate
- 开发阶段选择
Apple Development - 上传刚才生成的 CSR
- 下载
.cer文件 - 双击
.cer,或用命令导入 login keychain:
security import ~/Downloads/development.cer -k ~/Library/Keychains/login.keychain-db
security find-identity -v -p codesigning成功后会看到类似:
Apple Development: Your Name (TEAMID)如果看不到,一般是证书和本机私钥没配对。确认 CSR 是这台机器生成的,且证书装到了 login keychain。
配置 Tauri 签名身份
Tauri 可以通过 tauri.conf.json 指定签名身份:
{
"bundle": {
"macOS": {
"signingIdentity": "Apple Development: Your Name (TEAMID)",
"entitlements": "Entitlements.plist"
}
}
}也可以临时用环境变量覆盖:
APPLE_SIGNING_IDENTITY="Apple Development: Your Name (TEAMID)" vp run --filter @myapp/desktop tauri:build如果只是做 Apple Silicon 本机 ad-hoc 签名,可以设成 -:
{
"bundle": {
"macOS": {
"signingIdentity": "-"
}
}
}ad-hoc 签名只能解决"有签名"这个最低要求,不能让用户跳过 Gatekeeper,也不能公证。要稳定权限和正式分发时,别长期依赖它。
固定开发身份
开发阶段建议 dev 和 release 分开:
| 项 | dev | release |
|---|---|---|
| Bundle ID | com.example.app.dev | com.example.app |
| App 名称 | Example Dev | Example |
| 安装路径 | /Applications/Example Dev.app | /Applications/Example.app |
| 签名 | Apple Development | Developer ID Application |
这样做有两个好处:dev 权限重置不影响正式版用户,macOS 更容易持续识别同一个开发应用。
重新授权
如果你改过 bundle id 或签名方式,按这个顺序清理一次:
- 退出应用
- 删除旧开发包,保留一个固定路径
- 用新签名重新构建
- 必要时重置旧 TCC 记录
- 启动应用,让系统弹出权限请求
- 在系统设置里手动打开 Accessibility、Input Monitoring、Microphone 等权限
tccutil reset All com.example.desktop.dev
open "x-apple.systempreferences:com.apple.preference.security?Privacy_Accessibility"
open "x-apple.systempreferences:com.apple.preference.security?Privacy_ListenEvent"
open "x-apple.systempreferences:com.apple.preference.security?Privacy_Microphone"macOS 不允许普通命令行脚本直接替用户授予隐私权限。企业设备可以用 MDM/PPPC profile 管控部分权限,个人开发机一般不走这条路。
正式分发
Apple Development 适合开发。你要把 DMG、ZIP 或 .app 发给用户下载,就需要:
Developer ID Application证书- Tauri 构建时使用这个证书签名
- 提交 notarization(公证)
- stapler 把公证票据绑定到应用或 DMG
这一步需要 Apple Developer Program。免费账号不能完成 notarization。
注册 Apple Developer Program
注册入口:Apple Developer Program Enrollment
个人开发者通常选 Individual。准备好 Apple Account(开启双因素认证)、合法姓名、联系信息和付款方式。年费通常是 99 USD 或当地等值价格。
如果用公司主体注册 Organization,还需要公司法定实体信息、D-U-N-S Number,以及有权代表公司签约的人完成注册。
注册完成后,回 Certificates, Identifiers & Profiles 页面创建 Developer ID Application 证书。如果你加入了多个团队,先在页面右上角切到正确团队。
公证凭据
Tauri 可以在构建或打包时读取这些环境变量:
| 目标 | 环境变量 | 说明 |
|---|---|---|
| 指定签名身份 | APPLE_SIGNING_IDENTITY | 覆盖 tauri.conf.json 里的 signing identity |
| CI 导入证书 | APPLE_CERTIFICATE、APPLE_CERTIFICATE_PASSWORD | 把 .p12 证书放进 CI secret |
| App Store Connect API 公证 | APPLE_API_ISSUER、APPLE_API_KEY、APPLE_API_KEY_PATH | 推荐给 CI 使用,避免 Apple ID 交互 |
| Apple ID 公证 | APPLE_ID、APPLE_PASSWORD、APPLE_TEAM_ID | APPLE_PASSWORD 应使用 app-specific password |
如果构建产物只显示已签名,但 Gatekeeper 仍提示来源无法验证,通常是公证或 stapling 没完成。先检查 Tauri build 输出,再用干净机器安装验证。
验收清单
发布前确认这几项:
security find-identity -v -p codesigning能看到目标证书.app的 identifier、TeamIdentifier 和预期一致- 产物使用 Developer ID Application 签名
- notarization 通过,并且 DMG 或 app 已 staple
- 在非开发机上安装打开,不需要用户手动绕过 Gatekeeper
- 需要麦克风、输入监听、辅助功能等权限时,弹窗和系统设置入口都能正常工作
参考资料
- Apple Developer Program Enrollment
- Apple Developer Membership Comparison
- Apple Certificates overview
- Tauri macOS Code Signing
下一步
- Skills 与插件推荐 — 为桌面端开发选合适的 AI Skills 和插件
想和其他创造者交流?
这篇文档有问题?