非App Store分发的macOS多Target签名与公证问题
macOS多Target应用Developer ID分发签名问题解决指南
核心问题梳理
- Developer ID分发仅主App Target需要对应Bundle ID的Provisioning Profile,库(Framework)、Extension等附属Target无需单独配置文件,仅需同一团队的Developer ID证书签名。
- Azure DevOps的Xcode任务默认会给所有Target强制应用配置文件,导致Bundle ID不匹配或附属组件签名错误。
- 直接用
--deep递归签名xcarchive会丢失Hardened Runtime配置,导致公证失败。
步骤1:修正Azure DevOps签名配置
方式A:通过Xcode项目预设签名规则
- 打开Xcode项目,进入主App Target的
Signing & Capabilities:- 选择
Manual Signing,指定对应的Developer ID Application证书和Provisioning Profile。
- 选择
- 进入库、Extension等附属Target的
Signing & Capabilities:- 选择
Manual Signing,仅指定团队ID和Developer ID Application证书,将Provisioning Profile设置为None。
- 选择
- 将项目提交到版本库,Azure DevOps任务使用
Automatic签名选项即可自动遵循项目预设的签名规则。
方式B:在Azure DevOps任务中显式指定
如果必须用手动签名任务:
- 使用
Xcode@5任务,设置signingOption: 'manual'。 - 仅为主App Target配置
provisioningProfileUuid(对应Developer ID配置文件的UUID)。 - 通过
args参数传递额外签名参数,覆盖附属Target的配置文件要求:- task: Xcode@5 inputs: actions: 'archive' scheme: 'YourMainAppScheme' signingOption: 'manual' provisioningProfileUuid: '主App配置文件UUID' args: '-destination "generic/platform=macOS" OTHER_CODE_SIGN_FLAGS="--no-provisioning-profile" CODE_SIGN_IDENTITY="Developer ID Application: XYZ XYZ (TEAM ID)"'
步骤2:正确的重新签名流程(解决Hardened Runtime失效问题)
不要直接对整个xcarchive签名,需逐个签名组件后再打包:
提取归档中的App包
# 创建临时目录 mkdir -p SigningTemp cp -r XYZ.xcarchive/Products/Applications/YourMainApp.app SigningTemp/签名附属组件(按依赖顺序)
- 签名Framework(如果有):
codesign --force --option runtime --sign "Developer ID Application: XYZ XYZ (TEAM ID)" SigningTemp/YourMainApp.app/Contents/Frameworks/YourFramework.framework - 签名Extension:
codesign --force --option runtime --sign "Developer ID Application: XYZ XYZ (TEAM ID)" SigningTemp/YourMainApp.app/Contents/PlugIns/FilterCamExt.appex
- 签名Framework(如果有):
签名主App
codesign --force --option runtime --sign "Developer ID Application: XYZ XYZ (TEAM ID)" SigningTemp/YourMainApp.app验证签名配置
执行命令检查Hardened Runtime是否生效:codesign -d --verbose=4 SigningTemp/YourMainApp.app输出中需包含
flags=0x10000(runtime),表示Hardened Runtime已启用。打包并提交公证
# 压缩App包 ditto -c -k --sequesterRsrc --keepParent SigningTemp/YourMainApp.app YourMainApp.zip # 提交公证 xcrun altool --notarize-app --primary-bundle-id "com.xyz.YourMainApp" --username "你的Apple ID" --password "App专用密码" --file YourMainApp.zip
关键注意事项
- 所有Target必须在Xcode中开启Hardened Runtime(
Signing & Capabilities面板中勾选),并配置必要的Entitlements(如Extension需特定权限时,需在Entitlements文件中声明)。 - 避免使用
--deep参数递归签名,该参数可能破坏组件原有签名配置,导致Hardened Runtime不生效。 - 确保所有组件使用同一团队的Developer ID Application证书签名,否则公证会失败。
内容的提问来源于stack exchange,提问作者SwiftDev19
相关产品推荐
相关产品推荐

