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

使用Fastlane构建iOS IPA时App.framework签名失败求助

Fastlane构建iOS IPA时App.framework签名失败(Jenkins环境异常)

环境详情

  • Flutter 3.7.6
  • Xcode 14.2
  • Fastlane

Fastlane脚本片段

# 1. 使用match生成证书和描述文件[代码未展示]

# 2. 禁用自动签名
disable_automatic_code_signing(path: "Runner.xcodeproj")

# 3. 设置手动签名
update_code_signing_settings(
      build_configurations: configuration,
      use_automatic_signing: false,
      profile_name: profileName,
      team_id: ENV['IOS_TEAM_ID'],
      code_sign_identity: "iPhone Distribution"
    ) 

# 4. 执行无签名的Flutter构建IPA命令
sh_on_root(command: "export LANG=en_US.UTF-8 && export PATH=$PATH:/usr/local/bin && flutter build ipa #{params} --no-codesign")

# 5. 生成IPA
build_app(
      output_directory: "#{root_path}/build/ios",
      build_path: "#{root_path}/build/ios",
      archive_path: "#{root_path}/build/ios/archive/Runner.xcarchive",
      export_method: method,
      scheme: env,
      configuration: configuration,   
      skip_build_archive: true,  
      workspace: "Runner.xcworkspace",
      export_options: {
        signingStyle: "manual",
        provisioningProfiles: profileMap,  
        teamID: ENV['IOS_TEAM_ID'],
        signingCertificate: "Apple Distribution",
        compileBitcode: false      
      } 
    )

报错信息

Error Domain=IDEDistributionPipelineErrorDomain Code=0 "Code signing \"App.framework\" failed." UserInfo={NSLocalizedDescription=Code signing "App.framework" failed., NSLocalizedRecoverySuggestion=View distribution logs for more information.}

已尝试的操作

  • 打开Xcode项目检查签名配置,相同设置下Xcode归档正常
  • 终端手动执行flutter build ipa可正常完成,仅需添加ExportOptions.plist文件
  • 调整Podfile以避免签名设置冲突

关键更新

CD机器终端直接执行lane命令正常,但通过Jenkins执行时出现签名失败问题。


解决方案建议

1. 检查Jenkins执行环境的证书权限

Jenkins运行用户(通常为jenkins)可能无钥匙串证书访问权限:

  • 在Jenkins节点的钥匙串中,给Apple Distribution证书及对应私钥设置允许所有应用程序访问权限
  • 在fastlane脚本开头添加钥匙串解锁命令:
    unlock_keychain(
      path: ENV['KEYCHAIN_PATH'] || "~/Library/Keychains/login.keychain-db",
      password: ENV['KEYCHAIN_PASSWORD']
    )
    
  • 确认~/.match目录(match生成的证书/描述文件存储路径)对Jenkins用户有读写权限

2. 统一Jenkins环境变量与路径

Jenkins环境变量常与终端用户不一致:

  • 在Jenkins构建任务中显式配置PATH,确保包含Flutter、Xcode命令行工具路径:
    export PATH="$PATH:/usr/local/bin:/Applications/Xcode.app/Contents/Developer/usr/bin"
    
  • 确认IOS_TEAM_ID等环境变量在Jenkins中正确配置并能被fastlane读取

3. 调整构建流程,让Xcode负责完整签名

拆分Flutter无签名构建+fastlane签名的方式易引发冲突,可改为让fastlane触发完整构建:

  • 移除flutter build ipa --no-codesign步骤,修改build_app配置:
    build_app(
      # 保留原有输出、导出等配置
      skip_build_archive: false,
      pre_build_script: "flutter build ios #{params} --release"
    )
    

4. 清理构建缓存

Jenkins工作空间的旧缓存可能导致签名冲突:

  • 在fastlane脚本开头添加清理命令:
    sh("flutter clean")
    sh("rm -rf build/ios")
    sh("pod deintegrate && pod install")
    
  • 开启Jenkins构建任务的"清理工作空间"选项

5. 查看详细签名日志

在build_app中添加日志参数,定位具体失败原因:

build_app(
  # 保留原有配置
  verbose: true,
  xcargs: "-verbose"
)

通过Jenkins日志中的详细签名输出,排查证书缺失、描述文件不匹配或权限问题


内容的提问来源于stack exchange,提问作者Iducool

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 11:22:40