CI: todoapp-avalonia / ios build fails - .NET for iOS 26.5 requires Xcode 26.5, macos-latest only has Xcode 16.4 #529

Description

@adrianhall

Summary

Surfaced on PR #528 (run 29064641347, job todoapp-avalonia / ios), which only replaces obsolete DisplayAlert with DisplayAlertAsync in TodoApp.Avalonia - it does not touch anything related to iOS or the workload setup. The todoapp-avalonia / ios job (added in #511 / #519) fails in the Build iOS project step:

/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.Avalonia/TodoApp.Avalonia.iOS/TodoApp.Avalonia.iOS.csproj]

Job details:

  • Runner: macos-latest → resolved to image macos-15-arm64, version 20260706.0213.1, macOS 15.7.7
  • Installed Xcode on that image: 16.4
  • dotnet workload install ios step succeeds and installs Microsoft.iOS.Sdk.net10.0_26.5 version 26.5.10284, which requires Xcode 26.5
  • Build then fails with the version-mismatch error above

Why this looks like an environment/workload issue, not a code issue

The PR diff for #528 only changes a DisplayAlertDisplayAlertAsync call in TodoApp.Avalonia - nothing in TodoApp.Avalonia.iOS, workload setup, or CI config. The dotnet build output shows the shared TodoApp.Avalonia project (which contains the PR's change) restores and builds fine; the failure happens purely in the Xamarin.Shared.Sdk.targets Xcode-version check for the net10.0-ios head.

Interesting corroborating data point from the same run: the sibling todoapp-maui / ios job (also runs-on: macos-latest, same Xcode 16.4) succeeded. Its dotnet workload install maui-ios step installs multiple iOS SDK pack versions side-by-side:

Installing pack Microsoft.iOS.Sdk.net10.0_26.5 version 26.5.10284...
Installing pack Microsoft.iOS.Sdk.net9.0_18.0 version 18.0.9617...
Installing pack Microsoft.iOS.Sdk.net9.0_26.5 version 26.5.9002...
Installing pack Microsoft.iOS.Sdk.net10.0_26.0 version 26.0.11017...

...and its build actually resolves to Microsoft.iOS.Sdk.net10.0_26.0 (26.0.11017), which is compatible with the installed Xcode 16.4, rather than the newer 26.5 pack. The ios workload (used by TodoApp.Avalonia.iOS, a plain Microsoft.NET.Sdk project referencing Avalonia.iOS) apparently only registers/selects the newest net10.0_26.5 pack and has no fallback, so it hits the hard Xcode-version check instead of negotiating down to a pack compatible with the runner's installed Xcode.

Affected workflow

  • .github/workflows/build-samples-todoapp-avalonia.yml, job ios:
    ios:
    runs-on: macos-lateststeps:
    - uses: actions/checkout@v7
    - uses: actions/setup-dotnet@v5with:
    dotnet-version: ${{ env.DOTNET_VERSION }} # 10.0.x
    - name: Install iOS workloadrun: dotnet workload install ios
    - name: Restore iOS projectrun: dotnet restore ${{ env.iOSProjectFile }}
    - name: Build iOS projectrun: dotnet build ${{ env.iOSProjectFile }} --configuration ${{ env.DOTNET_CONFIGURATION }} --no-restore
    No Xcode/workload version is pinned; dotnet workload install ios grabs whatever the latest Microsoft.iOS.Sdk.net10.0_* manifest advertises (currently 26.5, which requires Xcode 26.5), regardless of what Xcode version the macos-latest image actually ships (currently 16.4).

Suggested fixes (any of)

  1. Pin a specific Microsoft.iOS.Sdk / rollback workload version for the ios workload install (e.g. dotnet workload install ios --version <manifest-version> or a rollback.json) so it matches whatever Xcode ships on macos-latest.
  2. Pin the runner to a specific macOS image/Xcode version instead of floating macos-latest (e.g. macos-15 and/or xcode-select to a known-good Xcode, similar to how maccy/xcode-select@... or maxim-lobanov/setup-xcode@v1 could be used), and keep it in sync with the .NET for iOS SDK's requirement.
  3. Investigate why the plain ios workload doesn't negotiate down to a compatible pack the way maui-ios does in the same run, and consider aligning TodoApp.Avalonia.iOS's workload install with whatever mechanism lets maui-ios pick net10.0_26.0 automatically.

To reproduce

Run the ios job of .github/workflows/build-samples-todoapp-avalonia.yml (or build-samples-todoapp-maui.yml for a comparison) on macos-latest as of image macos-15-arm6420260706.0213.1 (Xcode 16.4). The plain ios workload install 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

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

ExamplesInfrastructureChanges to the build and release systemRequires TriageThis issue has not been checked by the project team.

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions

    , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all \u003cpre\u003e\u003ccode\u003e blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks"); } } catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); } })(); (function(){ try { var __m = "github.com"; var __re = new RegExp('^' + "github\\.com" + '
    Skip to content

    CI: todoapp-avalonia / ios build fails - .NET for iOS 26.5 requires Xcode 26.5, macos-latest only has Xcode 16.4 #529

    Description

    @adrianhall

    Summary

    Surfaced on PR #528 (run 29064641347, job todoapp-avalonia / ios), which only replaces obsolete DisplayAlert with DisplayAlertAsync in TodoApp.Avalonia - it does not touch anything related to iOS or the workload setup. The todoapp-avalonia / ios job (added in #511 / #519) fails in the Build iOS project step:

    /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.Avalonia/TodoApp.Avalonia.iOS/TodoApp.Avalonia.iOS.csproj]
    

    Job details:

    • Runner: macos-latest → resolved to image macos-15-arm64, version 20260706.0213.1, macOS 15.7.7
    • Installed Xcode on that image: 16.4
    • dotnet workload install ios step succeeds and installs Microsoft.iOS.Sdk.net10.0_26.5 version 26.5.10284, which requires Xcode 26.5
    • Build then fails with the version-mismatch error above

    Why this looks like an environment/workload issue, not a code issue

    The PR diff for #528 only changes a DisplayAlertDisplayAlertAsync call in TodoApp.Avalonia - nothing in TodoApp.Avalonia.iOS, workload setup, or CI config. The dotnet build output shows the shared TodoApp.Avalonia project (which contains the PR's change) restores and builds fine; the failure happens purely in the Xamarin.Shared.Sdk.targets Xcode-version check for the net10.0-ios head.

    Interesting corroborating data point from the same run: the sibling todoapp-maui / ios job (also runs-on: macos-latest, same Xcode 16.4) succeeded. Its dotnet workload install maui-ios step installs multiple iOS SDK pack versions side-by-side:

    Installing pack Microsoft.iOS.Sdk.net10.0_26.5 version 26.5.10284...
    Installing pack Microsoft.iOS.Sdk.net9.0_18.0 version 18.0.9617...
    Installing pack Microsoft.iOS.Sdk.net9.0_26.5 version 26.5.9002...
    Installing pack Microsoft.iOS.Sdk.net10.0_26.0 version 26.0.11017...
    

    ...and its build actually resolves to Microsoft.iOS.Sdk.net10.0_26.0 (26.0.11017), which is compatible with the installed Xcode 16.4, rather than the newer 26.5 pack. The ios workload (used by TodoApp.Avalonia.iOS, a plain Microsoft.NET.Sdk project referencing Avalonia.iOS) apparently only registers/selects the newest net10.0_26.5 pack and has no fallback, so it hits the hard Xcode-version check instead of negotiating down to a pack compatible with the runner's installed Xcode.

    Affected workflow

    • .github/workflows/build-samples-todoapp-avalonia.yml, job ios:
      ios:
      runs-on: macos-lateststeps:
      - uses: actions/checkout@v7
      - uses: actions/setup-dotnet@v5with:
      dotnet-version: ${{ env.DOTNET_VERSION }} # 10.0.x
      - name: Install iOS workloadrun: dotnet workload install ios
      - name: Restore iOS projectrun: dotnet restore ${{ env.iOSProjectFile }}
      - name: Build iOS projectrun: dotnet build ${{ env.iOSProjectFile }} --configuration ${{ env.DOTNET_CONFIGURATION }} --no-restore
      No Xcode/workload version is pinned; dotnet workload install ios grabs whatever the latest Microsoft.iOS.Sdk.net10.0_* manifest advertises (currently 26.5, which requires Xcode 26.5), regardless of what Xcode version the macos-latest image actually ships (currently 16.4).

    Suggested fixes (any of)

    1. Pin a specific Microsoft.iOS.Sdk / rollback workload version for the ios workload install (e.g. dotnet workload install ios --version <manifest-version> or a rollback.json) so it matches whatever Xcode ships on macos-latest.
    2. Pin the runner to a specific macOS image/Xcode version instead of floating macos-latest (e.g. macos-15 and/or xcode-select to a known-good Xcode, similar to how maccy/xcode-select@... or maxim-lobanov/setup-xcode@v1 could be used), and keep it in sync with the .NET for iOS SDK's requirement.
    3. Investigate why the plain ios workload doesn't negotiate down to a compatible pack the way maui-ios does in the same run, and consider aligning TodoApp.Avalonia.iOS's workload install with whatever mechanism lets maui-ios pick net10.0_26.0 automatically.

    To reproduce

    Run the ios job of .github/workflows/build-samples-todoapp-avalonia.yml (or build-samples-todoapp-maui.yml for a comparison) on macos-latest as of image macos-15-arm6420260706.0213.1 (Xcode 16.4). The plain ios workload install 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

    Activity

    Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

    Metadata

    Metadata

    Assignees

    Labels

    ExamplesInfrastructureChanges to the build and release systemRequires TriageThis issue has not been checked by the project team.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

      , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
      Skip to content

      CI: todoapp-avalonia / ios build fails - .NET for iOS 26.5 requires Xcode 26.5, macos-latest only has Xcode 16.4 #529

      Description

      @adrianhall

      Summary

      Surfaced on PR #528 (run 29064641347, job todoapp-avalonia / ios), which only replaces obsolete DisplayAlert with DisplayAlertAsync in TodoApp.Avalonia - it does not touch anything related to iOS or the workload setup. The todoapp-avalonia / ios job (added in #511 / #519) fails in the Build iOS project step:

      /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.Avalonia/TodoApp.Avalonia.iOS/TodoApp.Avalonia.iOS.csproj]
      

      Job details:

      • Runner: macos-latest → resolved to image macos-15-arm64, version 20260706.0213.1, macOS 15.7.7
      • Installed Xcode on that image: 16.4
      • dotnet workload install ios step succeeds and installs Microsoft.iOS.Sdk.net10.0_26.5 version 26.5.10284, which requires Xcode 26.5
      • Build then fails with the version-mismatch error above

      Why this looks like an environment/workload issue, not a code issue

      The PR diff for #528 only changes a DisplayAlertDisplayAlertAsync call in TodoApp.Avalonia - nothing in TodoApp.Avalonia.iOS, workload setup, or CI config. The dotnet build output shows the shared TodoApp.Avalonia project (which contains the PR's change) restores and builds fine; the failure happens purely in the Xamarin.Shared.Sdk.targets Xcode-version check for the net10.0-ios head.

      Interesting corroborating data point from the same run: the sibling todoapp-maui / ios job (also runs-on: macos-latest, same Xcode 16.4) succeeded. Its dotnet workload install maui-ios step installs multiple iOS SDK pack versions side-by-side:

      Installing pack Microsoft.iOS.Sdk.net10.0_26.5 version 26.5.10284...
      Installing pack Microsoft.iOS.Sdk.net9.0_18.0 version 18.0.9617...
      Installing pack Microsoft.iOS.Sdk.net9.0_26.5 version 26.5.9002...
      Installing pack Microsoft.iOS.Sdk.net10.0_26.0 version 26.0.11017...
      

      ...and its build actually resolves to Microsoft.iOS.Sdk.net10.0_26.0 (26.0.11017), which is compatible with the installed Xcode 16.4, rather than the newer 26.5 pack. The ios workload (used by TodoApp.Avalonia.iOS, a plain Microsoft.NET.Sdk project referencing Avalonia.iOS) apparently only registers/selects the newest net10.0_26.5 pack and has no fallback, so it hits the hard Xcode-version check instead of negotiating down to a pack compatible with the runner's installed Xcode.

      Affected workflow

      • .github/workflows/build-samples-todoapp-avalonia.yml, job ios:
        ios:
        runs-on: macos-lateststeps:
        - uses: actions/checkout@v7
        - uses: actions/setup-dotnet@v5with:
        dotnet-version: ${{ env.DOTNET_VERSION }} # 10.0.x
        - name: Install iOS workloadrun: dotnet workload install ios
        - name: Restore iOS projectrun: dotnet restore ${{ env.iOSProjectFile }}
        - name: Build iOS projectrun: dotnet build ${{ env.iOSProjectFile }} --configuration ${{ env.DOTNET_CONFIGURATION }} --no-restore
        No Xcode/workload version is pinned; dotnet workload install ios grabs whatever the latest Microsoft.iOS.Sdk.net10.0_* manifest advertises (currently 26.5, which requires Xcode 26.5), regardless of what Xcode version the macos-latest image actually ships (currently 16.4).

      Suggested fixes (any of)

      1. Pin a specific Microsoft.iOS.Sdk / rollback workload version for the ios workload install (e.g. dotnet workload install ios --version <manifest-version> or a rollback.json) so it matches whatever Xcode ships on macos-latest.
      2. Pin the runner to a specific macOS image/Xcode version instead of floating macos-latest (e.g. macos-15 and/or xcode-select to a known-good Xcode, similar to how maccy/xcode-select@... or maxim-lobanov/setup-xcode@v1 could be used), and keep it in sync with the .NET for iOS SDK's requirement.
      3. Investigate why the plain ios workload doesn't negotiate down to a compatible pack the way maui-ios does in the same run, and consider aligning TodoApp.Avalonia.iOS's workload install with whatever mechanism lets maui-ios pick net10.0_26.0 automatically.

      To reproduce

      Run the ios job of .github/workflows/build-samples-todoapp-avalonia.yml (or build-samples-todoapp-maui.yml for a comparison) on macos-latest as of image macos-15-arm6420260706.0213.1 (Xcode 16.4). The plain ios workload install 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

      Activity

      Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

      Metadata

      Metadata

      Assignees

      Labels

      ExamplesInfrastructureChanges to the build and release systemRequires TriageThis issue has not been checked by the project team.

      Type

      No type

      Projects

      No projects

        Milestone

        No milestone

        Relationships

        None yet

        Development

        No branches or pull requests

        Issue actions

        , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length \u003e 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
        Skip to content

        CI: todoapp-avalonia / ios build fails - .NET for iOS 26.5 requires Xcode 26.5, macos-latest only has Xcode 16.4 #529

        Description

        @adrianhall

        Summary

        Surfaced on PR #528 (run 29064641347, job todoapp-avalonia / ios), which only replaces obsolete DisplayAlert with DisplayAlertAsync in TodoApp.Avalonia - it does not touch anything related to iOS or the workload setup. The todoapp-avalonia / ios job (added in #511 / #519) fails in the Build iOS project step:

        /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.Avalonia/TodoApp.Avalonia.iOS/TodoApp.Avalonia.iOS.csproj]
        

        Job details:

        • Runner: macos-latest → resolved to image macos-15-arm64, version 20260706.0213.1, macOS 15.7.7
        • Installed Xcode on that image: 16.4
        • dotnet workload install ios step succeeds and installs Microsoft.iOS.Sdk.net10.0_26.5 version 26.5.10284, which requires Xcode 26.5
        • Build then fails with the version-mismatch error above

        Why this looks like an environment/workload issue, not a code issue

        The PR diff for #528 only changes a DisplayAlertDisplayAlertAsync call in TodoApp.Avalonia - nothing in TodoApp.Avalonia.iOS, workload setup, or CI config. The dotnet build output shows the shared TodoApp.Avalonia project (which contains the PR's change) restores and builds fine; the failure happens purely in the Xamarin.Shared.Sdk.targets Xcode-version check for the net10.0-ios head.

        Interesting corroborating data point from the same run: the sibling todoapp-maui / ios job (also runs-on: macos-latest, same Xcode 16.4) succeeded. Its dotnet workload install maui-ios step installs multiple iOS SDK pack versions side-by-side:

        Installing pack Microsoft.iOS.Sdk.net10.0_26.5 version 26.5.10284...
        Installing pack Microsoft.iOS.Sdk.net9.0_18.0 version 18.0.9617...
        Installing pack Microsoft.iOS.Sdk.net9.0_26.5 version 26.5.9002...
        Installing pack Microsoft.iOS.Sdk.net10.0_26.0 version 26.0.11017...
        

        ...and its build actually resolves to Microsoft.iOS.Sdk.net10.0_26.0 (26.0.11017), which is compatible with the installed Xcode 16.4, rather than the newer 26.5 pack. The ios workload (used by TodoApp.Avalonia.iOS, a plain Microsoft.NET.Sdk project referencing Avalonia.iOS) apparently only registers/selects the newest net10.0_26.5 pack and has no fallback, so it hits the hard Xcode-version check instead of negotiating down to a pack compatible with the runner's installed Xcode.

        Affected workflow

        • .github/workflows/build-samples-todoapp-avalonia.yml, job ios:
          ios:
          runs-on: macos-lateststeps:
          - uses: actions/checkout@v7
          - uses: actions/setup-dotnet@v5with:
          dotnet-version: ${{ env.DOTNET_VERSION }} # 10.0.x
          - name: Install iOS workloadrun: dotnet workload install ios
          - name: Restore iOS projectrun: dotnet restore ${{ env.iOSProjectFile }}
          - name: Build iOS projectrun: dotnet build ${{ env.iOSProjectFile }} --configuration ${{ env.DOTNET_CONFIGURATION }} --no-restore
          No Xcode/workload version is pinned; dotnet workload install ios grabs whatever the latest Microsoft.iOS.Sdk.net10.0_* manifest advertises (currently 26.5, which requires Xcode 26.5), regardless of what Xcode version the macos-latest image actually ships (currently 16.4).

        Suggested fixes (any of)

        1. Pin a specific Microsoft.iOS.Sdk / rollback workload version for the ios workload install (e.g. dotnet workload install ios --version <manifest-version> or a rollback.json) so it matches whatever Xcode ships on macos-latest.
        2. Pin the runner to a specific macOS image/Xcode version instead of floating macos-latest (e.g. macos-15 and/or xcode-select to a known-good Xcode, similar to how maccy/xcode-select@... or maxim-lobanov/setup-xcode@v1 could be used), and keep it in sync with the .NET for iOS SDK's requirement.
        3. Investigate why the plain ios workload doesn't negotiate down to a compatible pack the way maui-ios does in the same run, and consider aligning TodoApp.Avalonia.iOS's workload install with whatever mechanism lets maui-ios pick net10.0_26.0 automatically.

        To reproduce

        Run the ios job of .github/workflows/build-samples-todoapp-avalonia.yml (or build-samples-todoapp-maui.yml for a comparison) on macos-latest as of image macos-15-arm6420260706.0213.1 (Xcode 16.4). The plain ios workload install 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

        Activity

        Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

        Metadata

        Metadata

        Assignees

        Labels

        ExamplesInfrastructureChanges to the build and release systemRequires TriageThis issue has not been checked by the project team.

        Type

        No type

        Projects

        No projects

          Milestone

          No milestone

          Relationships

          None yet

          Development

          No branches or pull requests

          Issue actions

          , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
          Skip to content

          CI: todoapp-avalonia / ios build fails - .NET for iOS 26.5 requires Xcode 26.5, macos-latest only has Xcode 16.4 #529

          Description

          @adrianhall

          Summary

          Surfaced on PR #528 (run 29064641347, job todoapp-avalonia / ios), which only replaces obsolete DisplayAlert with DisplayAlertAsync in TodoApp.Avalonia - it does not touch anything related to iOS or the workload setup. The todoapp-avalonia / ios job (added in #511 / #519) fails in the Build iOS project step:

          /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.Avalonia/TodoApp.Avalonia.iOS/TodoApp.Avalonia.iOS.csproj]
          

          Job details:

          • Runner: macos-latest → resolved to image macos-15-arm64, version 20260706.0213.1, macOS 15.7.7
          • Installed Xcode on that image: 16.4
          • dotnet workload install ios step succeeds and installs Microsoft.iOS.Sdk.net10.0_26.5 version 26.5.10284, which requires Xcode 26.5
          • Build then fails with the version-mismatch error above

          Why this looks like an environment/workload issue, not a code issue

          The PR diff for #528 only changes a DisplayAlertDisplayAlertAsync call in TodoApp.Avalonia - nothing in TodoApp.Avalonia.iOS, workload setup, or CI config. The dotnet build output shows the shared TodoApp.Avalonia project (which contains the PR's change) restores and builds fine; the failure happens purely in the Xamarin.Shared.Sdk.targets Xcode-version check for the net10.0-ios head.

          Interesting corroborating data point from the same run: the sibling todoapp-maui / ios job (also runs-on: macos-latest, same Xcode 16.4) succeeded. Its dotnet workload install maui-ios step installs multiple iOS SDK pack versions side-by-side:

          Installing pack Microsoft.iOS.Sdk.net10.0_26.5 version 26.5.10284...
          Installing pack Microsoft.iOS.Sdk.net9.0_18.0 version 18.0.9617...
          Installing pack Microsoft.iOS.Sdk.net9.0_26.5 version 26.5.9002...
          Installing pack Microsoft.iOS.Sdk.net10.0_26.0 version 26.0.11017...
          

          ...and its build actually resolves to Microsoft.iOS.Sdk.net10.0_26.0 (26.0.11017), which is compatible with the installed Xcode 16.4, rather than the newer 26.5 pack. The ios workload (used by TodoApp.Avalonia.iOS, a plain Microsoft.NET.Sdk project referencing Avalonia.iOS) apparently only registers/selects the newest net10.0_26.5 pack and has no fallback, so it hits the hard Xcode-version check instead of negotiating down to a pack compatible with the runner's installed Xcode.

          Affected workflow

          • .github/workflows/build-samples-todoapp-avalonia.yml, job ios:
            ios:
            runs-on: macos-lateststeps:
            - uses: actions/checkout@v7
            - uses: actions/setup-dotnet@v5with:
            dotnet-version: ${{ env.DOTNET_VERSION }} # 10.0.x
            - name: Install iOS workloadrun: dotnet workload install ios
            - name: Restore iOS projectrun: dotnet restore ${{ env.iOSProjectFile }}
            - name: Build iOS projectrun: dotnet build ${{ env.iOSProjectFile }} --configuration ${{ env.DOTNET_CONFIGURATION }} --no-restore
            No Xcode/workload version is pinned; dotnet workload install ios grabs whatever the latest Microsoft.iOS.Sdk.net10.0_* manifest advertises (currently 26.5, which requires Xcode 26.5), regardless of what Xcode version the macos-latest image actually ships (currently 16.4).

          Suggested fixes (any of)

          1. Pin a specific Microsoft.iOS.Sdk / rollback workload version for the ios workload install (e.g. dotnet workload install ios --version <manifest-version> or a rollback.json) so it matches whatever Xcode ships on macos-latest.
          2. Pin the runner to a specific macOS image/Xcode version instead of floating macos-latest (e.g. macos-15 and/or xcode-select to a known-good Xcode, similar to how maccy/xcode-select@... or maxim-lobanov/setup-xcode@v1 could be used), and keep it in sync with the .NET for iOS SDK's requirement.
          3. Investigate why the plain ios workload doesn't negotiate down to a compatible pack the way maui-ios does in the same run, and consider aligning TodoApp.Avalonia.iOS's workload install with whatever mechanism lets maui-ios pick net10.0_26.0 automatically.

          To reproduce

          Run the ios job of .github/workflows/build-samples-todoapp-avalonia.yml (or build-samples-todoapp-maui.yml for a comparison) on macos-latest as of image macos-15-arm6420260706.0213.1 (Xcode 16.4). The plain ios workload install 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

          Activity

          Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

          Metadata

          Metadata

          Assignees

          Labels

          ExamplesInfrastructureChanges to the build and release systemRequires TriageThis issue has not been checked by the project team.

          Type

          No type

          Projects

          No projects

            Milestone

            No milestone

            Relationships

            None yet

            Development

            No branches or pull requests

            Issue actions

            , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
            Skip to content

            CI: todoapp-avalonia / ios build fails - .NET for iOS 26.5 requires Xcode 26.5, macos-latest only has Xcode 16.4 #529

            Description

            @adrianhall

            Summary

            Surfaced on PR #528 (run 29064641347, job todoapp-avalonia / ios), which only replaces obsolete DisplayAlert with DisplayAlertAsync in TodoApp.Avalonia - it does not touch anything related to iOS or the workload setup. The todoapp-avalonia / ios job (added in #511 / #519) fails in the Build iOS project step:

            /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.Avalonia/TodoApp.Avalonia.iOS/TodoApp.Avalonia.iOS.csproj]
            

            Job details:

            • Runner: macos-latest → resolved to image macos-15-arm64, version 20260706.0213.1, macOS 15.7.7
            • Installed Xcode on that image: 16.4
            • dotnet workload install ios step succeeds and installs Microsoft.iOS.Sdk.net10.0_26.5 version 26.5.10284, which requires Xcode 26.5
            • Build then fails with the version-mismatch error above

            Why this looks like an environment/workload issue, not a code issue

            The PR diff for #528 only changes a DisplayAlertDisplayAlertAsync call in TodoApp.Avalonia - nothing in TodoApp.Avalonia.iOS, workload setup, or CI config. The dotnet build output shows the shared TodoApp.Avalonia project (which contains the PR's change) restores and builds fine; the failure happens purely in the Xamarin.Shared.Sdk.targets Xcode-version check for the net10.0-ios head.

            Interesting corroborating data point from the same run: the sibling todoapp-maui / ios job (also runs-on: macos-latest, same Xcode 16.4) succeeded. Its dotnet workload install maui-ios step installs multiple iOS SDK pack versions side-by-side:

            Installing pack Microsoft.iOS.Sdk.net10.0_26.5 version 26.5.10284...
            Installing pack Microsoft.iOS.Sdk.net9.0_18.0 version 18.0.9617...
            Installing pack Microsoft.iOS.Sdk.net9.0_26.5 version 26.5.9002...
            Installing pack Microsoft.iOS.Sdk.net10.0_26.0 version 26.0.11017...
            

            ...and its build actually resolves to Microsoft.iOS.Sdk.net10.0_26.0 (26.0.11017), which is compatible with the installed Xcode 16.4, rather than the newer 26.5 pack. The ios workload (used by TodoApp.Avalonia.iOS, a plain Microsoft.NET.Sdk project referencing Avalonia.iOS) apparently only registers/selects the newest net10.0_26.5 pack and has no fallback, so it hits the hard Xcode-version check instead of negotiating down to a pack compatible with the runner's installed Xcode.

            Affected workflow

            • .github/workflows/build-samples-todoapp-avalonia.yml, job ios:
              ios:
              runs-on: macos-lateststeps:
              - uses: actions/checkout@v7
              - uses: actions/setup-dotnet@v5with:
              dotnet-version: ${{ env.DOTNET_VERSION }} # 10.0.x
              - name: Install iOS workloadrun: dotnet workload install ios
              - name: Restore iOS projectrun: dotnet restore ${{ env.iOSProjectFile }}
              - name: Build iOS projectrun: dotnet build ${{ env.iOSProjectFile }} --configuration ${{ env.DOTNET_CONFIGURATION }} --no-restore
              No Xcode/workload version is pinned; dotnet workload install ios grabs whatever the latest Microsoft.iOS.Sdk.net10.0_* manifest advertises (currently 26.5, which requires Xcode 26.5), regardless of what Xcode version the macos-latest image actually ships (currently 16.4).

            Suggested fixes (any of)

            1. Pin a specific Microsoft.iOS.Sdk / rollback workload version for the ios workload install (e.g. dotnet workload install ios --version <manifest-version> or a rollback.json) so it matches whatever Xcode ships on macos-latest.
            2. Pin the runner to a specific macOS image/Xcode version instead of floating macos-latest (e.g. macos-15 and/or xcode-select to a known-good Xcode, similar to how maccy/xcode-select@... or maxim-lobanov/setup-xcode@v1 could be used), and keep it in sync with the .NET for iOS SDK's requirement.
            3. Investigate why the plain ios workload doesn't negotiate down to a compatible pack the way maui-ios does in the same run, and consider aligning TodoApp.Avalonia.iOS's workload install with whatever mechanism lets maui-ios pick net10.0_26.0 automatically.

            To reproduce

            Run the ios job of .github/workflows/build-samples-todoapp-avalonia.yml (or build-samples-todoapp-maui.yml for a comparison) on macos-latest as of image macos-15-arm6420260706.0213.1 (Xcode 16.4). The plain ios workload install 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

            Activity

            Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

            Metadata

            Metadata

            Assignees

            Labels

            ExamplesInfrastructureChanges to the build and release systemRequires TriageThis issue has not been checked by the project team.

            Type

            No type

            Projects

            No projects

              Milestone

              No milestone

              Relationships

              None yet

              Development

              No branches or pull requests

              Issue actions

              , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
              Skip to content

              CI: todoapp-avalonia / ios build fails - .NET for iOS 26.5 requires Xcode 26.5, macos-latest only has Xcode 16.4 #529

              Description

              @adrianhall

              Summary

              Surfaced on PR #528 (run 29064641347, job todoapp-avalonia / ios), which only replaces obsolete DisplayAlert with DisplayAlertAsync in TodoApp.Avalonia - it does not touch anything related to iOS or the workload setup. The todoapp-avalonia / ios job (added in #511 / #519) fails in the Build iOS project step:

              /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.Avalonia/TodoApp.Avalonia.iOS/TodoApp.Avalonia.iOS.csproj]
              

              Job details:

              • Runner: macos-latest → resolved to image macos-15-arm64, version 20260706.0213.1, macOS 15.7.7
              • Installed Xcode on that image: 16.4
              • dotnet workload install ios step succeeds and installs Microsoft.iOS.Sdk.net10.0_26.5 version 26.5.10284, which requires Xcode 26.5
              • Build then fails with the version-mismatch error above

              Why this looks like an environment/workload issue, not a code issue

              The PR diff for #528 only changes a DisplayAlertDisplayAlertAsync call in TodoApp.Avalonia - nothing in TodoApp.Avalonia.iOS, workload setup, or CI config. The dotnet build output shows the shared TodoApp.Avalonia project (which contains the PR's change) restores and builds fine; the failure happens purely in the Xamarin.Shared.Sdk.targets Xcode-version check for the net10.0-ios head.

              Interesting corroborating data point from the same run: the sibling todoapp-maui / ios job (also runs-on: macos-latest, same Xcode 16.4) succeeded. Its dotnet workload install maui-ios step installs multiple iOS SDK pack versions side-by-side:

              Installing pack Microsoft.iOS.Sdk.net10.0_26.5 version 26.5.10284...
              Installing pack Microsoft.iOS.Sdk.net9.0_18.0 version 18.0.9617...
              Installing pack Microsoft.iOS.Sdk.net9.0_26.5 version 26.5.9002...
              Installing pack Microsoft.iOS.Sdk.net10.0_26.0 version 26.0.11017...
              

              ...and its build actually resolves to Microsoft.iOS.Sdk.net10.0_26.0 (26.0.11017), which is compatible with the installed Xcode 16.4, rather than the newer 26.5 pack. The ios workload (used by TodoApp.Avalonia.iOS, a plain Microsoft.NET.Sdk project referencing Avalonia.iOS) apparently only registers/selects the newest net10.0_26.5 pack and has no fallback, so it hits the hard Xcode-version check instead of negotiating down to a pack compatible with the runner's installed Xcode.

              Affected workflow

              • .github/workflows/build-samples-todoapp-avalonia.yml, job ios:
                ios:
                runs-on: macos-lateststeps:
                - uses: actions/checkout@v7
                - uses: actions/setup-dotnet@v5with:
                dotnet-version: ${{ env.DOTNET_VERSION }} # 10.0.x
                - name: Install iOS workloadrun: dotnet workload install ios
                - name: Restore iOS projectrun: dotnet restore ${{ env.iOSProjectFile }}
                - name: Build iOS projectrun: dotnet build ${{ env.iOSProjectFile }} --configuration ${{ env.DOTNET_CONFIGURATION }} --no-restore
                No Xcode/workload version is pinned; dotnet workload install ios grabs whatever the latest Microsoft.iOS.Sdk.net10.0_* manifest advertises (currently 26.5, which requires Xcode 26.5), regardless of what Xcode version the macos-latest image actually ships (currently 16.4).

              Suggested fixes (any of)

              1. Pin a specific Microsoft.iOS.Sdk / rollback workload version for the ios workload install (e.g. dotnet workload install ios --version <manifest-version> or a rollback.json) so it matches whatever Xcode ships on macos-latest.
              2. Pin the runner to a specific macOS image/Xcode version instead of floating macos-latest (e.g. macos-15 and/or xcode-select to a known-good Xcode, similar to how maccy/xcode-select@... or maxim-lobanov/setup-xcode@v1 could be used), and keep it in sync with the .NET for iOS SDK's requirement.
              3. Investigate why the plain ios workload doesn't negotiate down to a compatible pack the way maui-ios does in the same run, and consider aligning TodoApp.Avalonia.iOS's workload install with whatever mechanism lets maui-ios pick net10.0_26.0 automatically.

              To reproduce

              Run the ios job of .github/workflows/build-samples-todoapp-avalonia.yml (or build-samples-todoapp-maui.yml for a comparison) on macos-latest as of image macos-15-arm6420260706.0213.1 (Xcode 16.4). The plain ios workload install 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

              Activity

              Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

              Metadata

              Metadata

              Assignees

              Labels

              ExamplesInfrastructureChanges to the build and release systemRequires TriageThis issue has not been checked by the project team.

              Type

              No type

              Projects

              No projects

                Milestone

                No milestone

                Relationships

                None yet

                Development

                No branches or pull requests

                Issue actions

                , 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
                Skip to content

                CI: todoapp-avalonia / ios build fails - .NET for iOS 26.5 requires Xcode 26.5, macos-latest only has Xcode 16.4 #529

                Description

                @adrianhall

                Summary

                Surfaced on PR #528 (run 29064641347, job todoapp-avalonia / ios), which only replaces obsolete DisplayAlert with DisplayAlertAsync in TodoApp.Avalonia - it does not touch anything related to iOS or the workload setup. The todoapp-avalonia / ios job (added in #511 / #519) fails in the Build iOS project step:

                /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.Avalonia/TodoApp.Avalonia.iOS/TodoApp.Avalonia.iOS.csproj]
                

                Job details:

                • Runner: macos-latest → resolved to image macos-15-arm64, version 20260706.0213.1, macOS 15.7.7
                • Installed Xcode on that image: 16.4
                • dotnet workload install ios step succeeds and installs Microsoft.iOS.Sdk.net10.0_26.5 version 26.5.10284, which requires Xcode 26.5
                • Build then fails with the version-mismatch error above

                Why this looks like an environment/workload issue, not a code issue

                The PR diff for #528 only changes a DisplayAlertDisplayAlertAsync call in TodoApp.Avalonia - nothing in TodoApp.Avalonia.iOS, workload setup, or CI config. The dotnet build output shows the shared TodoApp.Avalonia project (which contains the PR's change) restores and builds fine; the failure happens purely in the Xamarin.Shared.Sdk.targets Xcode-version check for the net10.0-ios head.

                Interesting corroborating data point from the same run: the sibling todoapp-maui / ios job (also runs-on: macos-latest, same Xcode 16.4) succeeded. Its dotnet workload install maui-ios step installs multiple iOS SDK pack versions side-by-side:

                Installing pack Microsoft.iOS.Sdk.net10.0_26.5 version 26.5.10284...
                Installing pack Microsoft.iOS.Sdk.net9.0_18.0 version 18.0.9617...
                Installing pack Microsoft.iOS.Sdk.net9.0_26.5 version 26.5.9002...
                Installing pack Microsoft.iOS.Sdk.net10.0_26.0 version 26.0.11017...
                

                ...and its build actually resolves to Microsoft.iOS.Sdk.net10.0_26.0 (26.0.11017), which is compatible with the installed Xcode 16.4, rather than the newer 26.5 pack. The ios workload (used by TodoApp.Avalonia.iOS, a plain Microsoft.NET.Sdk project referencing Avalonia.iOS) apparently only registers/selects the newest net10.0_26.5 pack and has no fallback, so it hits the hard Xcode-version check instead of negotiating down to a pack compatible with the runner's installed Xcode.

                Affected workflow

                • .github/workflows/build-samples-todoapp-avalonia.yml, job ios:
                  ios:
                  runs-on: macos-lateststeps:
                  - uses: actions/checkout@v7
                  - uses: actions/setup-dotnet@v5with:
                  dotnet-version: ${{ env.DOTNET_VERSION }} # 10.0.x
                  - name: Install iOS workloadrun: dotnet workload install ios
                  - name: Restore iOS projectrun: dotnet restore ${{ env.iOSProjectFile }}
                  - name: Build iOS projectrun: dotnet build ${{ env.iOSProjectFile }} --configuration ${{ env.DOTNET_CONFIGURATION }} --no-restore
                  No Xcode/workload version is pinned; dotnet workload install ios grabs whatever the latest Microsoft.iOS.Sdk.net10.0_* manifest advertises (currently 26.5, which requires Xcode 26.5), regardless of what Xcode version the macos-latest image actually ships (currently 16.4).

                Suggested fixes (any of)

                1. Pin a specific Microsoft.iOS.Sdk / rollback workload version for the ios workload install (e.g. dotnet workload install ios --version <manifest-version> or a rollback.json) so it matches whatever Xcode ships on macos-latest.
                2. Pin the runner to a specific macOS image/Xcode version instead of floating macos-latest (e.g. macos-15 and/or xcode-select to a known-good Xcode, similar to how maccy/xcode-select@... or maxim-lobanov/setup-xcode@v1 could be used), and keep it in sync with the .NET for iOS SDK's requirement.
                3. Investigate why the plain ios workload doesn't negotiate down to a compatible pack the way maui-ios does in the same run, and consider aligning TodoApp.Avalonia.iOS's workload install with whatever mechanism lets maui-ios pick net10.0_26.0 automatically.

                To reproduce

                Run the ios job of .github/workflows/build-samples-todoapp-avalonia.yml (or build-samples-todoapp-maui.yml for a comparison) on macos-latest as of image macos-15-arm6420260706.0213.1 (Xcode 16.4). The plain ios workload install 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

                Activity

                Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

                Metadata

                Metadata

                Assignees

                Labels

                ExamplesInfrastructureChanges to the build and release systemRequires TriageThis issue has not been checked by the project team.

                Type

                No type

                Projects

                No projects

                  Milestone

                  No milestone

                  Relationships

                  None yet

                  Development

                  No branches or pull requests

                  Issue actions