diff --git a/.github/workflows/build-samples-todoapp-avalonia.yml b/.github/workflows/build-samples-todoapp-avalonia.yml
index f84d0413..a5e5a08 100644
--- a/.github/workflows/build-samples-todoapp-avalonia.yml
+++ b/.github/workflows/build-samples-todoapp-avalonia.yml
@@ -8,18 +8,21 @@ env:
DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 1
DOTNET_NOLOGO: true
DOTNET_CONFIGURATION: 'Release'
- # NOTE: This sample's solution (TodoApp.Avalonia.sln) also contains Android and iOS
- # heads (net10.0-android / net10.0-ios), which require mobile workloads and are tracked
- # separately in https://github.com/CommunityToolkit/Datasync/issues/511 (Phase 3). Only
- # the shared and Desktop (net10.0) projects are built directly here, not the full .sln.
+ # NOTE: This sample's solution (TodoApp.Avalonia.sln) also contains Android and iOS heads
+ # (net10.0-android / net10.0-ios). Only the shared and Desktop (net10.0) projects are built
+ # directly here, not the full .sln - the Android and iOS heads are built by their own jobs
+ # below, each restoring/building its own project directly so only the workload needed for
+ # that head is installed on that runner.
SharedProjectFile: 'samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia/TodoApp.Avalonia.csproj'
DesktopProjectFile: 'samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.Desktop/TodoApp.Avalonia.Desktop.csproj'
+ AndroidProjectFile: 'samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.Android/TodoApp.Avalonia.Android.csproj'
+ iOSProjectFile: 'samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.iOS/TodoApp.Avalonia.iOS.csproj'
permissions:
contents: read
jobs:
- build:
+ desktop:
runs-on: ubuntu-latest
steps:
- name: Checkout Repository
@@ -47,3 +50,50 @@ jobs:
dotnet build ${{ env.DesktopProjectFile }}
--configuration ${{ env.DOTNET_CONFIGURATION }}
--no-restore
+
+ android:
+ runs-on: ubuntu-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 Android workload
+ run: dotnet workload install android
+
+ - name: Restore Android project
+ run: dotnet restore ${{ env.AndroidProjectFile }}
+
+ - name: Build Android project
+ run: >
+ dotnet build ${{ env.AndroidProjectFile }}
+ --configuration ${{ env.DOTNET_CONFIGURATION }}
+ --no-restore
+
+ ios:
+ # iOS builds 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 workload
+ run: dotnet workload install ios
+
+ - name: Restore iOS project
+ run: dotnet restore ${{ env.iOSProjectFile }}
+
+ - name: Build iOS project
+ run: >
+ dotnet build ${{ env.iOSProjectFile }}
+ --configuration ${{ env.DOTNET_CONFIGURATION }}
+ --no-restore
diff --git a/.github/workflows/build-samples-todoapp-maui.yml b/.github/workflows/build-samples-todoapp-maui.yml
new file mode 100644
index 0000000..5f03eda
--- /dev/null
+++ b/.github/workflows/build-samples-todoapp-maui.yml
@@ -0,0 +1,72 @@
+name: Build Sample - TodoApp MAUI (Android / iOS)
+
+on:
+ workflow_call:
+
+env:
+ DOTNET_VERSION: '10.0.x'
+ DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 1
+ DOTNET_NOLOGO: true
+ DOTNET_CONFIGURATION: 'Release'
+ # TodoApp.MAUI.csproj targets net10.0-android;net10.0-ios, with net10.0-windows10.0.19041.0
+ # conditionally appended only when building on Windows (that head is built separately in
+ # build-samples-todoapp-windows.yml). Restore/build here is explicitly scoped to one mobile
+ # TargetFramework per job so each runner only needs the workload for its own head.
+ MauiProjectFile: 'samples/todoapp/TodoApp.MAUI/TodoApp.MAUI.csproj'
+ AndroidTargetFramework: 'net10.0-android'
+ iOSTargetFramework: 'net10.0-ios'
+
+permissions:
+ contents: read
+
+jobs:
+ android:
+ runs-on: ubuntu-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 MAUI Android workload
+ run: dotnet workload install maui-android
+
+ - name: Restore MAUI project (Android TFM only)
+ # NOTE: 'dotnet restore' has no -f|--framework option (-f means --force there, unlike
+ # 'dotnet build'). Use the MSBuild property directly to scope restore to one TFM.
+ run: dotnet restore ${{ env.MauiProjectFile }} -p:TargetFramework=${{ env.AndroidTargetFramework }}
+
+ - name: Build MAUI project (Android TFM only)
+ run: >
+ dotnet build ${{ env.MauiProjectFile }}
+ -f ${{ env.AndroidTargetFramework }}
+ --configuration ${{ env.DOTNET_CONFIGURATION }}
+ --no-restore
+
+ ios:
+ # iOS builds 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 MAUI iOS workload
+ run: dotnet workload install maui-ios
+
+ - name: Restore MAUI project (iOS TFM only)
+ run: dotnet restore ${{ env.MauiProjectFile }} -p:TargetFramework=${{ env.iOSTargetFramework }}
+
+ - name: Build MAUI project (iOS TFM only)
+ run: >
+ dotnet build ${{ env.MauiProjectFile }}
+ -f ${{ env.iOSTargetFramework }}
+ --configuration ${{ env.DOTNET_CONFIGURATION }}
+ --no-restore
diff --git a/.github/workflows/build-samples-todoapp-uno.yml b/.github/workflows/build-samples-todoapp-uno.yml
new file mode 100644
index 0000000..635a486
--- /dev/null
+++ b/.github/workflows/build-samples-todoapp-uno.yml
@@ -0,0 +1,165 @@
+name: Build Sample - TodoApp Uno
+
+# NOTE: This workflow is NOT currently wired into build-samples.yml. TodoApp.Uno.csproj fails
+# to restore on every head with NU1605 (Uno.WinUI version downgrade caused by
+# CommunityToolkit.WinUI.Behaviors' floor vs. the Uno.Sdk pin in global.json) - see the jobs
+# below and https://github.com/CommunityToolkit/Datasync/issues/506, which is tracking the fix.
+# Re-add the `todoapp-uno` job to build-samples.yml (and to all-samples-built's `needs`) once
+# #506 is resolved and TodoApp.Uno.csproj restores cleanly.
+
+on:
+ workflow_call:
+
+env:
+ DOTNET_VERSION: '10.0.x'
+ DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 1
+ DOTNET_NOLOGO: true
+ DOTNET_CONFIGURATION: 'Release'
+ # TodoApp.Uno.csproj is a single Uno.Sdk project with a multi-head TargetFrameworks list
+ # (net10.0-android;net10.0-ios;net10.0-maccatalyst;net10.0-windows10.0.26100;
+ # net10.0-browserwasm;net10.0-desktop). No single runner can build every head (mobile heads
+ # need Android/iOS workloads, the Windows head needs windows-latest, etc.), so each job below
+ # restores/builds one head at a time, scoped via the MSBuild TargetFramework property.
+ UnoProjectFile: 'samples/todoapp/TodoApp.Uno/TodoApp.Uno/TodoApp.Uno.csproj'
+ AndroidTargetFramework: 'net10.0-android'
+ iOSTargetFramework: 'net10.0-ios'
+ MacCatalystTargetFramework: 'net10.0-maccatalyst'
+ WindowsTargetFramework: 'net10.0-windows10.0.26100'
+ BrowserWasmTargetFramework: 'net10.0-browserwasm'
+ DesktopTargetFramework: 'net10.0-desktop'
+
+permissions:
+ contents: read
+
+jobs:
+ android:
+ runs-on: ubuntu-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 Android workload
+ run: dotnet workload install android
+
+ - name: Restore Uno project (Android TFM only)
+ # NOTE: 'dotnet restore' has no -f|--framework option (-f means --force there, unlike
+ # 'dotnet build'). Use the MSBuild property directly to scope restore to one TFM.
+ run: dotnet restore ${{ env.UnoProjectFile }} -p:TargetFramework=${{ env.AndroidTargetFramework }}
+
+ - name: Build Uno project (Android TFM only)
+ run: >
+ dotnet build ${{ env.UnoProjectFile }}
+ -f ${{ env.AndroidTargetFramework }}
+ --configuration ${{ env.DOTNET_CONFIGURATION }}
+ --no-restore
+
+ 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
+
+ - name: Restore Uno project (Mac Catalyst TFM only)
+ run: dotnet restore ${{ env.UnoProjectFile }} -p:TargetFramework=${{ env.MacCatalystTargetFramework }}
+
+ - name: Build Uno project (Mac Catalyst TFM only)
+ run: >
+ dotnet build ${{ env.UnoProjectFile }}
+ -f ${{ env.MacCatalystTargetFramework }}
+ --configuration ${{ env.DOTNET_CONFIGURATION }}
+ --no-restore
+
+ windows:
+ runs-on: windows-latest
+ steps:
+ - name: Checkout Repository
+ uses: actions/checkout@v7
+
+ - name: Setup .NET
+ uses: actions/setup-dotnet@v5
+ with:
+ dotnet-version: ${{ env.DOTNET_VERSION }}
+
+ - name: Restore Uno project (Windows TFM only)
+ run: dotnet restore ${{ env.UnoProjectFile }} -p:TargetFramework=${{ env.WindowsTargetFramework }}
+
+ - name: Build Uno project (Windows TFM only)
+ run: >
+ dotnet build ${{ env.UnoProjectFile }}
+ -f ${{ env.WindowsTargetFramework }}
+ --configuration ${{ env.DOTNET_CONFIGURATION }}
+ --no-restore
+
+ browserwasm:
+ runs-on: ubuntu-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 WebAssembly build tools workload
+ run: dotnet workload install wasm-tools
+
+ - name: Restore Uno project (Browser WebAssembly TFM only)
+ run: dotnet restore ${{ env.UnoProjectFile }} -p:TargetFramework=${{ env.BrowserWasmTargetFramework }}
+
+ - name: Build Uno project (Browser WebAssembly TFM only)
+ run: >
+ dotnet build ${{ env.UnoProjectFile }}
+ -f ${{ env.BrowserWasmTargetFramework }}
+ --configuration ${{ env.DOTNET_CONFIGURATION }}
+ --no-restore
+
+ desktop:
+ # NOTE: this head (along with every other head in this file) currently fails to restore
+ # with NU1605 - see the file-level NOTE above and #506. #506 originally reported the NU1903
+ # Tmds.DBus audit warning for this head specifically; that warning alone is harmless (this
+ # repo does not configure NuGet audit to fail on warnings), but the NU1605 uncovered while
+ # investigating it turned out to be project-wide, not desktop-specific.
+ runs-on: ubuntu-latest
+ steps:
+ - name: Checkout Repository
+ uses: actions/checkout@v7
+
+ - name: Setup .NET
+ uses: actions/setup-dotnet@v5
+ with:
+ dotnet-version: ${{ env.DOTNET_VERSION }}
+
+ - name: Restore Uno project (Desktop TFM only)
+ run: dotnet restore ${{ env.UnoProjectFile }} -p:TargetFramework=${{ env.DesktopTargetFramework }}
+
+ - name: Build Uno project (Desktop TFM only)
+ run: >
+ dotnet build ${{ env.UnoProjectFile }}
+ -f ${{ env.DesktopTargetFramework }}
+ --configuration ${{ env.DOTNET_CONFIGURATION }}
+ --no-restore
diff --git a/.github/workflows/build-samples-todoapp-windows.yml b/.github/workflows/build-samples-todoapp-windows.yml
index 73fba07..dd8c2e4 100644
--- a/.github/workflows/build-samples-todoapp-windows.yml
+++ b/.github/workflows/build-samples-todoapp-windows.yml
@@ -14,8 +14,8 @@ env:
WpfProjectFile: 'samples/todoapp/TodoApp.WPF/TodoApp.WPF.csproj'
# TodoApp.MAUI.csproj targets net10.0-android;net10.0-ios, with net10.0-windows10.0.19041.0
# conditionally appended only when building on Windows. Android/iOS heads require separate
- # workloads and are tracked in https://github.com/CommunityToolkit/Datasync/issues/511 (Phase 3),
- # so restore/build here is explicitly scoped to the Windows TargetFramework only.
+ # workloads and are built by build-samples-todoapp-maui.yml instead, so restore/build here is
+ # explicitly scoped to the Windows TargetFramework only.
MauiProjectFile: 'samples/todoapp/TodoApp.MAUI/TodoApp.MAUI.csproj'
MauiWindowsTargetFramework: 'net10.0-windows10.0.19041.0'
diff --git a/.github/workflows/build-samples.yml b/.github/workflows/build-samples.yml
index 31faae6..aa7de6d 100644
--- a/.github/workflows/build-samples.yml
+++ b/.github/workflows/build-samples.yml
@@ -34,9 +34,23 @@ jobs:
todoapp-windows:
uses: ./.github/workflows/build-samples-todoapp-windows.yml
+ todoapp-maui:
+ uses: ./.github/workflows/build-samples-todoapp-maui.yml
+
+ # NOTE: todoapp-uno (build-samples-todoapp-uno.yml) is intentionally NOT wired in here.
+ # TodoApp.Uno.csproj fails to restore on every head with:
+ # NU1605: Detected package downgrade: Uno.WinUI from 5.5.87 to 5.4.22
+ # TodoApp.Uno -> CommunityToolkit.WinUI.Behaviors 8.2.250402 -> Uno.WinUI (>= 5.5.87)
+ # TodoApp.Uno -> Uno.WinUI (>= 5.4.22)
+ # This is unconditional (CommunityToolkit.WinUI.Behaviors has no TFM condition on its
+ # PackageReference), so it blocks every TFM, not just the desktop head as originally
+ # suspected. See https://github.com/CommunityToolkit/Datasync/issues/506, which is tracking
+ # the underlying Uno.WinUI/CommunityToolkit.WinUI.Behaviors version conflict. Re-enable this
+ # job (add it back to the jobs list and to all-samples-built's needs below) once #506 is
+ # resolved and TodoApp.Uno.csproj restores cleanly.
+
# Single aggregation point so branch protection only needs to require one check,
- # regardless of how many sample workflows are added over time (see Phase 3
- # follow-up: https://github.com/CommunityToolkit/Datasync/issues/511).
+ # regardless of how many sample workflows are added over time.
all-samples-built:
name: All samples built
if: always()
@@ -48,6 +62,7 @@ jobs:
- todoapp-tutorial
- todoapp-avalonia
- todoapp-windows
+ - todoapp-maui
runs-on: ubuntu-latest
steps:
- name: Check sample build results
diff --git a/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.iOS/Info.plist b/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.iOS/Info.plist
index 8446c28..643284c 100644
--- a/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.iOS/Info.plist
+++ b/samples/todoapp/TodoApp.Avalonia/TodoApp.Avalonia.iOS/Info.plist
@@ -13,7 +13,7 @@
LSRequiresIPhoneOS
MinimumOSVersion
- 13.0
+ 15.0
UIDeviceFamily
1