Azure DevOps中Flutter导出IPA流水线的两个技术问题
问题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匹配的配置文件,且自动签名已禁用,无法自动生成新配置文件。
解决方案
验证配置文件与Bundle ID的匹配性
登录Apple开发者后台,确认创建的配置文件包含的App ID与com.myapp.comp完全匹配(包括通配符规则),同时确保配置文件已关联你安装的对应证书。简化并修正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签名选项,确保所有签名参数与安装的证书、配置文件一一对应。检查Runner项目的本地签名设置
打开iOS目录下的Runner.xcodeproj,确认Build Settings中的签名配置:- 将
Code Signing Identity设置为对应证书名称(如Apple Development: XXX) - 将
Provisioning Profile设置为匹配的配置文件名称,或留空让CI任务参数覆盖 - 确保
Automatically manage signing已关闭(与手动签名模式匹配)
- 将
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

