Xcode验证报错:已沙箱化签名的macOS捆绑可执行文件提示App sandbox未启用
macOS应用归档验证失败:嵌入式辅助工具的App Sandbox配置问题
验证错误信息
App sandbox not enabled. The following executables must include the "com.apple.security.app-sandbox" entitlement with a Boolean value of true in the entitlements property list: [("<redacted app bundle path>/Contents/Resources/<tool-1>", "<redacted app bundle path>/Contents/Resources/<tool-2>")] Refer to App Sandbox page at https://developer.apple.com/documentation/security/app_sandbox for more information on sandboxing your app. (ID: 1cc710f6-18a3-4038-b355-fe37c39c165f)
上下文信息
- 主应用目标已通过
.entitlements文件启用App Sandbox(com.apple.security.app-sandbox = true); - 两个捆绑的辅助二进制文件为静态构建,放置在应用包内,通过
Process/NSTask执行; - 每个辅助二进制文件均已使用相同Team ID进行代码签名,应用本身签名及构建均正常。
问题解答
1. 如何正确配置捆绑可执行文件以满足要求,消除此验证错误?
嵌入式辅助工具必须单独启用App Sandbox权限,即使主应用已配置。具体操作:
- 为每个辅助工具创建独立的
.entitlements文件,文件内添加com.apple.security.app-sandbox = true; - 若在Xcode中为辅助工具创建了独立目标,在目标的
Code Signing Entitlements配置项中,指向对应的.entitlements文件; - 若未创建独立目标,需通过自定义构建脚本为辅助工具签名时指定权限文件:
codesign --force --sign "你的Team ID" --entitlements tool1.entitlements path/to/tool-1 codesign --force --sign "你的Team ID" --entitlements tool2.entitlements path/to/tool-2 - 确保签名使用与主应用一致的Team ID,且权限文件与对应工具正确关联。
2. 若需为tool-1和tool-2配置专属权限文件,正确的配置方式是什么?
每个辅助工具的权限文件需独立配置,步骤如下:
- 分别创建
tool1.entitlements和tool2.entitlements文件,采用标准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.app-sandbox</key> <true/> <!-- 添加该工具专属权限,如文件访问、网络权限等 --> <key>com.apple.security.files.user-selected.read-write</key> <true/> </dict> </plist> - 若辅助工具是Xcode独立目标,在目标的
Signing & Capabilities面板中添加App Sandbox能力,按需勾选对应权限(Xcode会自动更新.entitlements文件); - 若使用构建脚本签名,需在
codesign命令中明确指定对应工具的权限文件,如上述第1点的脚本示例。
3. 辅助工具是否需要独立于应用的权限文件和签名?若是,沙箱化macOS应用中嵌入式可执行文件的规范配置方式是什么?
是,嵌入式辅助工具需要独立的权限文件和签名,规范配置方式分为两种场景:
场景1:创建独立Xcode目标(推荐)
- 在Xcode中为每个辅助工具创建独立的命令行工具目标;
- 为每个目标启用App Sandbox能力,配置专属权限;
- 在主应用目标的
Build Phases中添加Copy Files阶段,将编译后的辅助工具复制到主应用包的Contents/Resources目录; - 确保所有目标使用相同的Team ID和签名配置,Xcode会自动处理签名与权限关联。
场景2:手动签名(无独立目标时)
- 提前编译好静态辅助工具;
- 创建对应权限文件,添加必要的沙箱权限;
- 在主应用的
Build Phases中添加Run Script阶段,执行签名脚本:TOOL1_PATH="${BUILT_PRODUCTS_DIR}/${CONTENTS_FOLDER_PATH}/Resources/tool-1" TOOL2_PATH="${BUILT_PRODUCTS_DIR}/${CONTENTS_FOLDER_PATH}/Resources/tool-2" codesign --force --sign "${EXPANDED_CODE_SIGN_IDENTITY}" --entitlements "${PROJECT_DIR}/tool1.entitlements" "${TOOL1_PATH}" codesign --force --sign "${EXPANDED_CODE_SIGN_IDENTITY}" --entitlements "${PROJECT_DIR}/tool2.entitlements" "${TOOL2_PATH}"
验证配置
归档后,可通过以下命令验证工具的签名与权限:
codesign -d --entitlements - path/to/tool-1
确认输出中包含com.apple.security.app-sandbox = true及其他配置的权限。
内容的提问来源于stack exchange,提问作者rezivor
相关产品推荐
相关产品推荐

