macOS 开发权限问题操作指南
由于 LCC Unity SDK 中使用了第三方 webP 解码库,在 macOS 上使用 SDK 时,可能遇到「未能打开 xxx.bundle」的报错。这是 macOS 安全机制(Gatekeeper)阻止未认证的第三方插件运行,与 Unity 或 SDK 本身无关。
本指南分两部分:
- 第一部分:开发环境中临时解决第三方库权限问题。
- 第二部分:打包应用时的正式解决方案(对外发行)。
第一部分:开发环境中临时解决第三方库权限问题
以下方法适用于开发阶段快速解除 bundle 限制,按优先级依次尝试。
方法一:系统设置直接允许(最快)
| 步骤 | 操作说明 |
|---|---|
| 1 | 打开 Mac 系统设置,在左侧找到 隐私与安全性 |
| 2 | 向下滑动,找到「安全性」区域 |
| 3 | 找到提示「xxx.bundle 已被阻止使用」,点击旁边的 允许 按钮 |
| 4 | 重启 Unity,重新导入或运行 SDK |
方法二:终端移除隔离标记(最彻底)
macOS 会对从网络下载的文件打上 com.apple.quarantine 隔离标记,用终端命令可直接移除。
| 步骤 | 操作说明 |
|---|---|
| 1 | 打开 启动台 → 其他 → 终端(Terminal) |
| 2 | 输入命令(末尾保留一个空格):sudo xattr -rd com.apple.quarantine |
| 3 | 将报错的 xxx.bundle 文件直接拖入终端窗口,自动补全路径 |
| 4 | 按回车,输入 Mac 开机密码(输入时不显示,属正常现象) |
| 5 | 执行完成后重启 Unity |
提示:
此命令需要管理员权限(
sudo),输入密码时屏幕不会有任何显示,直接输完回车即可。
方法三:添加可执行权限(补充)
如果方法一、方法二仍未生效,给 bundle 补充执行权限:
chmod -R 755 /path/to/xxx.bundle
同样可以将 bundle 文件拖入终端自动补全路径,回车执行后重启 Unity。
方法四:检查 Unity 插件平台设置
| 步骤 | 操作说明 |
|---|---|
| 1 | 在 Unity Project 窗口找到 xxx.bundle 文件 |
| 2 | 选中后查看 Inspector 窗口 |
| 3 | Platform Settings 中勾选 Any Platform,或单独勾选 Standalone / macOS |
| 4 | 确认没有勾选 Exclude Platform(排除平台) |

在 Inspector 的 Platform Settings 中勾选 Any Platform 或 macOS
方法五:临时关闭 Gatekeeper(终极方案)
警告:
此方法会降低系统安全性,仅建议在开发机上临时使用,开发完成后务必重新开启。
如果以上方法均无效,可临时关闭系统安全校验:
sudo spctl --master-disable
验证是否关闭:
spctl --status
# 显示 assessments disabled 即为关闭成功
开发完成后重新开启安全保护:
sudo spctl --master-enable
第二部分:打包应用解决第三方库权限问题
要让最终用户无感知地使用包含第三方 SDK 的应用,必须在开发者侧完成「代码深度签名 + Apple 公证 + Staple 票据绑定」。这是 macOS 上唯一合规且用户零操作的标准方案。
前置条件(缺一不可)
| 序号 | 条件 | 说明 |
|---|---|---|
| 1 | Apple Developer Program | 99 美元/年,用于获取 Developer ID Application 证书 |
| 2 | 开启 Hardened Runtime | Unity Player Settings → Other Settings → Mac 勾选 Use Hardened Runtime |
| 3 | 配置唯一 Bundle ID | 与开发者后台保持一致 |
| 4 | 关闭 Unity 自动签名 | 打包后使用终端手动深度签名 |
完整签名与公证流程
Step 1:清除扩展属性
xattr -cr "YourApp.app"
Step 2:深度递归签名
--deep 参数会自动遍历内部所有 .bundle、.dylib、.framework 并统一签名,彻底解决第三方 bundle 未签名被拦截的问题。
codesign --force --deep --options runtime --sign "Developer ID Application: YourCompany (TeamID)" "YourApp.app"
关键点:
将
YourCompany (TeamID)替换为你的开发者 ID 全称。使用--deep确保内部所有第三方 bundle 都被签名——这是 90% 的「签名后仍报错」的根本原因。
Step 3:打包标准 zip 用于公证
必须使用 ditto 命令打包,不能用系统右键压缩(否则公证校验会失败)。
ditto -c -k --sequesterRsrc --keepParent "YourApp.app" build.zip
Step 4:上传 Apple 公证
使用 notarytool(官方新版工具)提交公证,苹果后台会自动扫描恶意代码:
xcrun notarytool submit build.zip --apple-id your@apple.com --password 应用专用密码 --team-id TeamID --wait
等待返回 Accepted 即为公证通过。
Step 5:将公证票据钉入 App
Staple 后,用户离线打开也能通过校验:
xcrun stapler staple "YourApp.app"
# 校验是否成功
xcrun stapler validate "YourApp.app"
内部测试 / 企业内网分发(备选方案)
如果暂无 Apple 开发者账号,可用以下方式在内网分发:
| 步骤 | 操作说明 |
|---|---|
| 1 | Unity 打包出 .app |
| 2 | 在打包机上执行:xattr -rd com.apple.quarantine "YourApp.app" |
| 3 | 通过内网工具分发(scp、企业网盘、U 盘),不要用浏览器下载 |
局限性:
此方案仅适用于内网传输。浏览器下载会重新添加隔离标记,导致 bundle 报错重现,不适合公网分发。
常见避坑点
| 常见错误 | 正确做法 |
|---|---|
只签名主程序,没加 --deep | 必须使用 --deep 递归签名所有内部 bundle / dylib |
| 没开启 Hardened Runtime | Unity 打包前在 Player Settings 勾选,否则公证直接失败 |
| 公证后忘记 staple 票据 | 必须执行 xcrun stapler staple,否则离线打开仍弹窗 |
| 签名前未清理扩展属性 | 先执行 xattr -cr 清除所有 bundle 残留属性再签名 |
用系统右键压缩而非 ditto | 必须使用 ditto -c -k 标准打包,否则公证校验失败 |
总结
对外发行的唯一标准方案 = Apple 开发者 ID + 深度 codesign + notarytool 公证 + stapler 票据。完成后用户下载即用,无任何安全弹窗,完全无感知。