Repository navigation
CI: todoapp-uno / ios-maccatalyst build fails - .NET for iOS/MacCatalyst 26.5 requires Xcode 26.5, macos-latest only has Xcode 16.4 #559
Description
Summary
Surfaced on PR #557 (run 29146179948, job todoapp-uno / ios-maccatalyst). The todoapp-uno / ios-maccatalyst job fails in the Build Uno project (iOS TFM only) step with the same Xcode-version-mismatch error previously diagnosed in #529 for todoapp-avalonia / ios and todoapp-maui / ios:
/Users/runner/.dotnet/packs/Microsoft.iOS.Sdk.net10.0_26.5/26.5.10284/targets/Xamarin.Shared.Sdk.targets(2570,3): error :
This version of .NET for iOS (26.5.10284) requires Xcode 26.5. The current version of Xcode is 16.4.
Either install Xcode 26.5, or use a different version of .NET for iOS. See https://aka.ms/xcode-requirement for more information.
[/Users/runner/work/Datasync/Datasync/samples/todoapp/TodoApp.Uno/TodoApp.Uno/TodoApp.Uno.csproj::TargetFramework=net10.0-ios]
Root cause
.github/workflows/build-samples-todoapp-uno.yml's ios-maccatalyst job still runs on floating macos-latest with no pinned Xcode version and no pinned iOS workload set:
ios-maccatalyst:
# iOS and Mac Catalyst builds both require Xcode, which is only available on macOS runners.
runs-on: macos-latest
steps:
- name: Checkout Repository
uses: actions/checkout@v7
- name: Setup .NET
uses: actions/setup-dotnet@v5
with:
dotnet-version: ${{ env.DOTNET_VERSION }}
- name: Install iOS and Mac Catalyst workloads
run: dotnet workload install ios maccatalyst
- name: Restore Uno project (iOS TFM only)
run: dotnet restore ${{ env.UnoProjectFile }} -p:TargetFramework=${{ env.iOSTargetFramework }}
- name: Build Uno project (iOS TFM only)
run: >
dotnet build ${{ env.UnoProjectFile }}
-f ${{ env.iOSTargetFramework }}
--configuration ${{ env.DOTNET_CONFIGURATION }}
--no-restore
...dotnet workload install ios maccatalyst grabs whatever the latest Microsoft.iOS.Sdk.net10.0_* manifest advertises (currently 26.5, requiring Xcode 26.5), regardless of what Xcode version the macos-latest image actually ships (currently 16.4, per the same macos-15-arm64 image family diagnosed in #529).
This is the exact same class of failure as #529, which was fixed for todoapp-avalonia / ios and todoapp-maui / ios in #530 (merged 2026-07-10) by pinning the runner to macos-15, explicitly selecting an installed-but-non-default Xcode version via xcode-select, and pinning dotnet workload install ... --version <WorkloadSetVersion> to a workload set whose iOS/MacCatalyst SDK pack is compatible with that Xcode. .github/workflows/build-samples-todoapp-uno.yml existed before #530 (added in #511/#519, well before #530 merged) but wasn't included in that PR's scope, so the ios-maccatalyst job was missed and still floats on macos-latest with no pin.
Suggested fix
Apply the same pattern already used in build-samples-todoapp-avalonia.yml / build-samples-todoapp-maui.yml's ios jobs to the ios-maccatalyst job in build-samples-todoapp-uno.yml:
- Pin
runs-on: macos-15instead ofmacos-latest. - Add a
Select Xcode ${{ env.RequiredXcodeVersion }}step (sudo xcode-select -s /Applications/Xcode_${{ env.RequiredXcodeVersion }}.app) beforeSetup .NET, using the sameRequiredXcodeVersion: '26.3'known to be installed (non-default) on the currentmacos-15image. - Pin
WorkloadSetVersion: '10.0.107'and pass--version ${{ env.WorkloadSetVersion }}todotnet workload install ios maccatalyst, matching the resolvedMicrosoft.iOS.Sdk.net10.0_26.2.10233/ Xcode 26.3 pairing used by the Avalonia/MAUI jobs. - Keep both the iOS and Mac Catalyst restore/build steps in the single job as they are today, since both TFMs need the same pinned Xcode/workload set.
The exact pin values (macos-15, 26.3, 10.0.107) should be re-verified against whatever the current runner image/workload set state is at the time of the fix, in case they've drifted since #530.
To reproduce
Run the ios-maccatalyst job of .github/workflows/build-samples-todoapp-uno.yml on macos-latest as of the current runner image (Xcode 16.4 default). dotnet workload install ios maccatalyst pulls Microsoft.iOS.Sdk.net10.0_26.5 (26.5.10284), and building net10.0-ios fails with the Xcode-version-mismatch error above.
References
- Failing run: https://github.com/CommunityToolkit/Datasync/actions/runs/29146179948
- Failing job: https://github.com/CommunityToolkit/Datasync/actions/runs/29146179948/job/86528005085
- PR that surfaced it (unrelated change): docs: resolve CS1574 unresolved crefs and CS1571 duplicate param in TodoApp.BlazorWasm.Client TodoService #557
- Root-cause issue for the same failure class: CI: todoapp-avalonia / ios build fails - .NET for iOS 26.5 requires Xcode 26.5, macos-latest only has Xcode 16.4 #529
- Fix applied to Avalonia/MAUI: ci: pin iOS workload set + Xcode version for todoapp-avalonia/maui iOS builds #530
- CI workflow originally added in: Add CI workflow to build mobile /samples heads: Android, iOS, Uno (Phase 3 of #509) #511 / ci: add build-samples workflow for Phase 3 mobile heads (#511) #519 (predates ci: pin iOS workload set + Xcode version for todoapp-avalonia/maui iOS builds #530)
Activity
ci: pin iOS/Mac Catalyst workload set + Xcode version for todoapp-uno…