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

如何在Azure DevOps MAUI构建流水线中指定iOS SDK版本

问题:Azure DevOps中MAUI iOS构建无法使用iOS SDK 18

我有一个目标框架为net8.0-ios的MAUI应用,本地开发机和远程Mac上可以用Xcode 16基于iOS SDK 18正常构建,但在Azure DevOps中指定macos-14代理镜像后,构建报错提示使用的是iOS 17.5而非18.0,错误信息如下:

ILLINK : error MT2362: The linker step 'ClassHandleRewriter' failed during processing: One or more errors occurred. (The type 'MapKit.MKSelectionAccessory' (used as a return type in MapKit.MKMapView/_MKMapViewDelegate.GetSelectionAccessory) is not available in iOS 17.5 (it was introduced in iOS 18.0). Please build with a newer iOS SDK (usually done by using the most recent version of Xcode). [/Users/runner/work/1/s/App/App.csproj::TargetFramework=net8.0-ios]

查看镜像规格确认macos-14包含iOS 18和Xcode 16,当前流水线iOS阶段YAML配置如下:

- stage: publish_ios
  dependsOn: []
  condition: and(succeeded(), in(variables['Environment'], 'QA', 'Production'))
  jobs:
  - job: BuildMAUIApps
    displayName: Build
    pool:
      vmImage: 'macos-14'
      demands:
      - MSBuild

    steps:

    # Setup Secret Pipeline Variable or Library Secrets Variable for iOS Certificate Password
    - task: InstallAppleCertificate@2
      inputs:
        certSecureFile: 'iOS-Distribution.p12'
        certPwd: '$(CertificatePassword)'
        keychain: 'temp'

    - task: InstallAppleProvisioningProfile@1
      inputs:
        provisioningProfileLocation: 'secureFiles'
        provProfileSecureFile: 'app.mobileprovision'

    - task: UseDotNet@2
      displayName: install dotnet
      inputs:
        packageType: 'sdk'
        version: $(dotnetVersion)

    - task: Bash@3
      displayName: install maui
      inputs:
        targetType: 'inline'
        script: |
          dotnet nuget locals all --clear
          dotnet workload install maui --source https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet8/nuget/v3/index.json --source https://api.nuget.org/v3/index.json
          dotnet workload install ios maui wasm-tools --source https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet8/nuget/v3/index.json --source https://api.nuget.org/v3/index.json

    - task: DotNetCoreCLI@2
      displayName: 'dotnet restore'
      inputs:
        command: 'restore'
        feedsToUse: 'config'
        nugetConfigPath: 'nuget.config'
        externalFeedCredentials: 'https://pkgs.dev.azure.com/org/_packaging/org/nuget/v3/index.json'

    # https://docs.microsoft.com/en-us/dotnet/maui/ios/deployment/overview
    - task: DotNetCoreCLI@2
      displayName: 'dotnet publish'
      inputs:
        command: 'publish'
        publishWebProjects: false
        projects: '**/App.csproj'
        arguments: '--configuration $(buildConfiguration) --framework net8.0-ios -p:CodesignProvision=$(APPLE_PROV_PROFILE_UUID) -p:ArchiveOnBuild=true -p:Version=$(Build.BuildNumber) -p:ApplicationDisplayVersion=$(Build.BuildNumber) -p:ApplicationVersion=$(Build.BuildId)'

    - task: CopyFiles@2
      inputs:
        Contents: |
          **/*.app
          **/*.ipa
        TargetFolder: '$(Build.ArtifactStagingDirectory)'

    - task: PublishBuildArtifacts@1
      inputs:
        PathtoPublish: '$(Build.ArtifactStagingDirectory)'
        ArtifactName: 'ios'
        publishLocation: 'Container'

请问如何配置让Azure DevOps使用iOS SDK 18进行构建?


解决方案

1. 显式切换到Xcode 16

macos-14镜像默认可能未启用Xcode 16,需要在流水线中添加步骤切换到Xcode 16的安装路径:

在install maui任务之后、dotnet restore任务之前,添加以下Bash任务:

- task: Bash@3
  displayName: Switch to Xcode 16
  inputs:
    targetType: 'inline'
    script: |
      sudo xcode-select -s /Applications/Xcode_16.app/Contents/Developer
      xcodebuild -version

2. 在publish命令中指定iOS SDK版本

修改dotnet publish任务的arguments,添加-p:iOSSdkVersion=18.0参数,强制构建使用iOS 18 SDK:

- task: DotNetCoreCLI@2
  displayName: 'dotnet publish'
  inputs:
    command: 'publish'
    publishWebProjects: false
    projects: '**/App.csproj'
    arguments: '--configuration $(buildConfiguration) --framework net8.0-ios -p:CodesignProvision=$(APPLE_PROV_PROFILE_UUID) -p:ArchiveOnBuild=true -p:Version=$(Build.BuildNumber) -p:ApplicationDisplayVersion=$(Build.BuildNumber) -p:ApplicationVersion=$(Build.BuildId) -p:iOSSdkVersion=18.0'

3. (可选)验证SDK版本

如果需要确认当前可用的SDK版本,可以添加额外的Bash任务查看:

- task: Bash@3
  displayName: List available iOS SDKs
  inputs:
    targetType: 'inline'
    script: |
      xcodebuild -showsdks

修改后的完整流水线阶段配置如下:

- stage: publish_ios
  dependsOn: []
  condition: and(succeeded(), in(variables['Environment'], 'QA', 'Production'))
  jobs:
  - job: BuildMAUIApps
    displayName: Build
    pool:
      vmImage: 'macos-14'
      demands:
      - MSBuild

    steps:

    # Setup Secret Pipeline Variable or Library Secrets Variable for iOS Certificate Password
    - task: InstallAppleCertificate@2
      inputs:
        certSecureFile: 'iOS-Distribution.p12'
        certPwd: '$(CertificatePassword)'
        keychain: 'temp'

    - task: InstallAppleProvisioningProfile@1
      inputs:
        provisioningProfileLocation: 'secureFiles'
        provProfileSecureFile: 'app.mobileprovision'

    - task: UseDotNet@2
      displayName: install dotnet
      inputs:
        packageType: 'sdk'
        version: $(dotnetVersion)

    - task: Bash@3
      displayName: install maui
      inputs:
        targetType: 'inline'
        script: |
          dotnet nuget locals all --clear
          dotnet workload install maui --source https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet8/nuget/v3/index.json --source https://api.nuget.org/v3/index.json
          dotnet workload install ios maui wasm-tools --source https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet8/nuget/v3/index.json --source https://api.nuget.org/v3/index.json

    - task: Bash@3
      displayName: Switch to Xcode 16
      inputs:
        targetType: 'inline'
        script: |
          sudo xcode-select -s /Applications/Xcode_16.app/Contents/Developer
          xcodebuild -version

    - task: DotNetCoreCLI@2
      displayName: 'dotnet restore'
      inputs:
        command: 'restore'
        feedsToUse: 'config'
        nugetConfigPath: 'nuget.config'
        externalFeedCredentials: 'https://pkgs.dev.azure.com/org/_packaging/org/nuget/v3/index.json'

    - task: DotNetCoreCLI@2
      displayName: 'dotnet publish'
      inputs:
        command: 'publish'
        publishWebProjects: false
        projects: '**/App.csproj'
        arguments: '--configuration $(buildConfiguration) --framework net8.0-ios -p:CodesignProvision=$(APPLE_PROV_PROFILE_UUID) -p:ArchiveOnBuild=true -p:Version=$(Build.BuildNumber) -p:ApplicationDisplayVersion=$(Build.BuildNumber) -p:ApplicationVersion=$(Build.BuildId) -p:iOSSdkVersion=18.0'

    - task: CopyFiles@2
      inputs:
        Contents: |
          **/*.app
          **/*.ipa
        TargetFolder: '$(Build.ArtifactStagingDirectory)'

    - task: PublishBuildArtifacts@1
      inputs:
        PathtoPublish: '$(Build.ArtifactStagingDirectory)'
        ArtifactName: 'ios'
        publishLocation: 'Container'

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 18:44:58