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

Azure DevOps中Flutter导出IPA流水线的两个技术问题

两个iOS CI/CD相关技术问题

问题1:InstallAppleCertificate与InstallAppleProvisioningProfile任务的变量覆盖问题

若使用InstallAppleCertificate任务安装多个证书,APPLE_CERTIFICATE_SIGNING_IDENTITY变量会存储哪个值?若重复使用InstallAppleProvisioningProfile任务,对应的变量又会如何?

解答

  • 对于InstallAppleCertificate任务:多次执行时,APPLE_CERTIFICATE_SIGNING_IDENTITY变量会被最后一次执行的任务覆盖,仅保留最后安装证书的签名身份值。
  • 对于InstallAppleProvisioningProfile任务:重复执行时,APPLE_PROV_PROFILE_UUID和APPLE_PROV_PROFILE_NAME同样会被最后一次执行的任务覆盖,只保留最后安装的配置文件的UUID和名称。

如果需要同时使用多个证书或配置文件,不要依赖任务自动设置的变量,建议手动指定每个证书/配置文件的标识,或在后续任务中通过文件路径直接引用。


问题2:导出IPA时xcodebuild返回码65的错误排查

尝试导出IPA时遇到错误:

##[error]Error: /usr/bin/xcodebuild failed with return code: 65

已安装Flutter、证书和配置文件,并尝试了以下几种证书与配置文件组合及任务配置,但均出现相同错误:

  • 搭配Apple Distribution Certificate的App Store配置文件
  • 搭配iOS Distribution (App Store and Ad Hoc) Certificate的Ad Hoc配置文件
  • 搭配Apple Development Certificate的iOS App Development配置文件

尝试的任务配置如下:

- task: FlutterBuild@0
     displayName: 'Flutter Build ios'
     inputs:
       target: 'ios'
       projectDirectory: '$(Build.SourcesDirectory)'
       buildName: '$(Build.BuildNumber)'
       iosCodesign: false

   - task: Xcode@5
     condition: true
     inputs:
       actions: 'archive' 
       sdk: 'iphoneos'
       scheme: 'Runner'
       configuration: 'Release'
       archivePath: '**/build/ios/Runner.xcarchive'
       exportPath: '**/build/ios'
       packageApp: true
       xcWorkspacePath: '**/Runner.xcworkspace' 
       signingOption: 'nosign'

   - task: Xcode@5
     condition: true
     inputs:
       actions: 'archive'
       xcWorkspacePath: '**/Runner.xcworkspace' 
       scheme: 'Runner'
       sdk: 'iphoneos'
       configuration: 'Release'
       packageApp: true
       exportOptions: 'plist'
       exportOptionsPlist: '**/build/ios/exportOptions.plist'
       signingOption: 'manual'
       signingIdentity: '$(APPLE_CERTIFICATE_SIGNING_IDENTITY)'
       provisioningProfileUuid: '$(APPLE_PROV_PROFILE_UUID)'

   - task: Xcode@5
     condition: true
     displayName: 'Export ipa'
     inputs:
       actions: 'archive'     
       scheme: 'Runner'
       packageApp: true
       sdk: 'iphoneos'
       configuration: 'release'    
       workingDirectory: 'ios'
       exportOptions: 'auto'
       provisioningProfileUuid: $(APPLE_PROV_PROFILE_UUID)
       signingOption: 'manual'
       signingIdentity:  $(APPLE_CERTIFICATE_SIGNING_IDENTITY)
       archivePath: ios/build/Runner.xcarchive
       exportPath: ios/build
       teamId: 'my team id'
       xcWorkspacePath: ios/Runner.xcworkspace
       args: '-verbose' 


   - task: Bash@3
     condition: true
     inputs:
       targetType: 'inline'
       script: |
         xcodebuild -workspace ios/Runner.xcworkspace -scheme Runner -sdk iphoneos -configuration Release archive -archivePath build/ios/Runner.xcarchive
         xcodebuild -exportArchive -archivePath build/ios/Runner.xcarchive -exportOptionsPlist ios/exportOptions.plist -exportPath build/ios/App/

最后一个任务的错误信息为:

/Users/runner/work/1/s/ios/Runner.xcodeproj: error: No profiles for 'com.myapp.comp' were found: Xcode couldn't find any iOS App Development provisioning profiles matching 'com.myapp.comp'. Automatic signing is disabled and unable to generate a profile. To enable automatic signing, pass -allowProvisioningUpdates to xcodebuild. (in target 'Runner' from project 'Runner')

错误分析

返回码65本质是签名/配置文件不匹配问题。从错误信息看,核心原因是Xcode找不到与Bundle ID com.myapp.comp匹配的配置文件,且自动签名已禁用,无法自动生成新配置文件。

解决方案

  1. 验证配置文件与Bundle ID的匹配性
    登录Apple开发者后台,确认创建的配置文件包含的App ID与com.myapp.comp完全匹配(包括通配符规则),同时确保配置文件已关联你安装的对应证书。

  2. 简化并修正Xcode任务配置
    你的任务中存在多次重复执行archive操作的问题,会导致签名状态冲突。建议简化流程,用单次Xcode任务完成归档+导出:

    - task: FlutterBuild@0
      displayName: 'Flutter Build ios'
      inputs:
        target: 'ios'
        projectDirectory: '$(Build.SourcesDirectory)'
        buildName: '$(Build.BuildNumber)'
        iosCodesign: false
    
    - task: Xcode@5
      displayName: 'Archive and Export IPA'
      inputs:
        actions: 'archive'
        xcWorkspacePath: '**/Runner.xcworkspace'
        scheme: 'Runner'
        sdk: 'iphoneos'
        configuration: 'Release'
        archivePath: 'ios/build/Runner.xcarchive'
        exportPath: 'ios/build'
        packageApp: true
        signingOption: 'manual'
        signingIdentity: '$(APPLE_CERTIFICATE_SIGNING_IDENTITY)'
        provisioningProfileUuid: '$(APPLE_PROV_PROFILE_UUID)'
        teamId: 'your-team-id'
        args: '-verbose'
    

    注意:避免混合使用nosign和manual签名选项,确保所有签名参数与安装的证书、配置文件一一对应。

  3. 检查Runner项目的本地签名设置
    打开iOS目录下的Runner.xcodeproj,确认Build Settings中的签名配置:

    • 将Code Signing Identity设置为对应证书名称(如Apple Development: XXX)
    • 将Provisioning Profile设置为匹配的配置文件名称,或留空让CI任务参数覆盖
    • 确保Automatically manage signing已关闭(与手动签名模式匹配)
  4. Bash任务的补充处理
    如果坚持使用Bash任务执行xcodebuild,可按错误提示添加-allowProvisioningUpdates参数(需CI环境账号有自动管理配置文件的权限):

    xcodebuild -workspace ios/Runner.xcworkspace -scheme Runner -sdk iphoneos -configuration Release archive -archivePath build/ios/Runner.xcarchive -allowProvisioningUpdates
    xcodebuild -exportArchive -archivePath build/ios/Runner.xcarchive -exportOptionsPlist ios/exportOptions.plist -exportPath build/ios/App/ -allowProvisioningUpdates
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 12:26:34