You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

非App Store分发的macOS多Target签名与公证问题

macOS多Target应用Developer ID分发签名问题解决指南

核心问题梳理

  1. Developer ID分发仅主App Target需要对应Bundle ID的Provisioning Profile,库(Framework)、Extension等附属Target无需单独配置文件,仅需同一团队的Developer ID证书签名。
  2. Azure DevOps的Xcode任务默认会给所有Target强制应用配置文件,导致Bundle ID不匹配或附属组件签名错误。
  3. 直接用--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签名,需逐个签名组件后再打包:

  1. 提取归档中的App包

    # 创建临时目录
    mkdir -p SigningTemp
    cp -r XYZ.xcarchive/Products/Applications/YourMainApp.app SigningTemp/
    
  2. 签名附属组件(按依赖顺序)

    • 签名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
      
  3. 签名主App

    codesign --force --option runtime --sign "Developer ID Application: XYZ XYZ (TEAM ID)" SigningTemp/YourMainApp.app
    
  4. 验证签名配置
    执行命令检查Hardened Runtime是否生效:

    codesign -d --verbose=4 SigningTemp/YourMainApp.app
    

    输出中需包含flags=0x10000(runtime),表示Hardened Runtime已启用。

  5. 打包并提交公证

    # 压缩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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 03:03:17