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 票據。完成後用戶下載即用,無任何安全彈窗,完全無感知。