Tauri/Angular macOS应用签名后运行脚本崩溃,权限配置致签名失败
问题分析与解决方案
你的方向完全正确——macOS应用签名后受沙箱机制约束,执行bash脚本涉及文件系统读写和子进程创建,必须通过权限配置解除沙箱限制,否则会触发崩溃。以下是经验证的正确配置示例:
1. 正确配置 tauri.conf.json
在tauri > bundle > macos节点下添加权限文件引用,同时确保沙箱相关配置正确:
{ "tauri": { "bundle": { "macos": { "entitlements": "entitlements.mac.plist", "entitlementsInherit": "entitlements.mac.plist", "frameworks": [], "minimumSystemVersion": "10.13", "signingIdentity": "Developer ID Application: Your Team Name (TEAM_ID)", "providerShortName": null, "gatekeeperAssess": false } } } }
注意:
signingIdentity要替换为你实际的开发者ID,GitHub Actions中可通过环境变量动态传入。
2. 编写合法的 entitlements.mac.plist
创建项目根目录下的entitlements.mac.plist文件,仅申请必要权限(过度申请会导致签名失败):
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <!-- 允许应用读取/写入用户指定的文件/目录 --> <key>com.apple.security.files.user-selected.read-write</key> <true/> <!-- 允许创建子进程(执行bash脚本需要) --> <key>com.apple.security.cs.allow-subprocesses</key> <true/> <!-- 如果脚本需要访问特定系统目录,可添加对应权限,比如桌面: <key>com.apple.security.files.downloads.read-write</key> <true/> <key>com.apple.security.files.desktop.read-write</key> <true/> --> <!-- 沙箱启用(必须保留,否则签名会失败) --> <key>com.apple.security.app-sandbox</key> <true/> <!-- 允许网络请求(如果脚本不需要可删除) --> <key>com.apple.security.network.client</key> <true/> </dict> </plist>
关键注意点:
- 必须保留
com.apple.security.app-sandbox为true,Apple要求签名应用必须启用沙箱(除非是企业签名的特殊场景)- 仅添加你实际需要的权限,多余权限会被Apple签名工具拒绝
3. GitHub Actions签名配置示例
确保Actions中使用正确的证书和配置,避免签名失败:
jobs: build: runs-on: macos-latest steps: - uses: actions/checkout@v4 - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: 20 - name: Install dependencies run: npm install - name: Import Apple Certificates uses: apple-actions/import-codesign-certs@v2 with: p12-file-base64: ${{ secrets.APPLE_CERTIFICATE }} p12-password: ${{ secrets.APPLE_CERTIFICATE_PASSWORD }} - name: Build Tauri app run: npm run tauri build env: TAURI_SIGNING_IDENTITY: ${{ secrets.APPLE_SIGNING_IDENTITY }} TAURI_KEYCHAIN_PASSWORD: ${{ secrets.KEYCHAIN_PASSWORD }}
注意:
APPLE_CERTIFICATE是你的开发者证书base64编码,APPLE_SIGNING_IDENTITY要和tauri.conf.json中的一致。
4. 脚本执行的额外注意事项
- 确保bash脚本的路径正确:如果脚本打包在应用包内,使用Tauri提供的
appDir路径获取,比如在Angular中:
import { appDir } from '@tauri-apps/api/path'; import { invoke } from '@tauri-apps/api/core'; async function runScript() { const scriptPath = await appDir(); // 假设脚本在src-tauri/scripts下,打包后会在appDir内的scripts文件夹 const fullPath = `${scriptPath}/scripts/your-script.sh`; await invoke('run_shell_script', { path: fullPath }); }
- 脚本中避免使用相对路径,全部用绝对路径操作文件,防止沙箱路径限制导致找不到文件。
内容的提问来源于stack exchange,提问作者Uros Stanimirovic
相关产品推荐
相关产品推荐

