Apple platform
iOS
Framework version
net10.0-*
Affected platform version
- Windows 11, Visual Studio Enterprise 2026 18.8.12023.21 (release channel), .NET MAUI Tools 18.7.15, messaging/IDB agents 26.2.10191
- .NET SDK 10.0.302, solution
global.json pins "workloadVersion": "10.0.302.1" (resolves the ios workload to manifest 26.5.10315)
- Mac build host: Xcode 26.6
Description
When a solution pins a workload set in global.json that is newer than the iOS tooling bundled in Visual Studio, Pair to Mac can never connect successfully:
- The local Windows build correctly uses the pinned workload set, so the project resolves to the
net10.0-ios 26.5 band and needs the pack Microsoft.iOS.Sdk.net10.0_26.5 version 26.5.10315 on the Mac.
- Pair to Mac provisioning ignores
global.json entirely. It generates its rollback file from the versions bundled with the VS instance and installs microsoft.net.sdk.ios 26.2.10191 on the Mac.
- The final server validation then checks for
packs/Microsoft.iOS.Sdk.net10.0_26.5/26.5.10315/ on the Mac, does not find it, and the connection is dropped with:
The connection cannot continue because the remote iOS SDK was not found or is corrupted. If the issue persists, please try removing the `~/Library/Caches/Xamarin/XMA/SDKs/dotnet/` folder on the Mac and try again
The suggested remediation in that message cannot help: after removing the folder, provisioning reinstalls the same bundled 26.2.10191 and the validation fails again. There is also no setting or MSBuild property I could find to tell provisioning which version to install.
Evidence that the provisioned version comes from the VS bundle, not from the repo or from the locally installed manifests: C:\Program Files\dotnet\sdk-manifests\10.0.100\microsoft.net.sdk.ios\ on the Windows machine contains 26.2.10191, 26.5.10284 and 26.5.10315, yet provisioning picked 26.2.10191. Same for mono toolchain: the folder contains 10.0.101, 10.0.109, 10.0.110, and the rollback file picked 10.0.101. In both cases the chosen version is exactly the one the VS installer shipped (it also matches the messaging agents version, 26.2.10191).
Why one ends up in this situation: the Mac is on Xcode 26.6, and per https://aka.ms/xcode-requirement each workload set requires one exact Xcode version, so supporting Xcode 26.6 requires pinning 26.5.10315 (per the release notes at https://github.com/dotnet/macios/releases) before any VS release bundles it. From that moment the officially documented workload-set pinning workflow and Pair to Mac are mutually exclusive.
Expected behavior: provisioning should install the workload version that the solution's global.json resolves to (or at least offer an explicit override), and when the versions cannot match, the error should state the actual version mismatch instead of suggesting a cache wipe.
Steps to Reproduce
- On Windows with VS 2026 18.8 (bundled iOS tooling 26.2.10191), create/open a
net10.0-ios app whose global.json contains "sdk": { "version": "10.0.302", "workloadVersion": "10.0.302.1" }, and run dotnet workload install ios so the local build uses ios 26.5.10315.
- Pair to Mac (Mac has Xcode 26.6) and let automatic provisioning finish.
- Observe the provisioning log installing
microsoft.net.sdk.ios 26.2.10191 from its rollback file, followed by the failed validation: SDK relative directory: packs\Microsoft.iOS.Sdk.net10.0_26.5\26.5.10315\ and "The connection cannot continue because the remote iOS SDK was not found or is corrupted".
Did you find any workaround?
Yes, verified working: manually seed the pinned SDK into the Pair to Mac cache on the Mac, then restore the VS-bundled set so the seeded packs end up without install records. The second step matters: workload garbage collection removes any recorded pack that the currently installed manifest does not reference, so a plain seed gets garbage-collected during the next VS provisioning. Recordless packs survive because provisioning wipes metadata/ before installing and GC only considers recorded packs.
# on the Mac, inside the Pair to Mac SDK cache
cd ~/Library/Caches/maui/PairToMac/SDKs/dotnet
# 1) seed the version the repo pins
echo '{ "microsoft.net.sdk.ios": "26.5.10315/10.0.100" }' > /tmp/rollback-pinned.json
DOTNET_ROOT="$PWD" ./dotnet workload install ios --from-rollback-file /tmp/rollback-pinned.json --source https://api.nuget.org/v3/index.json
# 2) restore the VS-bundled set (rollback JSON copied verbatim from the VS connect log)
# and strip the install records of the seeded packs
echo '{ "microsoft.net.sdk.ios": "26.2.10191/10.0.100", "microsoft.net.workload.mono.toolchain.current": "10.0.101/10.0.100", "microsoft.net.workload.mono.toolchain.net9": "10.0.101/10.0.100", "microsoft.net.workload.emscripten.current": "10.0.101/10.0.100", "microsoft.net.workload.emscripten.net9": "10.0.101/10.0.100" }' > /tmp/rollback-vs.json
rm -rf metadata
DOTNET_ROOT="$PWD" ./dotnet workload install ios --from-rollback-file /tmp/rollback-vs.json --source https://api.nuget.org/v3/index.json
After this, both packs/Microsoft.iOS.Sdk.net10.0_26.2/26.2.10191 and packs/Microsoft.iOS.Sdk.net10.0_26.5/26.5.10315 coexist on the Mac, VS provisioning passes ("already installed" for its whole set, GC uninstalls nothing) and the connection succeeds.
Build logs
Relevant excerpt of the Pair to Mac connect log (happy to attach the full log on request):
Selected project configuration for DotNet validation: ...SatisFIT.Client.App.csproj: SatisFIT.Client.App.Debug|AnyCPU|net10.0-ios.26.5
Installing workloads using rollback file:
{
"microsoft.net.sdk.ios": "26.2.10191/10.0.100",
"microsoft.net.workload.mono.toolchain.current": "10.0.101/10.0.100",
"microsoft.net.workload.mono.toolchain.net9": "10.0.101/10.0.100",
"microsoft.net.workload.emscripten.current": "10.0.101/10.0.100",
"microsoft.net.workload.emscripten.net9": "10.0.101/10.0.100"
}
Updating to a rollback file is not compatible with workload sets. Install and Update will now use loose manifests. To update to a specific workload version, use --version.
...
Successfully installed workload(s) ios.
...
Initializing IDB environment...
SDK relative directory: packs\Microsoft.iOS.Sdk.net10.0_26.5\26.5.10315\
...
Performing server validations against 'Samuel's Mac mini'...
The connection cannot continue because the remote iOS SDK was not found or is corrupted. If the issue persists, please try removing the `~/Library/Caches/Xamarin/XMA/SDKs/dotnet/` folder on the Mac and try again
Apple platform
iOS
Framework version
net10.0-*
Affected platform version
global.jsonpins"workloadVersion": "10.0.302.1"(resolves the ios workload to manifest 26.5.10315)Description
When a solution pins a workload set in
global.jsonthat is newer than the iOS tooling bundled in Visual Studio, Pair to Mac can never connect successfully:net10.0-ios26.5 band and needs the packMicrosoft.iOS.Sdk.net10.0_26.5version26.5.10315on the Mac.global.jsonentirely. It generates its rollback file from the versions bundled with the VS instance and installsmicrosoft.net.sdk.ios 26.2.10191on the Mac.packs/Microsoft.iOS.Sdk.net10.0_26.5/26.5.10315/on the Mac, does not find it, and the connection is dropped with:The suggested remediation in that message cannot help: after removing the folder, provisioning reinstalls the same bundled 26.2.10191 and the validation fails again. There is also no setting or MSBuild property I could find to tell provisioning which version to install.
Evidence that the provisioned version comes from the VS bundle, not from the repo or from the locally installed manifests:
C:\Program Files\dotnet\sdk-manifests\10.0.100\microsoft.net.sdk.ios\on the Windows machine contains26.2.10191,26.5.10284and26.5.10315, yet provisioning picked26.2.10191. Same for mono toolchain: the folder contains10.0.101,10.0.109,10.0.110, and the rollback file picked10.0.101. In both cases the chosen version is exactly the one the VS installer shipped (it also matches the messaging agents version, 26.2.10191).Why one ends up in this situation: the Mac is on Xcode 26.6, and per https://aka.ms/xcode-requirement each workload set requires one exact Xcode version, so supporting Xcode 26.6 requires pinning 26.5.10315 (per the release notes at https://github.com/dotnet/macios/releases) before any VS release bundles it. From that moment the officially documented workload-set pinning workflow and Pair to Mac are mutually exclusive.
Expected behavior: provisioning should install the workload version that the solution's
global.jsonresolves to (or at least offer an explicit override), and when the versions cannot match, the error should state the actual version mismatch instead of suggesting a cache wipe.Steps to Reproduce
net10.0-iosapp whoseglobal.jsoncontains"sdk": { "version": "10.0.302", "workloadVersion": "10.0.302.1" }, and rundotnet workload install iosso the local build uses ios 26.5.10315.microsoft.net.sdk.ios 26.2.10191from its rollback file, followed by the failed validation:SDK relative directory: packs\Microsoft.iOS.Sdk.net10.0_26.5\26.5.10315\and "The connection cannot continue because the remote iOS SDK was not found or is corrupted".Did you find any workaround?
Yes, verified working: manually seed the pinned SDK into the Pair to Mac cache on the Mac, then restore the VS-bundled set so the seeded packs end up without install records. The second step matters: workload garbage collection removes any recorded pack that the currently installed manifest does not reference, so a plain seed gets garbage-collected during the next VS provisioning. Recordless packs survive because provisioning wipes
metadata/before installing and GC only considers recorded packs.After this, both
packs/Microsoft.iOS.Sdk.net10.0_26.2/26.2.10191andpacks/Microsoft.iOS.Sdk.net10.0_26.5/26.5.10315coexist on the Mac, VS provisioning passes ("already installed" for its whole set, GC uninstalls nothing) and the connection succeeds.Build logs
Relevant excerpt of the Pair to Mac connect log (happy to attach the full log on request):