Status as of Oct 6, 2026
Xcode 27.0 is the one to use
The newest .NET for iOS (27.0.10722, .NET 10) requires Xcode 27.0, which is also Apple's latest release. Update Xcode and your MAUI workloads together, as a pair — updating only one of them breaks iOS builds.
- Xcode
- 27.0
- .NET / MAUI
- .NET 10 · MAUI 10.0.110+
- Workload set
- 10.0.401.1
- .NET for iOS
- 27.0.10722
- Needs macOS
- 26.6+
dotnet workload install maui --version 10.0.401.1
Xcode 27.1 RC 1 is out. Betas are never supported by a stable workload — install betas side by side and don't make them your selected Xcode.
Source: .NET for iOS release notes, Sep 29, 2026 · Apple's latest Xcode: 27.0 (Sep 14, 2026)
The rule
Every .NET for iOS workload release requires exactly one Xcode version. Only the first two numbers (major.minor) have to match: 26.6 and 26.6.1 match, but 26.5 and 26.6 don't. If they don't match, the build stops with error E0191.
The requirement comes from the iOS and Mac Catalyst workloads (dotnet/macios) that MAUI builds on. MAUI itself is just a NuGet package. So the question is really "which workload do I have installed?", not "which MAUI version am I on?"
Apple ships a new Xcode first, and Microsoft ships a matching workload days or weeks later. If Xcode auto-updates during that gap, iOS builds break. It can also go the other way: running dotnet workload update can install a workload that needs a newer Xcode than the one you have.
Just never updating Xcode doesn't work anymore. Since April 28, 2026, the App Store only accepts iOS apps built with Xcode 26 or later (Apple). Always update Xcode and the workload together, as a matched pair.
Support matrix
The newest .NET for iOS release for each .NET version, and the Xcode it requires. Data comes from the official release notes.
| .NET | MAUI support | Requires Xcode | Needs macOS | Workload set | .NET for iOS | Released |
|---|---|---|---|---|---|---|
| .NET 11 | Preview | 26.6 | 26.2+ | 11.0.100-rc.1.26458.5 |
26.5.12193-net11-rc.1 | Sep 8, 2026 |
| .NET 10 | Supported until May 11, 2027 | 27.0 | 26.6+ | 10.0.401.1 |
27.0.10722 | Sep 29, 2026 |
| .NET 9 | Out of support since May 12, 2026 | 26.5 | 26.2+ | 9.0.314.3 |
26.5.9002 | May 21, 2026 |
| .NET 8 | Out of support since May 14, 2025 | 16.0 | 14.5+ | — |
18.0.8319 | Dec 19, 2024 |
Find your pair: "I have Xcode X. Which workload set do I install?"
Use this table when you can't (or don't want to) change Xcode. Each row is the newest stable workload set that supports that Xcode version. The workload set must match your installed .NET SDK band: a 10.0.4xx SDK can only install 10.0.4xx workload sets. Check yours with dotnet --version.
| Your Xcode | .NET | Workload set to install | .NET SDK | .NET for iOS | Released |
|---|---|---|---|---|---|
| 27.0 | .NET 10 | 10.0.401.1 |
10.0.401 | 27.0.10722 | Sep 29, 2026 |
| 26.6 | .NET 10 | 10.0.401 |
10.0.401 | 26.5.10318 | Sep 8, 2026 |
| 26.5 | .NET 10 | 10.0.300.3 |
10.0.300 | 26.5.10284 | May 21, 2026 |
| 26.5 | .NET 9 | 9.0.314.3 |
9.0.314 | 26.5.9002 | May 21, 2026 |
| 26.4 | .NET 10 | 10.0.203.1 |
10.0.203 | 26.4.10259 | May 5, 2026 |
| 26.4 | .NET 9 | 9.0.313.1 |
9.0.313 | 26.4.9015 | May 5, 2026 |
| 26.3 | .NET 10 | 10.0.202 |
10.0.202 | 26.2.10233 | Apr 15, 2026 |
| 26.3 | .NET 9 | 9.0.313 |
9.0.313 | 26.2.9008 | Apr 15, 2026 |
| 26.2 | .NET 10 | 10.0.200 |
10.0.200 | 26.2.10217 | Mar 11, 2026 |
| 26.2 | .NET 9 | 9.0.312 |
9.0.312 | 26.2.9000 | Mar 11, 2026 |
| 26.1 | .NET 10 | 10.0.101 |
10.0.101 | 26.1.10502 | Dec 9, 2025 |
| 26.0 | .NET 10 | 10.0.100 |
10.0.100 | 26.0.11017 | Nov 11, 2025 |
| 26.0 | .NET 9 | 9.0.311 |
9.0.311 | 26.0.9785 | Feb 10, 2026 |
| 16.4 | .NET 9 | 9.0.305 |
9.0.305 | 18.5.9219 | Sep 9, 2025 |
| 16.3 | .NET 9 | 9.0.203 |
9.0.203 | 18.4.9288 | Apr 8, 2025 |
| 16.2 | .NET 9 | 9.0.202 |
9.0.202 | 18.2.9180 | Feb 20, 2025 |
| 16.1 | .NET 9 | 9.0.101.1 |
9.0.101 | 18.1.9163 | Nov 26, 2024 |
| 16.0 | .NET 8 | 8.0.402.1 |
8.0.402+ | 18.0.8303 | Sep 26, 2024 |
Then run: dotnet workload install maui --version <workload set>. To pin that choice, see fix 4.
All 41 stable .NET for iOS releases since .NET 8
| Released | .NET | Requires Xcode | Needs macOS | .NET for iOS | Workload set |
|---|---|---|---|---|---|
| 2026-09-29 | .NET 10 | 27.0 | 26.6+ | 27.0.10722 | 10.0.401.1 |
| 2026-09-08 | .NET 10 | 26.6 | 26.2+ | 26.5.10318 | 10.0.401 |
| 2026-08-04 | .NET 10 | 26.6 | 26.2+ | 26.5.10315 | 10.0.302.1 |
| 2026-07-15 | .NET 10 | 26.6 | 26.2+ | 26.5.10301 | 10.0.302.0 |
| 2026-05-21 | .NET 9 | 26.5 | 26.2+ | 26.5.9002 | 9.0.314.3 |
| 2026-05-21 | .NET 10 | 26.5 | 26.2+ | 26.5.10284 | 10.0.300.3 |
| 2026-05-18 | .NET 9 | 26.5 | 26.2+ | 26.5.9001 | 9.0.314.2 |
| 2026-05-18 | .NET 10 | 26.5 | 26.2+ | 26.5.10280 | 10.0.300.2 |
| 2026-05-05 | .NET 9 | 26.4 | 26.2+ | 26.4.9015 | 9.0.313.1 |
| 2026-05-05 | .NET 10 | 26.4 | 26.2+ | 26.4.10259 | 10.0.203.1 |
| 2026-04-15 | .NET 9 | 26.3 | 15.6+ | 26.2.9008 | 9.0.313 |
| 2026-04-15 | .NET 10 | 26.3 | 15.6+ | 26.2.10233 | 10.0.202 |
| 2026-03-11 | .NET 9 | 26.2 | 15.6+ | 26.2.9000 | 9.0.312 |
| 2026-03-11 | .NET 10 | 26.2 | 15.6+ | 26.2.10217 | 10.0.200 |
| 2026-02-10 | .NET 9 | 26.0 | 15.6+ | 26.0.9785 | 9.0.311 |
| 2026-02-10 | .NET 10 | 26.2 | 15.6+ | 26.2.10197 | 10.0.103 |
| 2026-02-10 | .NET 10 | 26.2 | 15.6+ | 26.2.10196 | — |
| 2025-12-16 | .NET 9 | 26.0 | 15.6+ | 26.0.9783 | 9.0.308.2 |
| 2025-12-16 | .NET 10 | 26.2 | 15.6+ | 26.2.10191 | 10.0.101.1 |
| 2025-12-09 | .NET 9 | 26.0 | 15.6+ | 26.0.9777 | 9.0.308.1 |
| 2025-12-09 | .NET 10 | 26.1 | 15.6+ | 26.1.10502 | 10.0.101 |
| 2025-11-11 | .NET 9 | 26.0 | 15.6+ | 26.0.9769 | 9.0.307.1 |
| 2025-11-11 | .NET 9 | 26.0 | 15.6+ | 26.0.9766 | 9.0.307 |
| 2025-11-11 | .NET 10 | 26.1 | 15.6+ | 26.1.10494 | 10.0.100.1 |
| 2025-11-11 | .NET 10 | 26.0 | 15.6+ | 26.0.11017 | 10.0.100 |
| 2025-10-15 | .NET 9 | 26.0 | 15.6+ | 26.0.9752 | 9.0.306 |
| 2025-10-15 | .NET 9 | 16.4 | 15.3+ | 18.5.9227 | — |
| 2025-09-09 | .NET 9 | 16.4 | 15.3+ | 18.5.9219 | 9.0.305 |
| 2025-08-06 | .NET 9 | 16.4 | 15.3+ | 18.5.9215 | 9.0.304 |
| 2025-08-06 | .NET 9 | 16.4 | 15.3+ | 18.5.9214 | 9.0.303.1 |
| 2025-07-09 | .NET 9 | 16.4 | 15.3+ | 18.5.9207 | 9.0.302.0 |
| 2025-06-17 | .NET 9 | 16.4 | 15.3+ | 18.5.9199 | 9.0.301.1 |
| 2025-04-08 | .NET 9 | 16.3 | 15.2+ | 18.4.9288 | 9.0.203 |
| 2025-02-20 | .NET 9 | 16.2 | 14.5+ | 18.2.9180 | 9.0.202 |
| 2025-01-27 | .NET 9 | 16.2 | 14.5+ | 18.2.9173 | 9.0.102.1 |
| 2024-12-19 | .NET 9 | 16.2 | 14.5+ | 18.2.9170 | 9.0.101.2 |
| 2024-12-19 | .NET 8 | 16.0 | 14.5+ | 18.0.8319 | — |
| 2024-11-26 | .NET 9 | 16.1 | 14.5+ | 18.1.9163 | 9.0.101.1 |
| 2024-11-26 | .NET 8 | 16.0 | 14.5+ | 18.0.8316 | — |
| 2024-11-13 | .NET 8 | 16.0 | 14.5+ | 18.0.8314 | — |
| 2024-09-26 | .NET 8 | 16.0 | 14.5+ | 18.0.8303 | 8.0.402.1 |
The error you're probably seeing
error : This version of .NET for iOS (26.2.10197) requires Xcode 26.2. The current version of Xcode is 26.3. Either install Xcode 26.2, or use a different version of .NET for iOS. See https://aka.ms/xcode-requirement for more information.
The platform in the message can also be Mac Catalyst, tvOS or macOS. Older workloads show a different wording:
This version of Microsoft.iOS requires the iOS 18.4 SDK (shipped with Xcode 16.3). The current version of Xcode is 16.2.
Read it like this: the workload you have installed (the number in parentheses) needs Xcode A, but the selected Xcode is B. Either select Xcode A, or install the workload that goes with B.
How to fix it
-
See which pair you actually have
Find your workload in the table above or in the release notes to see which Xcode it needs.xcodebuild -version # the Xcode the build will use xcode-select -p # where it lives dotnet --version # .NET SDK (decides which workload sets you can install) dotnet workload --version # installed workload set dotnet workload --info # exact iOS / Mac Catalyst workload versions -
Match Xcode to your workload (usually the easiest fix)
You can have several Xcode versions installed side by side. Download the one you need from Apple Developer Downloads, or use xcodes / Xcodes.app. Give each copy its own name, like
Xcode_26.6.app, before you open it for the first time. Renaming it afterwards causes strange problems. Then either switch the system-wide Xcode:
or pick the Xcode for a single build without changing the system default:sudo xcode-select --switch /Applications/Xcode_26.6.appdotnet build -f net10.0-ios -p:XcodeLocation=/Applications/Xcode_26.6.appXcodeLocationalso works as an environment variable, which is handy on CI. -
Match your workload to Xcode
Look up your Xcode in the table above and install that workload set:
If you need a workload set from a newer SDK band, install that .NET SDK first.dotnet workload install maui --version 10.0.401 -
Pin it so it stays fixed
Add a
global.jsonto the repo so every machine and CI agent uses the same SDK and workloads:
With this file in place,{ "sdk": { "version": "10.0.401", "workloadVersion": "10.0.401.1" } }dotnet workload install,updateandrestoreuse the pinned version and ignore--version. Commit this file and update it whenever you move to a new Xcode. -
Skip the check stopgap only
or<PropertyGroup> <ValidateXcodeVersion>false</ValidateXcodeVersion> </PropertyGroup>-p:ValidateXcodeVersion=falseon the command line. Developers report this usually works when the Xcode version is only one minor release off, including App Store uploads. But Microsoft says using a different Xcode is unsupported "even if there are no build errors", and it doesn't give you any of the new Xcode's APIs. Remove it once matching support ships. - Prevent it On every Mac that builds MAUI apps, turn off System Settings → General → Software Update → Automatic Updates → Install application updates from the App Store. When an update is due, update Xcode and the workload together, using this page.
Gotchas
dotnet workload updatecan break you too- Without
--versionor a pinnedglobal.json, it jumps to the newest workload set. That set may need a newer Xcode than you have. In "manifests" update mode,dotnet workload restoredoes the same thing. Check your mode withdotnet workload config --update-mode. - Hidden settings can override
xcode-select ~/Library/Preferences/Xamarin/Settings.plistand~/Library/Preferences/maui/Settings.plist(theAppleSdkRootkey), and theMD_APPLE_SDK_ROOTenvironment variable, all take priority overxcode-select. They're leftovers from Visual Studio for Mac and are deprecated. If the build keeps finding the "wrong" Xcode, delete them.- Xcode needs a minimum macOS
- Some new Xcode versions need a newer macOS (see the "Needs macOS" column). If your Mac can't run that macOS, you're stuck on an older workload until you get new hardware.
- Physical test devices
- If a test iPhone updates to an iOS version newer than your Xcode supports, deploying to it fails even though the build succeeds. Keep test devices in step with Xcode, or turn off their automatic updates too.
- Windows + Pair to Mac
- When you build from Visual Studio on Windows, the check runs against the Xcode on the remote Mac. Rented and shared build Macs that auto-update Xcode will break your Windows builds without warning. Find out which Xcode the Mac has and match your workloads to it.
- CI runners change Xcode on their own schedule
- Hosted macOS images (GitHub Actions, Azure Pipelines) change their default Xcode without warning you. In the pipeline, select Xcode explicitly (
sudo xcode-select -s /Applications/Xcode_26.6.apporXcodeLocation) and pin the workload set inglobal.json. - Xcode betas and .NET previews
- Stable workloads never support Xcode betas, so install betas side by side and don't select them. Previews of the next .NET version often need a different Xcode than the current stable release.
- Visual Studio for Mac is gone
- Microsoft retired it on August 31, 2024. On a Mac, use VS Code with the .NET MAUI extension, or JetBrains Rider. Both use the same command-line workloads and Xcode selection described here.
- Old MAUI versions are out of support
- .NET MAUI 8 support ended on May 14, 2025, and MAUI 9 support ended on May 12, 2026. MAUI 10 is supported until May 11, 2027 (policy). Also, an old MAUI version can't produce App Store builds once it no longer supports a current Xcode.
How long does the gap last?
The number of days between Apple releasing an Xcode version and Microsoft shipping a .NET for iOS release that supports it. During this gap, the safe choice is to wait.
| Xcode | Apple released | .NET support shipped | Gap |
|---|---|---|---|
| 27.0 | Sep 14, 2026 | Sep 29, 2026 | 15 days |
| 26.6 | Jun 25, 2026 | Jul 15, 2026 | 20 days |
| 26.5 | May 11, 2026 | May 18, 2026 | 7 days |
| 26.4 | Mar 24, 2026 | May 5, 2026 | 42 days |
| 26.3 | Feb 26, 2026 | Apr 15, 2026 | 48 days |
| 26.2 | Dec 12, 2025 | Dec 16, 2025 | 4 days |
| 26.1 | Nov 3, 2025 | Nov 11, 2025 | 8 days |
| 26.0 | Sep 15, 2025 | Oct 15, 2025 | 30 days |
FAQ
Is it safe to update Xcode?
Only if the latest .NET for iOS release says it requires that exact Xcode version. The status box at the top of this page checks this for you every day. If it says to wait, install the new Xcode side by side and keep the supported one selected.
Does the MAUI NuGet version (e.g. 10.0.110) decide the Xcode version?
No. The Xcode requirement comes from the iOS / Mac Catalyst workload installed with your .NET SDK. Microsoft's release notes sometimes recommend a minimum MAUI version to use alongside a workload, but the Xcode check itself only looks at the workload.
Do I need to match patch versions, like 26.6.1?
No. The build only compares major.minor. Any Xcode 26.6.x works with a workload that requires Xcode 26.6.
Can I stay on an old Xcode forever?
Not if you ship to the App Store. Apple raises the minimum SDK every spring. Since April 28, 2026, uploads must be built with Xcode 26 or later. Your app's minimum iOS version (deployment target) can stay lower; the rule is only about which Xcode you build with.
Does this affect Android or Windows builds?
No. Only iOS, Mac Catalyst, tvOS and macOS targets check the Xcode version. If you're blocked, you can still build the Android and Windows targets with -f net10.0-android or -f net10.0-windows10.0.19041.0.
Is there an API or machine-readable version of this page?
Yes. /compat.json has all the data, and /llms.txt is a plain-text summary written for AI assistants. Both refresh automatically with the page.
About this data
A scheduled job reads the dotnet/macios release notes once a day. Every release states "Xcode X is required with this release", along with the workload set and minimum macOS. The job also reads Apple's Xcode release history from xcodereleases.com, so it can tell when Apple has shipped an Xcode that .NET doesn't support yet. Last checked: .
Microsoft's own explainer is Xcode requirement – .NET for iOS. If this page and the release notes ever disagree, the release notes win.
I built this site when MAUI first came out, because Xcode auto-updates kept breaking builds. I have no affiliation with Microsoft or Apple. I'm just a big fan of MAUI, and I want it to be easy for other developers to know whether it's safe to update.
Need help?
Do you need help with a MAUI project, or with moving a Xamarin app to MAUI? As a mobile consultant, I've helped companies like Bain, EY, IMSA, and the IRS build apps in Xamarin and MAUI over the last decade. Episode 91 of the Microsoft Xamarin Podcast was about my work on the LivePerson mobile app.
I can help with anything from a one-hour screen-share session to putting together a team that builds a full mobile app and .NET backend: brad@fweem.com