diff --git a/.github/workflows/azure-static-webapp.yml b/.github/workflows/azure-static-webapp.yml
index 04d707302..ba7f55f38 100644
--- a/.github/workflows/azure-static-webapp.yml
+++ b/.github/workflows/azure-static-webapp.yml
@@ -14,8 +14,8 @@ on:
jobs:
build_and_deploy_job:
env:
- DIST_PATH: Uno.Gallery/bin/Release/net9.0-browserwasm/publish/wwwroot
- DotnetVersion: '9.0.300'
+ DIST_PATH: Uno.Gallery/bin/Release/net10.0-browserwasm/publish/wwwroot
+ DotNetVersion: '10.0.100'
if: github.event_name == 'push' || (github.event_name == 'pull_request' && github.event.action != 'closed')
runs-on: ubuntu-latest
@@ -56,14 +56,14 @@ jobs:
cache-name: cache-dotnet-install
with:
path: ${{ github.workspace }}/.dotnet
- key: ${{ runner.os }}-build-dotnet-${{ env.DotnetVersion }}
+ key: ${{ runner.os }}-build-dotnet-${{ env.DotNetVersion }}
restore-keys: |
- ${{ runner.os }}-build-dotnet-${{ env.DotnetVersion }}
+ ${{ runner.os }}-build-dotnet-${{ env.DotNetVersion }}
- name: Setup .NET
uses: actions/setup-dotnet@v1.7.2
with:
- dotnet-version: ${{ env.DotnetVersion }}
+ dotnet-version: ${{ env.DotNetVersion }}
include-prerelease: true
- run: |
@@ -79,7 +79,7 @@ jobs:
- run: |
cd Uno.Gallery
- dotnet publish -c Release -f net9.0-browserwasm "/p:PackageVersion=${{ steps.nbgv.outputs.SemVer2 }}" /bl:../binlogs/output.binlog
+ dotnet publish -c Release -f net10.0-browserwasm "/p:PackageVersion=${{ steps.nbgv.outputs.SemVer2 }}" /bl:../binlogs/output.binlog
name: Build Gallery
- uses: actions/upload-artifact@v4
diff --git a/.run/Readme.md b/.run/Readme.md
new file mode 100644
index 000000000..6e72638a0
--- /dev/null
+++ b/.run/Readme.md
@@ -0,0 +1,3 @@
+# About the `.run` folder
+
+This folder is present to add support for the [Rider IDE](https://aka.platform.uno/rider-getstarted). You can remove this folder safely if you're not using Rider.
diff --git a/.run/Uno.Gallery (WebAssembly IIS Express).run.xml b/.run/Uno.Gallery (WebAssembly IIS Express).run.xml
new file mode 100644
index 000000000..24bb526cc
--- /dev/null
+++ b/.run/Uno.Gallery (WebAssembly IIS Express).run.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.run/Uno.Gallery (WebAssembly).run.xml b/.run/Uno.Gallery (WebAssembly).run.xml
new file mode 100644
index 000000000..050c64989
--- /dev/null
+++ b/.run/Uno.Gallery (WebAssembly).run.xml
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.run/Uno.Gallery.run.xml b/.run/Uno.Gallery.run.xml
new file mode 100644
index 000000000..62bdf7910
--- /dev/null
+++ b/.run/Uno.Gallery.run.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
new file mode 100644
index 000000000..a63ad4009
--- /dev/null
+++ b/.vscode/extensions.json
@@ -0,0 +1,5 @@
+{
+ "recommendations": [
+ "unoplatform.vscode"
+ ],
+}
diff --git a/.vscode/launch.json b/.vscode/launch.json
new file mode 100644
index 000000000..57dc1f712
--- /dev/null
+++ b/.vscode/launch.json
@@ -0,0 +1,77 @@
+{
+ // Use IntelliSense to find out which attributes exist for C# debugging
+ // Use hover for the description of the existing attributes
+ // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md
+ "version": "0.2.0",
+ "configurations": [
+ {
+ "name": "Uno Platform Mobile Debug",
+ "type": "Uno",
+ "request": "launch",
+ // any Uno* task will do, this is simply to satisfy vscode requirement when a launch.json is present
+ "preLaunchTask": "Uno: android | Debug | android-x64"
+ },
+ {
+ // Use IntelliSense to find out which attributes exist for C# debugging
+ // Use hover for the description of the existing attributes
+ // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md
+ "name": "Uno Platform WebAssembly Debug (Chrome)",
+ "type": "chrome",
+ "request": "launch",
+ "url": "http://localhost:5000",
+ "webRoot": "${workspaceFolder}/Uno.Gallery",
+ "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
+ "timeout": 30000,
+ "preLaunchTask": "build-wasm",
+ "server": {
+ "runtimeExecutable": "dotnet",
+ "program": "run",
+ "args": ["--no-build","-f","net10.0-browserwasm","--launch-profile", "Gallery (WebAssembly)"],
+ "outputCapture": "std",
+ "timeout": 30000,
+ "cwd": "${workspaceFolder}/Uno.Gallery"
+ }
+ },
+ {
+ // Use IntelliSense to find out which attributes exist for C# debugging
+ // Use hover for the description of the existing attributes
+ // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md
+ "name": "Uno Platform WebAssembly Debug (Edge)",
+ "type": "msedge",
+ "request": "launch",
+ "url": "http://localhost:5000",
+ "webRoot": "${workspaceFolder}/Uno.Gallery",
+ "inspectUri": "{wsProtocol}://{url.hostname}:{url.port}/_framework/debug/ws-proxy?browser={browserInspectUri}",
+ "timeout": 30000,
+ "preLaunchTask": "build-wasm",
+ "server": {
+ "runtimeExecutable": "dotnet",
+ "program": "run",
+ "args": ["--no-build","-f","net10.0-browserwasm","--launch-profile", "Gallery (WebAssembly)"],
+ "outputCapture": "std",
+ "timeout": 30000,
+ "cwd": "${workspaceFolder}/Uno.Gallery"
+ }
+ },
+ {
+ // Use IntelliSense to find out which attributes exist for C# debugging
+ // Use hover for the description of the existing attributes
+ // For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md
+ "name": "Uno Platform Desktop Debug",
+ "type": "coreclr",
+ "request": "launch",
+ "preLaunchTask": "build-desktop",
+ // If you have changed target frameworks, make sure to update the program path.
+ "program": "${workspaceFolder}/Uno.Gallery/bin/Debug/net10.0-desktop/Uno.Gallery.dll",
+ "args": [],
+ "launchSettingsProfile": "Gallery (Desktop)",
+ "env": {
+ "DOTNET_MODIFIABLE_ASSEMBLIES": "debug"
+ },
+ "cwd": "${workspaceFolder}/Uno.Gallery",
+ // For more information about the 'console' field, see https://aka.ms/VSCode-CS-LaunchJson-Console
+ "console": "internalConsole",
+ "stopAtEntry": false
+ },
+ ]
+}
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 32396765d..3405922d5 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,3 +1,10 @@
{
- "dotnet.defaultSolution": "Uno.Gallery.sln"
-}
\ No newline at end of file
+ "explorer.fileNesting.enabled": true,
+ "explorer.fileNesting.expand": false,
+ "explorer.fileNesting.patterns": {
+ "*.xaml": "$(capture).xaml.cs"
+ },
+ "files.associations": {
+ "global.json": "jsonc"
+ }
+}
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
new file mode 100644
index 000000000..1473cbd3c
--- /dev/null
+++ b/.vscode/tasks.json
@@ -0,0 +1,57 @@
+{
+ "version": "2.0.0",
+ "tasks": [
+ {
+ "label": "build-wasm",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "build",
+ "${workspaceFolder}/Uno.Gallery/Uno.Gallery.csproj",
+ "/property:GenerateFullPaths=true",
+ "/property:TargetFramework=net10.0-browserwasm",
+ "/consoleloggerparameters:NoSummary"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "publish-wasm",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "publish",
+ "${workspaceFolder}/Uno.Gallery/Uno.Gallery.csproj",
+ "/property:GenerateFullPaths=true",
+ "/property:TargetFramework=net10.0-browserwasm",
+ "/consoleloggerparameters:NoSummary"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "build-desktop",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "build",
+ "${workspaceFolder}/Uno.Gallery/Uno.Gallery.csproj",
+ "/property:GenerateFullPaths=true",
+ "/property:TargetFramework=net10.0-desktop",
+ "/consoleloggerparameters:NoSummary"
+ ],
+ "problemMatcher": "$msCompile"
+ },
+ {
+ "label": "publish-desktop",
+ "command": "dotnet",
+ "type": "process",
+ "args": [
+ "publish",
+ "${workspaceFolder}/Uno.Gallery/Uno.Gallery.csproj",
+ "/property:GenerateFullPaths=true",
+ "/property:TargetFramework=net10.0-desktop",
+ "/consoleloggerparameters:NoSummary"
+ ],
+ "problemMatcher": "$msCompile"
+ }
+ ]
+}
diff --git a/Directory.Build.props b/Directory.Build.props
index cd74666ad..7b0318f91 100644
--- a/Directory.Build.props
+++ b/Directory.Build.props
@@ -11,6 +11,12 @@
PRI257: Ignore default language (en) not being one of the included resources (eg en-us, en-uk)
-->
$(NoWarn);NU1507;NETSDK1201;PRI257
+
+
diff --git a/Uno.Gallery.UITests/Uno.Gallery.UITests.csproj b/Uno.Gallery.UITests/Uno.Gallery.UITests.csproj
index 0539978d0..57707bd36 100644
--- a/Uno.Gallery.UITests/Uno.Gallery.UITests.csproj
+++ b/Uno.Gallery.UITests/Uno.Gallery.UITests.csproj
@@ -1,6 +1,6 @@
- net9.0
+ net10.0
true
diff --git a/Uno.Gallery/App.xaml.cs b/Uno.Gallery/App.xaml.cs
index 8b8141937..76e2f7f94 100644
--- a/Uno.Gallery/App.xaml.cs
+++ b/Uno.Gallery/App.xaml.cs
@@ -85,14 +85,14 @@ private void OnLaunchedOrActivated()
if (isFirstLaunch)
{
-#if __IOS__ && USE_UITESTS && !__MACCATALYST__ && !DEBUG
+#if __IOS__ && USE_UITESTS && !DEBUG
// requires Xamarin Test Cloud Agent
Xamarin.Calabash.Start();
#endif
InitializeWindow(MainWindow);
}
-
+
// Ensure the current window is active
MainWindow.Activate();
}
diff --git a/Uno.Gallery/Directory.Build.props b/Uno.Gallery/Directory.Build.props
new file mode 100644
index 000000000..e06d01a7d
--- /dev/null
+++ b/Uno.Gallery/Directory.Build.props
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+ true
+ false
+
+
diff --git a/Uno.Gallery/Platforms/MacCatalyst/Entitlements.plist b/Uno.Gallery/Platforms/Desktop/Entitlements.plist
similarity index 63%
rename from Uno.Gallery/Platforms/MacCatalyst/Entitlements.plist
rename to Uno.Gallery/Platforms/Desktop/Entitlements.plist
index 1eb6a85cb..c68cb69ba 100644
--- a/Uno.Gallery/Platforms/MacCatalyst/Entitlements.plist
+++ b/Uno.Gallery/Platforms/Desktop/Entitlements.plist
@@ -2,10 +2,15 @@
+
com.apple.security.app-sandbox
+
+
com.apple.security.network.client
+
+
com.apple.security.cs.disable-library-validation
diff --git a/Uno.Gallery/Platforms/MacCatalyst/Info.plist b/Uno.Gallery/Platforms/Desktop/Info.plist
similarity index 74%
rename from Uno.Gallery/Platforms/MacCatalyst/Info.plist
rename to Uno.Gallery/Platforms/Desktop/Info.plist
index 393136695..eddd333f9 100644
--- a/Uno.Gallery/Platforms/MacCatalyst/Info.plist
+++ b/Uno.Gallery/Platforms/Desktop/Info.plist
@@ -12,22 +12,10 @@
1.0
CFBundleVersion
1.0
- UIDeviceFamily
-
- 2
-
- UILaunchStoryboardName
- LaunchScreen
NSLocationWhenInUseUsageDescription
This app requires location for the Geolocator sample to work. The data is not shared.
NSMotionUsageDescription
This app requires motion tracking for the Pedometer sample to work.
- UISupportedInterfaceOrientations
-
- UIInterfaceOrientationPortrait
- UIInterfaceOrientationLandscapeLeft
- UIInterfaceOrientationLandscapeRight
-
XSAppIconAssets
Assets.xcassets/icon.appiconset
UIAppFonts
@@ -38,5 +26,7 @@
LSApplicationCategoryType
public.app-category.utilities
+ LSMinimumSystemVersion
+ 15.0
diff --git a/Uno.Gallery/Platforms/MacCatalyst/Main.maccatalyst.cs b/Uno.Gallery/Platforms/MacCatalyst/Main.maccatalyst.cs
deleted file mode 100644
index ac1d0f6ae..000000000
--- a/Uno.Gallery/Platforms/MacCatalyst/Main.maccatalyst.cs
+++ /dev/null
@@ -1,25 +0,0 @@
-using UIKit;
-using Uno.UI.Hosting;
-
-namespace Uno.Gallery
-{
- public class EntryPoint
-{
- // This is the main entry point of the application.
- static void Main(string[] args)
- {
-#if !IS_UIKIT_SKIA
- // if you want to use a different Application Delegate class from "AppDelegate"
- // you can specify it here.
- UIApplication.Main(args, null, typeof(App));
-#else
- var host = UnoPlatformHostBuilder.Create()
- .App(() => new App())
- .UseAppleUIKit()
- .Build();
-
- host.Run();
-#endif
- }
- }
-}
diff --git a/Uno.Gallery/Platforms/MacCatalyst/Media.xcassets/LaunchImages.launchimage/Contents.json b/Uno.Gallery/Platforms/MacCatalyst/Media.xcassets/LaunchImages.launchimage/Contents.json
deleted file mode 100644
index 69555e440..000000000
--- a/Uno.Gallery/Platforms/MacCatalyst/Media.xcassets/LaunchImages.launchimage/Contents.json
+++ /dev/null
@@ -1,58 +0,0 @@
-{
- "images": [
- {
- "orientation": "portrait",
- "extent": "full-screen",
- "minimum-system-version": "7.0",
- "scale": "2x",
- "size": "640x960",
- "idiom": "iphone"
- },
- {
- "orientation": "portrait",
- "extent": "full-screen",
- "minimum-system-version": "7.0",
- "subtype": "retina4",
- "scale": "2x",
- "size": "640x1136",
- "idiom": "iphone"
- },
- {
- "orientation": "portrait",
- "extent": "full-screen",
- "minimum-system-version": "7.0",
- "scale": "1x",
- "size": "768x1024",
- "idiom": "ipad"
- },
- {
- "orientation": "landscape",
- "extent": "full-screen",
- "minimum-system-version": "7.0",
- "scale": "1x",
- "size": "1024x768",
- "idiom": "ipad"
- },
- {
- "orientation": "portrait",
- "extent": "full-screen",
- "minimum-system-version": "7.0",
- "scale": "2x",
- "size": "1536x2048",
- "idiom": "ipad"
- },
- {
- "orientation": "landscape",
- "extent": "full-screen",
- "minimum-system-version": "7.0",
- "scale": "2x",
- "size": "2048x1536",
- "idiom": "ipad"
- }
- ],
- "properties": {},
- "info": {
- "version": 1,
- "author": ""
- }
-}
\ No newline at end of file
diff --git a/Uno.Gallery/Properties/launchSettings.json b/Uno.Gallery/Properties/launchSettings.json
index 7d3df4b44..a54e4c47d 100644
--- a/Uno.Gallery/Properties/launchSettings.json
+++ b/Uno.Gallery/Properties/launchSettings.json
@@ -42,7 +42,7 @@
},
"Gallery (Desktop WSL2)": {
"commandName": "WSL2",
- "commandLineArgs": "{ProjectDir}/bin/Debug/net9.0-desktop/Uno.Gallery.dll",
+ "commandLineArgs": "{ProjectDir}/bin/Debug/net10.0-desktop/Uno.Gallery.dll",
"distributionName": "",
"compatibleTargetFramework": "desktop"
}
diff --git a/Uno.Gallery/Uno.Gallery.csproj b/Uno.Gallery/Uno.Gallery.csproj
index 49d6250f7..4d81cd325 100644
--- a/Uno.Gallery/Uno.Gallery.csproj
+++ b/Uno.Gallery/Uno.Gallery.csproj
@@ -1,18 +1,17 @@
-
+
-
+
-
+
$(TargetFrameworkOverride)
- net9.0-android;
- net9.0-ios;
- net9.0-maccatalyst;
- net9.0-windows10.0.19041;
- net9.0-desktop;
- net9.0-browserwasm;
+ net10.0-android;
+ net10.0-ios;
+ net10.0-windows10.0.19041;
+ net10.0-desktop;
+ net10.0-browserwasm;
uno.platform.gallery
- com.nventive.uno.ui.demo
- uno.platform.gallery_native
+ com.nventive.uno.ui.demo
+ uno.platform.gallery.native
- com.nventive.uno.gallery
- uno.platform.gallery.native
+ com.nventive.uno.gallery
+ uno.platform.gallery.native
- com.nventive.uno.gallery
- uno.platform.gallery.native
+ com.nventive.uno.gallery
1.0
@@ -55,11 +53,11 @@
https://aka.platform.uno/singleproject-features
-->
- true
+ true
false
- true
+ true
false
- true
+ true
false
Material;
@@ -101,12 +99,11 @@
+ or '$([MSBuild]::GetTargetPlatformIdentifier($(TargetFramework)))' == 'ios'">
-
+
@@ -148,32 +145,18 @@
-
- true
- Apple Distribution: Uno Platform Inc. (PD74CHS9Z5)
- 3rd Party Mac Developer Installer
- true
- true
- true
- MacCatalyst\Entitlements.plist
-
- Uno Gallery Native (Catalyst)
- Uno Gallery Native Canary (Catalyst)
-
- Uno Gallery (Catalyst)
- Uno Gallery Canary (Catalyst)
-
+
true
-
+
-
+
@@ -238,4 +221,9 @@
+
+
+ true
+
+
diff --git a/azure-pipelines.yml b/azure-pipelines.yml
index 4b07720b5..3328f3625 100644
--- a/azure-pipelines.yml
+++ b/azure-pipelines.yml
@@ -42,127 +42,159 @@ variables:
IsLightBuild: $[eq(variables['Build.Reason'], 'PullRequest')]
IsCanaryBranch: $[startsWith(variables['Build.SourceBranch'], 'refs/heads/canaries/')]
- XCODE_ROOT: '/Applications/Xcode_16.4.app'
- XCODE_ROOT_UITESTS: '/Applications/Xcode_16.4.app'
+ XCODE_ROOT: '/Applications/Xcode_26.0.1.app'
+ XCODE_ROOT_UITESTS: '/Applications/Xcode_26.0.1.app'
# Required to about trashing azdo hosted agents
AotCompileMaxDegreeOfParallelism: 3
stages:
-- stage: Android
- displayName: 'Android'
- dependsOn: []
- jobs:
- - job: Windows_Android_Mobile
- strategy:
- matrix:
- Android_Store:
- ApplicationPlatform: AnyCPU
- ArtifactName: Android
- BuildForPlayStore: True
- VersionCodeOffset: 1
- UseNativeRendering: true
- VariantName: Native
- Android_Skia_Store:
- ApplicationPlatform: AnyCPU
- ArtifactName: Android
- BuildForPlayStore: True
- VersionCodeOffset: 1
- UseNativeRendering: false
- VariantName: Skia
-
- pool:
- vmImage: windows-2022
-
- variables:
- - group: 'UADO Keystore' # Import all variables for the signing from the library in azure devops
-
- steps:
- - template: build/stage-build-android-mobile.yml
-
-
-- stage: Windows
- displayName: 'Windows'
- dependsOn: []
- jobs:
- - job: Windows_WinAppSDK
- pool:
- vmImage: windows-2022
-
- variables:
- - group: uno-codesign-vault
- - group: 'UADO Keystore' # Import all variables for the Android signing from the library in azure devops
- - group: 'Uno Platform authenticode signing' # Import all variables for the signing from the library in azure devops
- - name: ApplicationPlatform
- value: x86 # switch back to x64 once CommunityToolkit.WinUI.UI supports x64 (https://github.com/CommunityToolkit/Lottie-Windows/issues/515#issuecomment-1662305826)
- - name: BuildTargetFramework
- value: net9.0-windows10.0.19041
- - name: ArtifactName
- value: Windows
- - name: VersionCodeOffset
- value: 50
- - name: PackageOutputPath
- value: $(Build.ArtifactStagingDirectory)
-
- steps:
- - template: build/stage-build-windows.yml
+# - stage: Android
+# displayName: 'Android'
+# dependsOn: []
+# jobs:
+# - job: Windows_Android_Mobile
+# displayName: 'Windows Android Mobile'
+# strategy:
+# matrix:
+# Android_Store:
+# ApplicationPlatform: AnyCPU
+# ArtifactName: Android
+# BuildForPlayStore: True
+# VersionCodeOffset: 1
+# UseNativeRendering: true
+# VariantName: Native
+# Android_Skia_Store:
+# ApplicationPlatform: AnyCPU
+# ArtifactName: Android
+# BuildForPlayStore: True
+# VersionCodeOffset: 1
+# UseNativeRendering: false
+# VariantName: Skia
+#
+# pool:
+# vmImage: windows-2022
+#
+# variables:
+# - group: 'UADO Keystore' # Import all variables for the signing from the library in azure devops
+#
+# steps:
+# - template: build/stage-build-android-mobile.yml
+#
+#
+# - stage: Windows
+# displayName: 'Windows'
+# dependsOn: []
+# jobs:
+# - job: Windows_WinAppSDK
+# displayName: 'Windows WinAppSDK'
+# pool:
+# vmImage: windows-2022
+#
+# variables:
+# - group: uno-codesign-vault
+# - group: 'UADO Keystore' # Import all variables for the Android signing from the library in azure devops
+# - group: 'Uno Platform authenticode signing' # Import all variables for the signing from the library in azure devops
+# - name: ApplicationPlatform
+# value: x86 # switch back to x64 once CommunityToolkit.WinUI.UI supports x64 (https://github.com/CommunityToolkit/Lottie-Windows/issues/515#issuecomment-1662305826)
+# - name: BuildTargetFramework
+# value: net10.0-windows10.0.19041
+# - name: ArtifactName
+# value: Windows
+# - name: VersionCodeOffset
+# value: 50
+# - name: PackageOutputPath
+# value: $(Build.ArtifactStagingDirectory)
+#
+# steps:
+# - template: build/stage-build-windows.yml
+#
+# - stage: Skia_Desktop
+# displayName: 'Skia Desktop'
+# dependsOn: []
+# jobs:
+# - job: Windows_Desktop
+# displayName: 'Windows Desktop'
+# pool:
+# vmImage: windows-2022
+#
+# variables:
+# - group: 'UADO Keystore' # Import all variables for the signing from the library in azure devops
+#
+# steps:
+# - template: build/stage-build-skia-desktop.yml
+#
+# - job: macOS_Desktop
+# displayName: 'macOS Desktop'
+# timeoutInMinutes: 90
+# pool:
+# vmImage: macos-15
+#
+# variables:
+# - name: BuildTargetFramework
+# value: net10.0-desktop
+# - name: ArtifactName
+# value: macOS-desktop
+# - name: ApplicationBuildNumberOffset
+# value: 50
+# - name: SkipUnknownFrameworks
+# value: true
+# - group: unoplatform.apple.ios.appstore.distribution
+#
+# steps:
+# - task: InstallAppleCertificate@2
+# displayName: Install Certificate
+# inputs:
+# certSecureFile: UnoPlatform-Apple-Distribution.p12
+# certPwd: $(appleappstorecertificatepassword)
+# keychain: temp
+#
+# - task: InstallAppleCertificate@2
+# displayName: Install Certificate (Mac Installer)
+# inputs:
+# certSecureFile: UnoPlatform-MacInstaller.p12
+# certPwd: $(appleappstorecertificatepassword)
+# keychain: temp
+# continueOnError: true
+#
+# # macOS Desktop Provisioning Profiles
+# - task: InstallAppleProvisioningProfile@1
+# displayName: 'Install Apple Provisioning Profile'
+# inputs:
+# provisioningProfileLocation: 'secureFiles'
+# provProfileSecureFile: Uno_Gallery_macOS_Desktop.provisionprofile
+#
+# - task: InstallAppleProvisioningProfile@1
+# displayName: 'Install Apple Provisioning Profile'
+# inputs:
+# provisioningProfileLocation: 'secureFiles'
+# provProfileSecureFile: Uno_Gallery_Canary_macOS_Desktop.provisionprofile
+#
+# - template: build/templates/xcode-select.yml
+# parameters:
+# xCodeRoot: $(XCODE_ROOT)
+#
+# - template: build/stage-build-macos-desktop.yml
- stage: Skia_Desktop
displayName: 'Skia Desktop'
dependsOn: []
jobs:
- - job: Windows_Desktop
- pool:
- vmImage: windows-2022
-
- variables:
- - group: 'UADO Keystore' # Import all variables for the signing from the library in azure devops
-
- steps:
- - template: build/stage-build-skia-desktop.yml
-
-- stage: Apple
- displayName: 'Apple'
- dependsOn: []
- jobs:
- - job: macOS_netcore
+ - job: macOS_Desktop
+ displayName: 'macOS Desktop'
timeoutInMinutes: 90
- strategy:
- matrix:
- iOS:
- BuildTargetFramework: net9.0-ios
- ArtifactName: iOS-mobile
- ApplicationBuildNumberOffset: 50
- BuildCommand: publish
- UseNativeRendering: true
- VariantName: Native
- Catalyst:
- BuildTargetFramework: net9.0-maccatalyst
- ArtifactName: Catalyst
- ApplicationBuildNumberOffset: 50
- BuildCommand: build
- UseNativeRendering: true
- VariantName: Native
- iOS_Skia:
- BuildTargetFramework: net9.0-ios
- ArtifactName: iOS-mobile
- ApplicationBuildNumberOffset: 50
- BuildCommand: publish
- UseNativeRendering: false
- VariantName: Skia
- Catalyst_Skia:
- BuildTargetFramework: net9.0-maccatalyst
- ArtifactName: Catalyst
- ApplicationBuildNumberOffset: 50
- BuildCommand: build
- UseNativeRendering: false
- VariantName: Skia
pool:
vmImage: macos-15
variables:
+ - name: BuildTargetFramework
+ value: net10.0-desktop
+ - name: ArtifactName
+ value: macOS-desktop
+ - name: ApplicationBuildNumberOffset
+ value: 50
- name: SkipUnknownFrameworks
- value: true # Used by TargetFrameworks.Filtering package
+ value: true
- group: unoplatform.apple.ios.appstore.distribution
steps:
@@ -172,131 +204,163 @@ stages:
certSecureFile: UnoPlatform-Apple-Distribution.p12
certPwd: $(appleappstorecertificatepassword)
keychain: temp
- # disabled because of azure devops failing to uninstall as of 2022-11-16
- # deleteCert: true
- task: InstallAppleCertificate@2
- displayName: Install Certificate
+ displayName: Install Certificate (Mac Installer)
inputs:
certSecureFile: UnoPlatform-MacInstaller.p12
certPwd: $(appleappstorecertificatepassword)
keychain: temp
- # disabled because of azure devops failing to uninstall as of 2022-11-16
- # deleteCert: true
+ continueOnError: true
- #
- # Gallery Skia
- #
- - task: InstallAppleProvisioningProfile@1
- displayName: 'Install Apple Provisioning Profile'
- inputs:
- provisioningProfileLocation: 'secureFiles'
- provProfileSecureFile: Uno_Gallery_Catalyst.provisionprofile
-
+ # macOS Desktop Provisioning Profiles
- task: InstallAppleProvisioningProfile@1
displayName: 'Install Apple Provisioning Profile'
inputs:
provisioningProfileLocation: 'secureFiles'
- provProfileSecureFile: Uno_Gallery_Canary_Catalyst.provisionprofile
-
- - task: InstallAppleProvisioningProfile@1
- displayName: 'Install Apple Provisioning Profile'
- inputs:
- provisioningProfileLocation: 'secureFiles'
- provProfileSecureFile: Uno_Gallery_iOS.mobileprovision
-
- - task: InstallAppleProvisioningProfile@1
- displayName: 'Install Apple Provisioning Profile'
- inputs:
- provisioningProfileLocation: 'secureFiles'
- provProfileSecureFile: Uno_Gallery_Canary_iOS.mobileprovision
+ provProfileSecureFile: Uno_Gallery_macOS_Desktop.provisionprofile
- #
- # Gallery Native
- #
-
- - task: InstallAppleProvisioningProfile@1
- displayName: 'Install Apple Provisioning Profile'
- inputs:
- provisioningProfileLocation: 'secureFiles'
- provProfileSecureFile: Uno_Gallery_Native_Catalyst.provisionprofile
-
- - task: InstallAppleProvisioningProfile@1
- displayName: 'Install Apple Provisioning Profile'
- inputs:
- provisioningProfileLocation: 'secureFiles'
- provProfileSecureFile: Uno_Gallery_Native_Canary_Catalyst.provisionprofile
-
- - task: InstallAppleProvisioningProfile@1
- displayName: 'Install Apple Provisioning Profile'
- inputs:
- provisioningProfileLocation: 'secureFiles'
- provProfileSecureFile: Uno_Gallery_Native_iOS.mobileprovision
-
- task: InstallAppleProvisioningProfile@1
displayName: 'Install Apple Provisioning Profile'
inputs:
provisioningProfileLocation: 'secureFiles'
- provProfileSecureFile: Uno_Gallery_Native_Canary_iOS.mobileprovision
-
+ provProfileSecureFile: Uno_Gallery_Canary_macOS_Desktop.provisionprofile
- template: build/templates/xcode-select.yml
parameters:
xCodeRoot: $(XCODE_ROOT)
- - template: build/stage-build-mobile.yml
-
-- stage: WebAssembly
- displayName: 'WebAssembly'
- dependsOn: []
- jobs:
- - job: WebAssembly
- timeoutInMinutes: 60
-
- pool:
- vmImage: ubuntu-latest
-
- strategy:
- matrix:
- DOM:
- ArtifactName: WASM-DOM
- UseNativeRendering: true
- Skia:
- ArtifactName: WASM-Skia
- UseNativeRendering: false
-
- variables:
- SkipUnknownFrameworks: true
-
- steps:
- - template: build/stage-build-wasm.yml
-
-- stage: WebAssembly_Tests
- displayName: 'WebAssembly Tests'
- dependsOn: []
- jobs:
- - template: build/stage-uitests-wasm.yml
-
-- stage: iOS_Tests
- displayName: 'iOS Tests'
- dependsOn: []
- jobs:
- - template: build/stage-uitests-ios.yml
-
-- stage: Android_Tests
- displayName: 'Android Tests'
- dependsOn: []
- jobs:
- - template: build/stage-uitests-android.yml
+ - template: build/stage-build-macos-desktop.yml
-- ${{ if startsWith(variables['Build.SourceBranch'], 'refs/heads/canaries/dev') }}:
- - template: build/templates/canary-publish/stage-publish-wasm-canary.yml
- - template: build/templates/canary-publish/stage-publish-ios-canary.yml
- - template: build/templates/canary-publish/stage-publish-catalyst-canary.yml
- - template: build/templates/canary-publish/stage-publish-android-canary.yml
+# - stage: iOS
+# displayName: 'iOS'
+# dependsOn: []
+# jobs:
+# - job: iOS_Mobile
+# displayName: 'iOS Mobile'
+# timeoutInMinutes: 90
+# strategy:
+# matrix:
+# iOS:
+# BuildTargetFramework: net10.0-ios
+# ArtifactName: iOS-mobile
+# ApplicationBuildNumberOffset: 50
+# BuildCommand: publish
+# UseNativeRendering: true
+# VariantName: Native
+# iOS_Skia:
+# BuildTargetFramework: net10.0-ios
+# ArtifactName: iOS-mobile
+# ApplicationBuildNumberOffset: 50
+# BuildCommand: publish
+# UseNativeRendering: false
+# VariantName: Skia
+# pool:
+# vmImage: macos-15
+#
+# variables:
+# - name: SkipUnknownFrameworks
+# value: true # Used by TargetFrameworks.Filtering package
+# - group: unoplatform.apple.ios.appstore.distribution
+#
+# steps:
+# - task: InstallAppleCertificate@2
+# displayName: Install Certificate
+# inputs:
+# certSecureFile: UnoPlatform-Apple-Distribution.p12
+# certPwd: $(appleappstorecertificatepassword)
+# keychain: temp
+# # disabled because of azure devops failing to uninstall as of 2022-11-16
+# # deleteCert: true
+#
+# # iOS Provisioning Profiles (Skia variant)
+# - task: InstallAppleProvisioningProfile@1
+# displayName: 'Install Apple Provisioning Profile'
+# inputs:
+# provisioningProfileLocation: 'secureFiles'
+# provProfileSecureFile: Uno_Gallery_iOS.mobileprovision
+#
+# - task: InstallAppleProvisioningProfile@1
+# displayName: 'Install Apple Provisioning Profile'
+# inputs:
+# provisioningProfileLocation: 'secureFiles'
+# provProfileSecureFile: Uno_Gallery_Canary_iOS.mobileprovision
+#
+# # iOS Provisioning Profiles (Native variant)
+# - task: InstallAppleProvisioningProfile@1
+# displayName: 'Install Apple Provisioning Profile'
+# inputs:
+# provisioningProfileLocation: 'secureFiles'
+# provProfileSecureFile: Uno_Gallery_Native_iOS.mobileprovision
+#
+# - task: InstallAppleProvisioningProfile@1
+# displayName: 'Install Apple Provisioning Profile'
+# inputs:
+# provisioningProfileLocation: 'secureFiles'
+# provProfileSecureFile: Uno_Gallery_Native_Canary_iOS.mobileprovision
+#
+# - template: build/templates/xcode-select.yml
+# parameters:
+# xCodeRoot: $(XCODE_ROOT)
+#
+# - template: build/stage-build-mobile.yml
+#
+# - stage: WebAssembly
+# displayName: 'WebAssembly'
+# dependsOn: []
+# jobs:
+# - job: WebAssembly
+# timeoutInMinutes: 60
+#
+# pool:
+# vmImage: ubuntu-latest
+#
+# strategy:
+# matrix:
+# DOM:
+# ArtifactName: WASM-DOM
+# UseNativeRendering: true
+# Skia:
+# ArtifactName: WASM-Skia
+# UseNativeRendering: false
+#
+# variables:
+# SkipUnknownFrameworks: true
+#
+# steps:
+# - template: build/stage-build-wasm.yml
+#
+# - stage: WebAssembly_Tests
+# displayName: 'WebAssembly Tests'
+# dependsOn: []
+# jobs:
+# - template: build/stage-uitests-wasm.yml
+#
+# - stage: iOS_Tests
+# displayName: 'iOS Tests'
+# dependsOn: []
+# jobs:
+# - template: build/stage-uitests-ios.yml
+#
+# - stage: Android_Tests
+# displayName: 'Android Tests'
+# dependsOn: []
+# jobs:
+# - template: build/stage-uitests-android.yml
+# TEMPORARY: Enable TestFlight push for PR testing only
+# TODO: REMOVE THIS BLOCK after TestFlight validation - restore the commented sections below
+- template: build/templates/master-publish/stage-publish-macos-desktop.yml
-- ${{ if startsWith(variables['Build.SourceBranch'], 'refs/heads/master') }}:
- - template: build/templates/master-publish/stage-publish-wasm.yml
- - template: build/templates/master-publish/stage-publish-ios.yml
- - template: build/templates/master-publish/stage-publish-catalyst.yml
- - template: build/templates/master-publish/stage-publish-android.yml
+# ORIGINAL PUBLISHING STAGES - RESTORE THESE AFTER PR TESTING:
+#
+# - ${{ if startsWith(variables['Build.SourceBranch'], 'refs/heads/canaries/dev') }}:
+# - template: build/templates/canary-publish/stage-publish-wasm-canary.yml
+# - template: build/templates/canary-publish/stage-publish-ios-canary.yml
+# - template: build/templates/canary-publish/stage-publish-macos-desktop-canary.yml
+# - template: build/templates/canary-publish/stage-publish-android-canary.yml
+#
+# - ${{ if startsWith(variables['Build.SourceBranch'], 'refs/heads/master') }}:
+# - template: build/templates/master-publish/stage-publish-wasm.yml
+# - template: build/templates/master-publish/stage-publish-ios.yml
+# - template: build/templates/master-publish/stage-publish-macos-desktop.yml
+# - template: build/templates/master-publish/stage-publish-android.yml
diff --git a/before.Uno.Gallery.sln.targets b/before.Uno.Gallery.sln.targets
new file mode 100644
index 000000000..5721c526f
--- /dev/null
+++ b/before.Uno.Gallery.sln.targets
@@ -0,0 +1,6 @@
+
+
+
+
+
+
diff --git a/build/build.csproj b/build/build.csproj
index b0a961db7..8a26c6552 100644
--- a/build/build.csproj
+++ b/build/build.csproj
@@ -58,7 +58,8 @@
<_SourceBasePath>$(MSBuildThisFileDirectory)../$(AppName)
<_AppxManifestPath>$(_SourceBasePath)/Package.appxmanifest
<_MobileAndroidManifestPath>$(_SourceBasePath)/Platforms/Android/AndroidManifest.xml
- <_catalystPlistFilePath>$(_SourceBasePath)/Platforms/MacCatalyst/Info.plist
+ $(_SourceBasePath)/Platforms/Desktop/Info.plist
+ $(_SourceBasePath)/Platforms/Desktop/Entitlements.plist
<_MobileiOSPlistFilePath>$(_SourceBasePath)/Platforms/iOS/Info.plist
<_AndroidNamespace>
@@ -85,20 +86,21 @@
Value="$(_VersionCode)"
Namespaces="$(_AndroidNamespace)" />
-
-
+
+
<_XmlUpdate
- XmlFileName="$(_catalystPlistFilePath)"
+ XmlFileName="$(UnoMacOSCustomInfoPlist)"
XPath="//plist/dict/key[text() = 'CFBundleShortVersionString']/following-sibling::string[1]"
Value="$(_AppVersion)" />
<_XmlUpdate
- XmlFileName="$(_catalystPlistFilePath)"
- XPath="//plist/dict/key[text() = 'CFBundleVersion']/following-sibling::string[1]"
- Value="$(_AppleBuildNumber)" />
+ Condition="Exists('$(UnoMacOSCustomInfoPlist)')"
+ XmlFileName="$(UnoMacOSCustomInfoPlist)"
+ XPath="//plist/dict/key[text() = 'CFBundleVersion']/following-sibling::string[1]"
+ Value="$(_AppleBuildNumber)" />
-
+
<_XmlUpdate
XmlFileName="$(_MobileiOSPlistFilePath)"
XPath="//plist/dict/key[text() = 'CFBundleShortVersionString']/following-sibling::string[1]"
diff --git a/build/scripts/android-uitest-build.sh b/build/scripts/android-uitest-build.sh
index 804df4f39..ac90ad301 100644
--- a/build/scripts/android-uitest-build.sh
+++ b/build/scripts/android-uitest-build.sh
@@ -37,4 +37,4 @@ fi
# Build the sample, while the emulator is starting
cd $UNO_UITEST_ANDROID_PROJECT
-dotnet publish -f net9.0-android -p:TargetFrameworkOverride=net9.0-android -p:UseNativeRendering=true -c Release /p:AndroidPackageFormat=apk /p:RuntimeIdentifier=android-x64 /p:IsUiAutomationMappingEnabled=true /p:AndroidUseSharedRuntime=false /p:AndroidUseAssemblyStore=false /p:RunAOTCompilation=false /p:PublishTrimmed=false /p:AndroidStripILAfterAOT=false -bl:"$BUILD_ARTIFACTSTAGINGDIRECTORY/android-app.binlog"
+dotnet publish -f net10.0-android -p:TargetFrameworkOverride=net10.0-android -p:UseNativeRendering=true -c Release /p:AndroidPackageFormat=apk /p:RuntimeIdentifier=android-x64 /p:IsUiAutomationMappingEnabled=true /p:AndroidUseSharedRuntime=false /p:AndroidUseAssemblyStore=false /p:RunAOTCompilation=false /p:PublishTrimmed=false /p:AndroidStripILAfterAOT=false -bl:"$BUILD_ARTIFACTSTAGINGDIRECTORY/android-app.binlog"
diff --git a/build/scripts/android-uitest-run.sh b/build/scripts/android-uitest-run.sh
index f7074b468..0e17d4128 100644
--- a/build/scripts/android-uitest-run.sh
+++ b/build/scripts/android-uitest-run.sh
@@ -16,7 +16,7 @@ export UITEST_TEST_TIMEOUT=60m
# Prefer the signed APK from build artifacts (Windows job) when available,
# otherwise fall back to the unsigned APK published locally by the UITest job (macOS agent).
APK_FROM_ARTIFACT="$(ls "$UNO_UITEST_ANDROIDAPK_BASEPATH"/*.apk 2>/dev/null | head -n 1 || true)"
-APK_FROM_LOCAL="$(ls $BUILD_SOURCESDIRECTORY/Uno.Gallery/bin/Release/net9.0-android/android-x64/publish/*.apk 2>/dev/null | head -n 1 || true)"
+APK_FROM_LOCAL="$(ls $BUILD_SOURCESDIRECTORY/Uno.Gallery/bin/Release/net10.0-android/android-x64/publish/*.apk 2>/dev/null | head -n 1 || true)"
if [ -f "$APK_FROM_ARTIFACT" ]; then
export UNO_UITEST_ANDROIDAPK_PATH="$APK_FROM_ARTIFACT"
diff --git a/build/scripts/ios-uitest-build.sh b/build/scripts/ios-uitest-build.sh
index 817e78f14..21569f36d 100644
--- a/build/scripts/ios-uitest-build.sh
+++ b/build/scripts/ios-uitest-build.sh
@@ -6,4 +6,4 @@ export UNO_UITEST_IOS_PROJECT=$BUILD_SOURCESDIRECTORY/Uno.Gallery
cd $UNO_UITEST_IOS_PROJECT
-dotnet build -f net9.0-ios -r iossimulator-x64 -p:TargetFrameworkOverride=net9.0-ios -c Release -p:UseNativeRendering=true -p:IsUiAutomationMappingEnabled=true -p:CodesignDisable=true -bl:$BUILD_ARTIFACTSTAGINGDIRECTORY/ios-app.binlog
+dotnet build -f net10.0-ios -r iossimulator-x64 -p:TargetFrameworkOverride=net10.0-ios -c Release -p:UseNativeRendering=true -p:IsUiAutomationMappingEnabled=true -p:CodesignDisable=true -bl:$BUILD_ARTIFACTSTAGINGDIRECTORY/ios-app.binlog
diff --git a/build/scripts/ios-uitest-run.sh b/build/scripts/ios-uitest-run.sh
index 7204f4d91..effa48a09 100644
--- a/build/scripts/ios-uitest-run.sh
+++ b/build/scripts/ios-uitest-run.sh
@@ -87,18 +87,18 @@ xcrun simctl boot "$UITEST_IOSDEVICE_ID" || true
# Try publish/, then non-publish, then the downloaded artifact
if [ -z "${UNO_UITEST_IOSBUNDLE_PATH:-}" ]; then
echo "iOS app bundle path not found, trying publish"
- UNO_UITEST_IOSBUNDLE_PATH="$(ls "$BUILD_SOURCESDIRECTORY/Uno.Gallery/bin/Release/net9.0-ios/iossimulator-x64/publish/"*.app 2>/dev/null | head -n 1)"
+ UNO_UITEST_IOSBUNDLE_PATH="$(ls "$BUILD_SOURCESDIRECTORY/Uno.Gallery/bin/Release/net10.0-ios/iossimulator-x64/publish/"*.app 2>/dev/null | head -n 1)"
fi
if [ -z "${UNO_UITEST_IOSBUNDLE_PATH:-}" ]; then
echo "iOS app bundle (publish) not found, trying non-publish"
- UNO_UITEST_IOSBUNDLE_PATH="$(ls "$BUILD_SOURCESDIRECTORY/Uno.Gallery/bin/Release/net9.0-ios/iossimulator-x64/"*.app 2>/dev/null | head -n 1)"
+ UNO_UITEST_IOSBUNDLE_PATH="$(ls "$BUILD_SOURCESDIRECTORY/Uno.Gallery/bin/Release/net10.0-ios/iossimulator-x64/"*.app 2>/dev/null | head -n 1)"
fi
if [ -z "${UNO_UITEST_IOSBUNDLE_PATH:-}" ]; then
echo "iOS app bundle (non-publish) not found, trying artifact download"
UNO_UITEST_IOSBUNDLE_PATH="$(ls "$PIPELINE_WORKSPACE/iOS_UITest/"*.app 2>/dev/null | head -n 1)"
fi
if [ -z "${UNO_UITEST_IOSBUNDLE_PATH:-}" ] || [ ! -d "$UNO_UITEST_IOSBUNDLE_PATH" ]; then
- echo "ERROR: iOS app bundle not found in publish/, net9.0-ios/, or under \$PIPELINE_WORKSPACE/iOS_UITest"
+ echo "ERROR: iOS app bundle not found in publish/, net10.0-ios/, or under \$PIPELINE_WORKSPACE/iOS_UITest"
exit 1
fi
diff --git a/build/scripts/local-ios-uitest-run.sh b/build/scripts/local-ios-uitest-run.sh
index d0ed787ac..678271d65 100644
--- a/build/scripts/local-ios-uitest-run.sh
+++ b/build/scripts/local-ios-uitest-run.sh
@@ -1,7 +1,7 @@
#!/bin/bash
export BUILD_SOURCESDIRECTORY=`pwd`/../..
export BUILD_ARTIFACTSTAGINGDIRECTORY=/tmp/uno-uitests-results
-export UNO_UITEST_IOSBUNDLE_PATH=$BUILD_SOURCESDIRECTORY/Uno.Gallery/bin/Release/net9.0-ios/iossimulator-x64/Uno.Gallery.app
+export UNO_UITEST_IOSBUNDLE_PATH=$BUILD_SOURCESDIRECTORY/Uno.Gallery/bin/Release/net10.0-ios/iossimulator-x64/Uno.Gallery.app
./ios-uitest-build.sh
./ios-uitest-run.sh
diff --git a/build/scripts/wasm-uitest-build.sh b/build/scripts/wasm-uitest-build.sh
index f72e57239..85f124384 100644
--- a/build/scripts/wasm-uitest-build.sh
+++ b/build/scripts/wasm-uitest-build.sh
@@ -7,14 +7,15 @@ export UNO_UITEST_WASM_PROJECT=$BUILD_SOURCESDIRECTORY/Uno.Gallery/Uno.Gallery.c
cd $BUILD_SOURCESDIRECTORY
-dotnet publish -f net9.0-browserwasm -p:Configuration=Release $UNO_UITEST_WASM_PROJECT -p:UseNativeRendering=true -p:IsUiAutomationMappingEnabled=True -bl:$UNO_UITEST_SCREENSHOT_PATH/msbuild.binlog
+dotnet publish -f net10.0-browserwasm -p:Configuration=Release $UNO_UITEST_WASM_PROJECT -p:UseNativeRendering=true -p:IsUiAutomationMappingEnabled=True -bl:$UNO_UITEST_SCREENSHOT_PATH/msbuild.binlog
-WASM_OUT="$BUILD_SOURCESDIRECTORY/Uno.Gallery/bin/Release/net9.0-browserwasm/publish"
+WASM_OUT="$BUILD_SOURCESDIRECTORY/Uno.Gallery/bin/Release/net10.0-browserwasm/publish"
if [ ! -d "$WASM_OUT" ]; then
- WASM_OUT="$BUILD_SOURCESDIRECTORY/Uno.Gallery/bin/Release/net9.0-browserwasm/publish"
+ echo "Error: WASM output directory '$WASM_OUT' does not exist."
+ exit 1
fi
echo "Contents of WASM output folder:"
-ls -la "$BUILD_SOURCESDIRECTORY/Uno.Gallery/bin/Release/net9.0-browserwasm/publish"
+ls -la "$BUILD_SOURCESDIRECTORY/Uno.Gallery/bin/Release/net10.0-browserwasm/publish"
echo "##vso[task.setvariable variable=UNO_UITEST_WASM_OUTPUT_PATH]$WASM_OUT"
diff --git a/build/stage-build-android-mobile.yml b/build/stage-build-android-mobile.yml
index b7fa3a31c..6d5b86097 100644
--- a/build/stage-build-android-mobile.yml
+++ b/build/stage-build-android-mobile.yml
@@ -6,7 +6,7 @@ steps:
- template: templates/dotnet-install-windows.yml
parameters:
- UnoCheckParameters: '--tfm net9.0-android'
+ UnoCheckParameters: '--tfm net10.0-android'
- template: templates/canary-updater.yml
@@ -20,13 +20,13 @@ steps:
- script: |
cd $(build.sourcesdirectory)/Uno.Gallery
- dotnet publish -f:net9.0-android -p:TargetFrameworkOverride=net9.0-android -c:Release -p:UseNativeRendering=$(UseNativeRendering) "/p:InformationalVersion=$(NBGV_InformationalVersion)" /p:AndroidSigningKeyStore=$(keyStore.secureFilePath) /p:AndroidSigningStorePass=$(AndroidSigningStorePass) /p:AndroidSigningKeyPass=$(AndroidSigningKeyPass) /p:AndroidSigningKeyAlias=$(AndroidSigningKeyAlias) /p:AndroidKeyStore=true /bl:$(build.artifactstagingdirectory)/build-$(BuildForPlayStore).binlog
+ dotnet publish -f:net10.0-android -p:TargetFrameworkOverride=net10.0-android -c:Release -p:UseNativeRendering=$(UseNativeRendering) "/p:InformationalVersion=$(NBGV_InformationalVersion)" /p:AndroidSigningKeyStore=$(keyStore.secureFilePath) /p:AndroidSigningStorePass=$(AndroidSigningStorePass) /p:AndroidSigningKeyPass=$(AndroidSigningKeyPass) /p:AndroidSigningKeyAlias=$(AndroidSigningKeyAlias) /p:AndroidKeyStore=true /bl:$(build.artifactstagingdirectory)/build-$(BuildForPlayStore).binlog
displayName: 'Build Android Package'
condition: and(succeeded(), eq(variables['System.PullRequest.IsFork'],'False'))
- script: |
cd $(build.sourcesdirectory)/Uno.Gallery
- dotnet publish -f:net9.0-android -p:TargetFrameworkOverride=net9.0-android -c:Release -p:UseNativeRendering=$(UseNativeRendering) "/p:InformationalVersion=$(NBGV_InformationalVersion)" /p:AndroidKeyStore=False /bl:$(build.artifactstagingdirectory)/build-$(BuildForPlayStore).binlog
+ dotnet publish -f:net10.0-android -p:TargetFrameworkOverride=net10.0-android -c:Release -p:UseNativeRendering=$(UseNativeRendering) "/p:InformationalVersion=$(NBGV_InformationalVersion)" /p:AndroidKeyStore=False /bl:$(build.artifactstagingdirectory)/build-$(BuildForPlayStore).binlog
displayName: 'Build Android Package (Fork)'
condition: and(succeeded(), eq(variables['System.PullRequest.IsFork'],'True'))
@@ -34,10 +34,10 @@ steps:
displayName: 'Publish Android netcore Binaries'
retryCountOnTaskFailure: 3
inputs:
- SourceFolder: $(build.sourcesdirectory)/Uno.Gallery/bin/Release/net9.0-android
+ SourceFolder: $(build.sourcesdirectory)/Uno.Gallery/bin/Release/net10.0-android
Contents: |
- **/*.aab
- **/*.apk
+ publish/**/*.aab
+ publish/**/*.apk
TargetFolder: $(build.artifactstagingdirectory)
CleanTargetFolder: false
OverWrite: false
diff --git a/build/stage-build-macos-desktop.yml b/build/stage-build-macos-desktop.yml
new file mode 100644
index 000000000..3bbc33213
--- /dev/null
+++ b/build/stage-build-macos-desktop.yml
@@ -0,0 +1,143 @@
+steps:
+# NOTE: This template currently builds osx-x64 only and relies on Rosetta for arm64 execution.
+# When Uno.Sdk includes fat bundle support (UnoMergeBundles task from uno.sdk.extras),
+# this should be updated to build both osx-x64 and osx-arm64, then merge them into a universal binary.
+# See: https://github.com/unoplatform/uno.sdk.extras/pull/84
+# https://github.com/unoplatform/uno/pull/21744/
+- checkout: self
+ clean: true
+ fetchDepth: 0
+ persistCredentials: true
+
+- template: templates/gitversion.yml
+
+- template: templates/dotnet-install-mac.yml
+
+- template: templates/canary-updater.yml
+
+- bash: |
+ cd $(build.sourcesdirectory)/Uno.Gallery
+
+ # Debug: Check certificates and variables
+ echo "=== Code signing identities ==="
+ security find-identity -v -p codesigning
+ echo "=== All identities (installer certs) ==="
+ security find-identity -v
+ echo "=== Variables ==="
+ echo "MACOS_CERT_IDENTITY: $MACOS_CERT_IDENTITY"
+ echo "MACOS_INSTALLER_CERT_IDENTITY: $MACOS_INSTALLER_CERT_IDENTITY"
+ echo "=== Environment ==="
+ uname -a || true
+ sw_vers || true
+ which codesign && codesign --version || true
+ xcode-select -p || true
+ dotnet --info || true
+ echo "DOTNET_INSTALL_DIR: $DOTNET_INSTALL_DIR"
+ echo "PATH: $PATH"
+ echo "=== .NET SDKs ==="
+ ls -la /Users/runner/.dotnet/sdk || true
+ # Remove extended attributes from source and build output (common in CI from git clones)
+ echo "=== Cleaning extended attributes from source ==="
+ xattr -cr $(build.sourcesdirectory) 2>/dev/null || true
+
+ # Check for any remaining attributes in source (quarantine specifically)
+ echo "=== Checking for com.apple.quarantine in source ==="
+ find $(build.sourcesdirectory)/Uno.Gallery -type f -print0 | xargs -0 -n 100 xattr -p com.apple.quarantine 2>/dev/null | head -n 50 || echo "None found"
+
+ echo "=== MSBuild binlog will be written to ==="
+ echo "$(build.artifactstagingdirectory)/pkg-$(BuildTargetFramework).binlog"
+
+ # Remove extended attributes from source
+ xattr -cr $(build.sourcesdirectory) 2>/dev/null || true
+
+ # Restore and publish - macOS desktop uses CoreCLR (not Mono), same as Windows
+ # Let SDK use default runtime pack versions (should resolve to 10.0.1 for CoreCLR)
+ dotnet restore $(build.sourcesdirectory)/Uno.Gallery/Uno.Gallery.csproj \
+ -r osx-x64 \
+ -nologo --verbosity quiet
+
+ dotnet publish $(build.sourcesdirectory)/Uno.Gallery/Uno.Gallery.csproj \
+ -f net10.0-desktop -r osx-x64 -c Release --no-restore \
+ /p:PackageFormat=pkg \
+ /p:InformationalVersion="$NBGV_InformationalVersion" \
+ /p:CodesignKey="$MACOS_CERT_IDENTITY" \
+ /p:PackageSigningKey="$MACOS_INSTALLER_CERT_IDENTITY" \
+ -nologo --verbosity normal \
+ -bl:$(build.artifactstagingdirectory)/pkg-$(BuildTargetFramework).binlog
+
+ # Post-publish diagnostics
+ PUBLISH_DIR="$(build.sourcesdirectory)/Uno.Gallery/bin/Release/net10.0-desktop/osx-x64/publish"
+ echo "=== Publish dir contents ==="
+ ls -la "$PUBLISH_DIR" || true
+
+ # Check for .pkg file created by Uno
+ PKG_PATH="$(find "$PUBLISH_DIR" -maxdepth 1 -name "*.pkg" -print -quit)"
+ if [ -z "$PKG_PATH" ]; then
+ echo "❌ No .pkg found in $PUBLISH_DIR"; exit 1
+ fi
+ echo "✅ .pkg created by Uno Platform: $PKG_PATH"
+ echo "=== Validating .pkg contents ==="
+ xar -tf "$PKG_PATH" | head -20 || true
+ displayName: Publish with Uno Platform .pkg creation
+ env:
+ XCODE_ROOT: $(XCODE_ROOT)
+ MACOS_CERT_IDENTITY: $(MacOS_Certificate_Identity)
+ MACOS_INSTALLER_CERT_IDENTITY: $(MacOS_Installer_Certificate_Identity)
+
+- bash: |
+ ART_DIR="$(build.artifactstagingdirectory)"
+ echo "=== Normalizing artifacts layout in $ART_DIR ==="
+
+ # Create target directory structure to match iOS/Android patterns
+ mkdir -p "$ART_DIR/net10.0-desktop/osx-x64/publish" "$ART_DIR/logs"
+
+ # Move all .pkg files from publish dir to the structured path
+ echo "Moving *.pkg to net10.0-desktop/osx-x64/publish/ ..."
+ find "$ART_DIR" -name "*.pkg" -not -path "*/net10.0-desktop/*" -exec mv -f {} "$ART_DIR/net10.0-desktop/osx-x64/publish/" \; 2>/dev/null || true
+
+ # Move binlogs to logs/
+ echo "Moving *.binlog to logs/ ..."
+ find "$ART_DIR" -maxdepth 1 -name "*.binlog" -exec mv -f {} "$ART_DIR/logs/" \; 2>/dev/null || true
+
+ # Move other log files to logs/
+ echo "Moving *.log and *.txt to logs/ ..."
+ find "$ART_DIR" -maxdepth 1 -name "*.log" -o -name "*.txt" | xargs -I{} mv -f {} "$ART_DIR/logs/" 2>/dev/null || true
+
+ # CRITICAL: Ensure logs/ contains ZERO pkg files (recursive check)
+ echo "Ensuring no .pkg files in logs/ (recursive cleanup) ..."
+ find "$ART_DIR/logs" -type f -name "*.pkg" -delete 2>/dev/null || true
+
+ # Final verification
+ echo "=== Final artifacts layout ==="
+ echo "Staging root:"
+ ls -lah "$ART_DIR" | grep -v "^d" | head -20 || true
+ echo ""
+ echo "net10.0-desktop/ structure:"
+ ls -lahR "$ART_DIR/net10.0-desktop" || true
+ echo ""
+ echo "logs/ contents:"
+ ls -lah "$ART_DIR/logs" || true
+ echo ""
+ echo "Verification: Checking for ANY .pkg in logs/ ..."
+ if find "$ART_DIR/logs" -name "*.pkg" | grep -q .; then
+ echo "❌ ERROR: .pkg files still found in logs/"
+ find "$ART_DIR/logs" -name "*.pkg"
+ exit 1
+ else
+ echo "✅ No .pkg files in logs/ - verified clean"
+ fi
+ displayName: Normalize artifacts layout
+
+- task: PublishBuildArtifacts@1
+ retryCountOnTaskFailure: 3
+ condition: succeeded()
+ inputs:
+ ArtifactName: macOS-desktop
+ PathtoPublish: $(build.artifactstagingdirectory)
+
+- task: PublishBuildArtifacts@1
+ retryCountOnTaskFailure: 3
+ condition: always()
+ inputs:
+ PathtoPublish: $(build.artifactstagingdirectory)/logs
+ ArtifactName: macos-logs
diff --git a/build/stage-build-mobile.yml b/build/stage-build-mobile.yml
index 70ea7a8de..44dad4444 100644
--- a/build/stage-build-mobile.yml
+++ b/build/stage-build-mobile.yml
@@ -6,7 +6,7 @@ steps:
- template: templates/dotnet-install-mac.yml
parameters:
- UnoCheckParameters: '--tfm net9.0-ios --tfm net9.0-maccatalyst'
+ UnoCheckParameters: '--tfm net10.0-ios'
- template: templates/canary-updater.yml
@@ -37,10 +37,10 @@ steps:
inputs:
SourceFolder: $(build.sourcesdirectory)/Uno.Gallery/bin/Release/
Contents: |
- **/*.apk
- **/*.ipa
- **/*.dSym/**
- **/*.pkg
+ **/publish/**/*.apk
+ **/publish/**/*.ipa
+ **/publish/**/*.dSym/**
+ **/publish/**/*.pkg
TargetFolder: $(build.artifactstagingdirectory)
CleanTargetFolder: false
OverWrite: false
diff --git a/build/stage-build-skia-desktop.yml b/build/stage-build-skia-desktop.yml
index 4187d99be..4014a0c5e 100644
--- a/build/stage-build-skia-desktop.yml
+++ b/build/stage-build-skia-desktop.yml
@@ -9,12 +9,12 @@ steps:
- template: templates/canary-updater.yml
- bash: |
- dotnet build Uno.Gallery/Uno.Gallery.csproj -p:TargetFrameworkOverride=net9.0-desktop -c Release -p:InformationalVersion=$(NBGV_InformationalVersion) -bl:$(build.artifactstagingdirectory)/build.binlog
+ dotnet publish Uno.Gallery/Uno.Gallery.csproj -p:TargetFrameworkOverride=net10.0-desktop -c Release -p:InformationalVersion=$(NBGV_InformationalVersion) -bl:$(build.artifactstagingdirectory)/build.binlog
- task: CopyFiles@2
displayName: Copy Skia output
inputs:
- SourceFolder: Uno.Gallery/bin/Release/net9.0-desktop
+ SourceFolder: Uno.Gallery/bin/Release/net10.0-desktop/publish
Contents: '**/*.*'
TargetFolder: $(Build.ArtifactStagingDirectory)/bin
diff --git a/build/stage-build-wasm.yml b/build/stage-build-wasm.yml
index ab897a90b..27ecc95e8 100644
--- a/build/stage-build-wasm.yml
+++ b/build/stage-build-wasm.yml
@@ -6,7 +6,7 @@
- template: templates/canary-updater.yml
- bash: |
- dotnet publish Uno.Gallery/Uno.Gallery.csproj -c Release -f net9.0-browserwasm -p:UseNativeRendering=$(UseNativeRendering) -p:InformationalVersion=$(NBGV_InformationalVersion) -o "$(Agent.TempDirectory)/wasm-publish" -bl:$(Build.ArtifactStagingDirectory)/wasm-publish.binlog
+ dotnet publish Uno.Gallery/Uno.Gallery.csproj -c Release -f net10.0-browserwasm -p:UseNativeRendering=$(UseNativeRendering) -p:InformationalVersion=$(NBGV_InformationalVersion) -o "$(Agent.TempDirectory)/wasm-publish" -bl:$(Build.ArtifactStagingDirectory)/wasm-publish.binlog
displayName: 'Builds Wasm $(ArtifactName)'
- task: PublishBuildArtifacts@1
diff --git a/build/stage-build-windows.yml b/build/stage-build-windows.yml
index d581e326a..0f86f17f0 100644
--- a/build/stage-build-windows.yml
+++ b/build/stage-build-windows.yml
@@ -6,12 +6,12 @@ steps:
displayName: 'Use .NET'
inputs:
packageType: 'sdk'
- version: '9.0.300'
+ version: '10.0.100'
includePreviewVersions: true
- script: |
cd $(build.sourcesdirectory)/Uno.Gallery
- dotnet publish -c Release -f net9.0-windows10.0.19041 -p:TargetFrameworkOverride=net9.0-windows10.0.19041 /p:Platform=$(ApplicationPlatform) /p:AppxPackageDir="Packages/" /p:AppxBundle=Never /p:UapAppxPackageBuildMode=SideloadOnly /p:GenerateAppxPackageOnBuild=true /bl:$(build.artifactstagingdirectory)/build.binlog "/p:InformationalVersion=$(NBGV_InformationalVersion)"
+ dotnet publish -c Release -f net10.0-windows10.0.19041 -p:TargetFrameworkOverride=net10.0-windows10.0.19041 /p:Platform=$(ApplicationPlatform) /p:AppxPackageDir="Packages/" /p:AppxBundle=Never /p:UapAppxPackageBuildMode=SideloadOnly /p:GenerateAppxPackageOnBuild=true /bl:$(build.artifactstagingdirectory)/build.binlog "/p:InformationalVersion=$(NBGV_InformationalVersion)"
displayName: Build project for Release
- task: CopyFiles@2
diff --git a/build/stage-uitests-android.yml b/build/stage-uitests-android.yml
index 8962bf559..1f19f0d22 100644
--- a/build/stage-uitests-android.yml
+++ b/build/stage-uitests-android.yml
@@ -17,7 +17,7 @@
- template: templates/dotnet-install-linux.yml
parameters:
- UnoCheckParameters: '--tfm net9.0-android'
+ UnoCheckParameters: '--tfm net10.0-android'
- template: templates/canary-updater.yml
@@ -31,8 +31,8 @@
- bash: |
echo "Publish output:"
- ls -la $(build.sourcesdirectory)/Uno.Gallery/bin/Release/net9.0-android/android-x64/publish || true
- APK="$(ls $(build.sourcesdirectory)/Uno.Gallery/bin/Release/net9.0-android/android-x64/publish/*.apk | head -n 1 || true)"
+ ls -la $(build.sourcesdirectory)/Uno.Gallery/bin/Release/net10.0-android/android-x64/publish || true
+ APK="$(ls $(build.sourcesdirectory)/Uno.Gallery/bin/Release/net10.0-android/android-x64/publish/*.apk | head -n 1 || true)"
if [ ! -f "$APK" ]; then
echo "ERROR: No APK produced (verify AndroidPackageFormat=apk)"; exit 1; fi
echo "Check APK contains .dll and no assemblies.blob (we inject assemblies.blob at run):"
@@ -44,7 +44,7 @@
- task: CopyFiles@2
displayName: Copy Build Output
inputs:
- SourceFolder: $(build.sourcesdirectory)/Uno.Gallery/bin/Release/net9.0-android/android-x64
+ SourceFolder: $(build.sourcesdirectory)/Uno.Gallery/bin/Release/net10.0-android/android-x64
Contents: '**/*.apk'
TargetFolder: $(Build.ArtifactStagingDirectory)
diff --git a/build/stage-uitests-ios.yml b/build/stage-uitests-ios.yml
index b9b3c6a5d..6bf0e8e53 100644
--- a/build/stage-uitests-ios.yml
+++ b/build/stage-uitests-ios.yml
@@ -16,7 +16,7 @@
- template: templates/dotnet-install-mac.yml
parameters:
- UnoCheckParameters: '--tfm net9.0-ios'
+ UnoCheckParameters: '--tfm net10.0-ios'
- template: templates/xcode-select.yml
parameters:
@@ -35,7 +35,7 @@
- task: CopyFiles@2
displayName: Copy Build Output
inputs:
- SourceFolder: $(build.sourcesdirectory)/Uno.Gallery/bin/Release/net9.0-ios/iossimulator-x64/Uno.Gallery.app
+ SourceFolder: $(build.sourcesdirectory)/Uno.Gallery/bin/Release/net10.0-ios/iossimulator-x64/Uno.Gallery.app
Contents: '**'
TargetFolder: $(Build.ArtifactStagingDirectory)/Uno.Gallery.app
diff --git a/build/stage-uitests-wasm.yml b/build/stage-uitests-wasm.yml
index 4350e2b05..625e0922c 100644
--- a/build/stage-uitests-wasm.yml
+++ b/build/stage-uitests-wasm.yml
@@ -27,7 +27,14 @@
BUILD_ARTIFACTSTAGINGDIRECTORY: "$(build.artifactstagingdirectory)"
displayName: 'Running build'
- - publish: $(System.DefaultWorkingDirectory)/Uno.Gallery/bin/Release/net9.0-browserwasm/publish/wwwroot
+ - bash: |
+ find $(System.DefaultWorkingDirectory) -type d -name "obj" -exec rm -rf {} + 2>/dev/null || true
+ find $(System.DefaultWorkingDirectory) -type d -name "bin" -not -path "*/Uno.Gallery/bin/Release/net10.0-browserwasm/publish/*" -exec rm -rf {} + 2>/dev/null || true
+ df -h
+ displayName: 'Clean build artifacts'
+ continueOnError: true
+
+ - publish: $(System.DefaultWorkingDirectory)/Uno.Gallery/bin/Release/net10.0-browserwasm/publish/wwwroot
artifact: Wasm_UITest
- publish: $(build.artifactstagingdirectory)/screenshots/wasm
diff --git a/build/templates/APP_ID_MAPPINGS.md b/build/templates/APP_ID_MAPPINGS.md
new file mode 100644
index 000000000..3d19c177b
--- /dev/null
+++ b/build/templates/APP_ID_MAPPINGS.md
@@ -0,0 +1,139 @@
+# Uno Gallery - Application ID Mappings
+
+This document provides a comprehensive mapping of Application IDs, App Store IDs, and publish configurations across all platforms and variants (Production and Canary).
+
+## macOS App Store Requirements
+
+For macOS TestFlight submissions, the following properties **must** be present in the app's Info.plist:
+
+- **`LSApplicationCategoryType`**: Application category (e.g., `public.app-category.utilities`)
+- **`LSMinimumSystemVersion`**: Minimum macOS version required (e.g., `15.0`)
+
+The following entitlements **must** be enabled in Entitlements.plist:
+
+- **`com.apple.security.app-sandbox`**: `true` (required for App Store distribution)
+- **`com.apple.security.network.client`**: `true` (for network access)
+
+**Files**: `Uno.Gallery/Platforms/Desktop/Info.plist` and `Entitlements.plist`
+
+---
+
+## Production (Master) Builds
+
+### Android
+
+| Variant | Application ID | Bundle File | Publish Template | Google Play |
+|---------|---------------|-------------|------------------|-------------|
+| **Native** | `uno.platform.gallery.native` | `uno.platform.gallery.native-Signed.aab` | `stage-publish-android.yml` | Alpha Track |
+| **Skia** | `com.nventive.uno.ui.demo` | `com.nventive.uno.ui.demo-Signed.aab` | `stage-publish-android.yml` | Alpha Track |
+
+### iOS
+
+| Variant | Application ID | Apple App ID | Publish Template | TestFlight |
+|---------|---------------|--------------|------------------|------------|
+| **Native** | `uno.platform.gallery.native` | `6745625441` | `stage-publish-ios.yml` | Yes |
+| **Skia** | `com.nventive.uno.gallery` | `1380984680` | `stage-publish-ios.yml` | Yes |
+
+### macOS Desktop
+
+| Variant | Application ID | Apple App ID | Publish Template | TestFlight |
+|---------|---------------|--------------|------------------|------------|
+| **Skia** | `com.nventive.uno.gallery` | `1380984680` | `stage-publish-macos-desktop.yml` | Yes |
+
+---
+
+## Canary Builds
+
+### Canary Updater Rules
+
+The `canary-updater.yml` automatically transforms Application IDs during canary builds:
+
+| Platform | Original ID | Canary Rule | Result ID | Note |
+|----------|------------|-------------|-----------|------|
+| **Android Skia** | `com.nventive.uno.ui.demo` | Replace with `.canary` | `com.nventive.uno.ui.demo.canary` | Dot + dash |
+| **Android Native** | `uno.platform.gallery.native` | Replace with `_canary` | `uno.platform.gallery.native_canary` | **Underscore** (Android naming rules) |
+| **iOS Native** | `uno.platform.gallery.native` | Replace with `-canary` | `uno.platform.gallery.native-canary` | **Dash** (Apple convention) |
+| **iOS Skia** | `com.nventive.uno.gallery` | Replace with `-canary` | `com.nventive.uno.gallery-canary` | Dash |
+| **macOS** | `com.nventive.uno.gallery` | Replace with `-canary` | `com.nventive.uno.gallery-canary` | Dash |
+
+### Android Canary
+
+| Variant | Application ID | Bundle File | Publish Template | Google Play |
+|---------|---------------|-------------|------------------|-------------|
+| **Native** | `uno.platform.gallery.native_canary` | `uno.platform.gallery.native_canary-Signed.aab` | `stage-publish-android-canary.yml` | Alpha Track |
+| **Skia** | `com.nventive.uno.ui.demo.canary` | `com.nventive.uno.ui.demo.canary-Signed.aab` | `stage-publish-android-canary.yml` | Alpha Track |
+
+### iOS Canary
+
+| Variant | Application ID | Apple App ID | Publish Template | TestFlight |
+|---------|---------------|--------------|------------------|------------|
+| **Native** | `uno.platform.gallery.native-canary` | `6745625865` | `stage-publish-ios-canary.yml` | Yes |
+| **Skia** | `com.nventive.uno.gallery-canary` | `1619130328` | `stage-publish-ios-canary.yml` | Yes |
+
+### macOS Desktop Canary
+
+| Variant | Application ID | Apple App ID | Publish Template | TestFlight |
+|---------|---------------|--------------|------------------|------------|
+| **Skia** | `com.nventive.uno.gallery-canary` | `1619130328` | `stage-publish-macos-desktop-canary.yml` | Yes |
+
+---
+
+## Platform Naming Conventions
+
+### Android Package Names
+- **Rules**: Only alphanumeric (a-z, A-Z, 0-9), dots (.), and underscores (_)
+- **No dashes allowed** (Java package naming convention)
+- **Canary suffix**: Uses underscore `_canary`
+
+### iOS/macOS Bundle IDs
+- **Rules**: Alphanumeric, dots (.), and dashes (-)
+- **Dashes preferred** (Apple convention)
+- **Canary suffix**: Uses dash `-canary`
+
+---
+
+## File Locations
+
+### Configuration Files
+- **Application IDs**: `Uno.Gallery/Uno.Gallery.csproj` (lines 27-35)
+- **Canary Updater**: `build/templates/canary-updater.yml` (lines 56-90)
+
+### Publish Templates
+| Template | Path |
+|----------|------|
+| Android Master | `build/templates/master-publish/stage-publish-android.yml` |
+| Android Canary | `build/templates/canary-publish/stage-publish-android-canary.yml` |
+| iOS Master | `build/templates/master-publish/stage-publish-ios.yml` |
+| iOS Canary | `build/templates/canary-publish/stage-publish-ios-canary.yml` |
+| macOS Master | `build/templates/master-publish/stage-publish-macos-desktop.yml` |
+| macOS Canary | `build/templates/canary-publish/stage-publish-macos-desktop-canary.yml` |
+
+---
+
+## Apple App Store Reference
+
+### Active Apps
+| App Name | Variant | Bundle ID | Apple App ID | Status |
+|----------|---------|-----------|--------------|--------|
+| **Uno Gallery** | Production | `com.nventive.uno.gallery` | `1380984680` | ✅ Active |
+| **Uno Gallery (Canary)** | Canary | `com.nventive.uno.gallery-canary` | `1619130328` | ✅ Active |
+| **Uno Gallery Native** | Production | `uno.platform.gallery.native` | `6745625441` | ✅ Active |
+| **Uno Gallery Native (Canary)** | Canary | `uno.platform.gallery.native-canary` | `6745625865` | ✅ Active |
+
+---
+
+## Verification Checklist
+
+When making changes to Application IDs, verify:
+
+- [ ] `.csproj` ApplicationId matches the target platform conventions
+- [ ] Canary updater transforms the ID correctly (underscore vs dash)
+- [ ] Publish template `appIdentifier`/`applicationId` matches the transformed ID
+- [ ] Publish template `bundleFile`/`ipaPath` uses the correct filename pattern
+- [ ] Apple App ID in publish template matches the App Store Connect entry
+- [ ] Provisioning profiles reference the correct bundle IDs
+
+---
+
+**Last Updated**: December 16, 2025
+**Maintainer**: Uno Platform Team
diff --git a/build/templates/canary-publish/stage-publish-android-canary.yml b/build/templates/canary-publish/stage-publish-android-canary.yml
index b17c3af39..d274569c9 100644
--- a/build/templates/canary-publish/stage-publish-android-canary.yml
+++ b/build/templates/canary-publish/stage-publish-android-canary.yml
@@ -27,7 +27,7 @@
inputs:
serviceConnection: 'Uno Platform Google Play'
applicationId: 'uno.platform.gallery.native_canary'
- bundleFile: '$(Pipeline.Workspace)/drop/publish/uno.platform.gallery.skia_canary-Signed.aab'
+ bundleFile: '$(Pipeline.Workspace)/drop/publish/uno.platform.gallery.native_canary-Signed.aab'
track: 'alpha'
- deployment: 'Android_Publish_Skia'
diff --git a/build/templates/canary-publish/stage-publish-catalyst-canary.yml b/build/templates/canary-publish/stage-publish-catalyst-canary.yml
deleted file mode 100644
index 29f706064..000000000
--- a/build/templates/canary-publish/stage-publish-catalyst-canary.yml
+++ /dev/null
@@ -1,62 +0,0 @@
-stages:
-- stage: Catalyst_Publish
- displayName: 'Catalyst Publish'
- dependsOn: Apple
-
- jobs:
- - deployment: 'Catalyst_Publish_Native'
- displayName: 'Publish Catalyst Native'
- environment: Uno Gallery
- pool:
- vmImage: macos-latest
-
- strategy:
- runOnce:
- deploy:
- steps:
- # https://github.com/microsoft/azure-pipelines-tasks/issues/17207
- - download: none
- - task: DownloadPipelineArtifact@2
- inputs:
- artifactName: 'catalyst-native'
- targetPath: '$(Pipeline.Workspace)/drop'
- displayName: Download artifacts
-
- - task: ms-vsclient.app-store.app-store-release.AppStoreRelease@1
- displayName: 'Publish to the App Store TestFlight track'
- inputs:
- serviceEndpoint: 'App Store (uno platform)'
- appIdentifier: uno.platform.gallery.native_canary
- appType: macOS
- ipaPath: '$(Pipeline.Workspace)/drop/net9.0-maccatalyst/Uno.Gallery-*.pkg'
- shouldSkipWaitingForProcessing: true
- appSpecificId: 1619130328
-
- - deployment: 'Catalyst_Publish_Skia'
- displayName: 'Publish Catalyst Skia'
- environment: Uno Gallery
- pool:
- vmImage: macos-latest
-
- strategy:
- runOnce:
- deploy:
- steps:
- # https://github.com/microsoft/azure-pipelines-tasks/issues/17207
- - download: none
- - task: DownloadPipelineArtifact@2
- inputs:
- artifactName: 'Catalyst-skia'
- targetPath: '$(Pipeline.Workspace)/drop'
- displayName: Download artifacts
-
- - task: ms-vsclient.app-store.app-store-release.AppStoreRelease@1
- displayName: 'Publish to the App Store TestFlight track'
- inputs:
- serviceEndpoint: 'App Store (uno platform)'
- appIdentifier: com.nventive.uno.gallery-canary
- appType: macOS
- ipaPath: '$(Pipeline.Workspace)/drop/net9.0-maccatalyst/Uno.Gallery-*.pkg'
- shouldSkipWaitingForProcessing: true
- appSpecificId: 6739235480
-
diff --git a/build/templates/canary-publish/stage-publish-ios-canary.yml b/build/templates/canary-publish/stage-publish-ios-canary.yml
index c8e4cce64..e21d28d6d 100644
--- a/build/templates/canary-publish/stage-publish-ios-canary.yml
+++ b/build/templates/canary-publish/stage-publish-ios-canary.yml
@@ -27,9 +27,9 @@
inputs:
serviceEndpoint: 'App Store (uno platform)'
appIdentifier: uno.platform.gallery.native-canary
- ipaPath: '$(Pipeline.Workspace)/drop/net9.0-ios/ios-arm64/publish/Uno.Gallery.ipa'
+ ipaPath: '$(Pipeline.Workspace)/drop/net10.0-ios/ios-arm64/publish/Uno.Gallery.ipa'
shouldSkipWaitingForProcessing: true
- appSpecificId: 1619130328
+ appSpecificId: 6745625865
- deployment: 'iOS_Publish_Skia'
displayName: 'Publish iOS Skia'
@@ -53,7 +53,7 @@
displayName: 'Publish to the App Store TestFlight track'
inputs:
serviceEndpoint: 'App Store (uno platform)'
- appIdentifier: uno.platform.gallery
- ipaPath: '$(Pipeline.Workspace)/drop/net9.0-ios/ios-arm64/publish/Uno.Gallery.ipa'
+ appIdentifier: com.nventive.uno.gallery-canary
+ ipaPath: '$(Pipeline.Workspace)/drop/net10.0-ios/ios-arm64/publish/Uno.Gallery.ipa'
shouldSkipWaitingForProcessing: true
- appSpecificId: 6739235480
+ appSpecificId: 1619130328
diff --git a/build/templates/canary-publish/stage-publish-macos-desktop-canary.yml b/build/templates/canary-publish/stage-publish-macos-desktop-canary.yml
new file mode 100644
index 000000000..5e5d3d92a
--- /dev/null
+++ b/build/templates/canary-publish/stage-publish-macos-desktop-canary.yml
@@ -0,0 +1,38 @@
+stages:
+- stage: macOS_Desktop_Publish
+ displayName: 'macOS Desktop Publish'
+ dependsOn: Skia_Desktop
+
+ jobs:
+ - deployment: 'macOS_Desktop_Publish_Skia'
+ displayName: 'Publish macOS Desktop Skia (Canary)'
+ environment: Uno Gallery
+ pool:
+ vmImage: macos-latest
+
+ strategy:
+ runOnce:
+ deploy:
+ steps:
+ # https://github.com/microsoft/azure-pipelines-tasks/issues/17207
+ - download: none
+ - task: DownloadPipelineArtifact@2
+ inputs:
+ artifactName: 'macOS-desktop'
+ targetPath: '$(Pipeline.Workspace)/drop'
+ displayName: Download artifacts
+
+ - script: |
+ echo "macOS Desktop artifacts downloaded successfully"
+ ls -la "$(Pipeline.Workspace)/drop"
+ displayName: 'Verify macOS Desktop artifacts'
+
+ - task: ms-vsclient.app-store.app-store-release.AppStoreRelease@1
+ displayName: 'Publish to the App Store TestFlight track (Canary)'
+ inputs:
+ serviceEndpoint: 'App Store (uno platform)'
+ appIdentifier: com.nventive.uno.gallery-canary
+ appType: macOS
+ ipaPath: '$(Pipeline.Workspace)/drop/net10.0-desktop/osx-x64/publish/*.pkg'
+ shouldSkipWaitingForProcessing: true
+ appSpecificId: 1619130328
diff --git a/build/templates/canary-updater.yml b/build/templates/canary-updater.yml
index 607a5e12a..b8588cf65 100644
--- a/build/templates/canary-updater.yml
+++ b/build/templates/canary-updater.yml
@@ -51,18 +51,27 @@ steps:
gci -r -include "Uno.Gallery.csproj" |
foreach-object {
$a = $_.fullname; ( get-content $a ) |
- foreach-object { $_ -replace "uno.platform.gallery.skia","uno.platform.gallery.skia-canary" } |
+ foreach-object { $_ -replace "com.nventive.uno.ui.demo","com.nventive.uno.ui.demo.canary" } |
set-content $a }
- displayName: 'Adjust info.plist bundle name (skia)'
+ displayName: 'Adjust ApplicationId (Android Skia)'
condition: startsWith(variables['Build.SourceBranch'], 'refs/heads/canaries')
- pwsh: |
gci -r -include "Uno.Gallery.csproj" |
foreach-object {
$a = $_.fullname; ( get-content $a ) |
- foreach-object { $_ -replace "com.nventive.uno.ui.demo","com.nventive.uno.ui.demo.canary" } |
+ foreach-object { $_ -replace "'net10.0-android' AND '\$\(UseNativeRendering\)' == 'true' \">uno\.platform\.gallery\.native","'net10.0-android' AND '\$\(UseNativeRendering\)' == 'true' \">uno.platform.gallery.native_canary" } |
+ set-content $a }
+ displayName: 'Adjust ApplicationId (Android Native)'
+ condition: startsWith(variables['Build.SourceBranch'], 'refs/heads/canaries')
+
+ - pwsh: |
+ gci -r -include "Uno.Gallery.csproj" |
+ foreach-object {
+ $a = $_.fullname; ( get-content $a ) |
+ foreach-object { $_ -replace "'net10.0-ios' AND '\$\(UseNativeRendering\)' == 'true' \">uno\.platform\.gallery\.native","'net10.0-ios' AND '\$\(UseNativeRendering\)' == 'true' \">uno.platform.gallery.native-canary" } |
set-content $a }
- displayName: 'Adjust info.plist bundle name (Android)'
+ displayName: 'Adjust ApplicationId (iOS Native)'
condition: startsWith(variables['Build.SourceBranch'], 'refs/heads/canaries')
- pwsh: |
@@ -71,5 +80,5 @@ steps:
$a = $_.fullname; ( get-content $a ) |
foreach-object { $_ -replace "com.nventive.uno.gallery","com.nventive.uno.gallery-canary" } |
set-content $a }
- displayName: 'Adjust info.plist bundle name (Catalyst)'
+ displayName: 'Adjust ApplicationId (iOS Skia and macOS Desktop)'
condition: startsWith(variables['Build.SourceBranch'], 'refs/heads/canaries')
diff --git a/build/templates/dotnet-install-linux.yml b/build/templates/dotnet-install-linux.yml
index 20647d0f0..de70c21ec 100644
--- a/build/templates/dotnet-install-linux.yml
+++ b/build/templates/dotnet-install-linux.yml
@@ -1,6 +1,6 @@
parameters:
- DotNetVersion: '9.0.300'
- UnoCheck_Version: '1.31.13'
+ DotNetVersion: '10.0.100'
+ UnoCheck_Version: '1.33.1'
installJava: true
installWorkloads: true
UnoCheckParameters: ''
diff --git a/build/templates/dotnet-install-mac.yml b/build/templates/dotnet-install-mac.yml
index ac7265011..bdae553ab 100644
--- a/build/templates/dotnet-install-mac.yml
+++ b/build/templates/dotnet-install-mac.yml
@@ -1,6 +1,6 @@
parameters:
- DotNetVersion: '9.0.300'
- UnoCheck_Version: '1.31.13'
+ DotNetVersion: '10.0.100'
+ UnoCheck_Version: '1.33.1'
installWorkloads: true
UnoCheckParameters: ''
diff --git a/build/templates/dotnet-install-windows.yml b/build/templates/dotnet-install-windows.yml
index 2c8e74e36..08fd97196 100644
--- a/build/templates/dotnet-install-windows.yml
+++ b/build/templates/dotnet-install-windows.yml
@@ -1,6 +1,6 @@
parameters:
- DotNetVersion: '9.0.300'
- UnoCheck_Version: '1.31.13'
+ DotNetVersion: '10.0.100'
+ UnoCheck_Version: '1.33.1'
UnoCheckParameters: ''
steps:
diff --git a/build/templates/master-publish/stage-publish-android.yml b/build/templates/master-publish/stage-publish-android.yml
index fada26f47..fd53cb200 100644
--- a/build/templates/master-publish/stage-publish-android.yml
+++ b/build/templates/master-publish/stage-publish-android.yml
@@ -27,7 +27,7 @@
inputs:
serviceConnection: 'Uno Platform Google Play'
applicationId: 'uno.platform.gallery.native'
- bundleFile: '$(Pipeline.Workspace)/drop/publish/uno.platform.gallery_native-Signed.aab'
+ bundleFile: '$(Pipeline.Workspace)/drop/publish/uno.platform.gallery.native-Signed.aab'
track: 'alpha'
- deployment: 'Android_Publish_Skia'
diff --git a/build/templates/master-publish/stage-publish-catalyst.yml b/build/templates/master-publish/stage-publish-catalyst.yml
deleted file mode 100644
index de78c0c4e..000000000
--- a/build/templates/master-publish/stage-publish-catalyst.yml
+++ /dev/null
@@ -1,62 +0,0 @@
-stages:
-- stage: Catalyst_Publish
- displayName: 'Catalyst Publish'
- dependsOn: Apple
-
- jobs:
- - deployment: 'Catalyst_Publish_Native'
- displayName: 'Publish Catalyst Native'
- environment: Uno Gallery
- pool:
- vmImage: macos-latest
-
- strategy:
- runOnce:
- deploy:
- steps:
- # https://github.com/microsoft/azure-pipelines-tasks/issues/17207
- - download: none
- - task: DownloadPipelineArtifact@2
- inputs:
- artifactName: 'catalyst-native'
- targetPath: '$(Pipeline.Workspace)/drop'
- displayName: Download artifacts
-
- - task: ms-vsclient.app-store.app-store-release.AppStoreRelease@1
- displayName: 'Publish to the App Store TestFlight track'
- inputs:
- serviceEndpoint: 'App Store (uno platform)'
- appIdentifier: uno.platform.gallery.native
- appType: macOS
- ipaPath: '$(Pipeline.Workspace)/drop/net9.0-maccatalyst/Uno.Gallery-*.pkg'
- shouldSkipWaitingForProcessing: true
- appSpecificId: 6739235480
-
- - deployment: 'Catalyst_Publish_Skia'
- displayName: 'Publish Catalyst Skia'
- environment: Uno Gallery
- pool:
- vmImage: macos-latest
-
- strategy:
- runOnce:
- deploy:
- steps:
- # https://github.com/microsoft/azure-pipelines-tasks/issues/17207
- - download: none
- - task: DownloadPipelineArtifact@2
- inputs:
- artifactName: 'Catalyst-skia'
- targetPath: '$(Pipeline.Workspace)/drop'
- displayName: Download artifacts
-
- - task: ms-vsclient.app-store.app-store-release.AppStoreRelease@1
- displayName: 'Publish to the App Store TestFlight track'
- inputs:
- serviceEndpoint: 'App Store (uno platform)'
- appIdentifier: com.nventive.uno.gallery
- appType: macOS
- ipaPath: '$(Pipeline.Workspace)/drop/net9.0-maccatalyst/Uno.Gallery-*.pkg'
- shouldSkipWaitingForProcessing: true
- appSpecificId: 1619130328
-
diff --git a/build/templates/master-publish/stage-publish-ios.yml b/build/templates/master-publish/stage-publish-ios.yml
index 2e4e2a7b9..d2b53d252 100644
--- a/build/templates/master-publish/stage-publish-ios.yml
+++ b/build/templates/master-publish/stage-publish-ios.yml
@@ -27,9 +27,9 @@
inputs:
serviceEndpoint: 'App Store (uno platform)'
appIdentifier: uno.platform.gallery.native
- ipaPath: '$(Pipeline.Workspace)/drop/net9.0-ios/ios-arm64/publish/Uno.Gallery.ipa'
+ ipaPath: '$(Pipeline.Workspace)/drop/net10.0-ios/ios-arm64/publish/Uno.Gallery.ipa'
shouldSkipWaitingForProcessing: true
- appSpecificId: 6739235480
+ appSpecificId: 6745625441
- deployment: 'iOS_Publish_Skia'
displayName: 'Publish iOS Skia'
@@ -54,6 +54,6 @@
inputs:
serviceEndpoint: 'App Store (uno platform)'
appIdentifier: com.nventive.uno.gallery
- ipaPath: '$(Pipeline.Workspace)/drop/net9.0-ios/ios-arm64/publish/Uno.Gallery.ipa'
+ ipaPath: '$(Pipeline.Workspace)/drop/net10.0-ios/ios-arm64/publish/Uno.Gallery.ipa'
shouldSkipWaitingForProcessing: true
- appSpecificId: 1619130328
+ appSpecificId: 1380984680
diff --git a/build/templates/master-publish/stage-publish-macos-desktop.yml b/build/templates/master-publish/stage-publish-macos-desktop.yml
new file mode 100644
index 000000000..51ba273de
--- /dev/null
+++ b/build/templates/master-publish/stage-publish-macos-desktop.yml
@@ -0,0 +1,39 @@
+stages:
+- stage: macOS_Desktop_Publish
+ displayName: 'macOS Desktop Publish'
+ dependsOn: Skia_Desktop
+
+ jobs:
+ - deployment: 'macOS_Desktop_Publish_Skia'
+ displayName: 'Publish macOS Desktop Skia'
+ environment: Uno Gallery
+ pool:
+ vmImage: macos-latest
+
+ strategy:
+ runOnce:
+ deploy:
+ steps:
+ # https://github.com/microsoft/azure-pipelines-tasks/issues/17207
+ - download: none
+ - task: DownloadPipelineArtifact@2
+ inputs:
+ artifactName: 'macOS-desktop'
+ targetPath: '$(Pipeline.Workspace)/drop'
+ displayName: Download artifacts
+
+ - script: |
+ echo "macOS Desktop artifacts downloaded successfully"
+ ls -la "$(Pipeline.Workspace)/drop"
+ displayName: 'Verify macOS Desktop artifacts'
+
+ - task: ms-vsclient.app-store.app-store-release.AppStoreRelease@1
+ displayName: 'Publish to the App Store TestFlight track'
+ inputs:
+ serviceEndpoint: 'App Store (uno platform)'
+ appIdentifier: com.nventive.uno.gallery
+ appType: macOS
+ ipaPath: '$(Pipeline.Workspace)/drop/net10.0-desktop/osx-x64/publish/*.pkg'
+ shouldSkipWaitingForProcessing: true
+ appSpecificId: 1380984680
+
diff --git a/build/templates/set-emsdk-cache.yml b/build/templates/set-emsdk-cache.yml
index 8b0db45a4..0053a5cbb 100644
--- a/build/templates/set-emsdk-cache.yml
+++ b/build/templates/set-emsdk-cache.yml
@@ -1,5 +1,5 @@
parameters:
- UnoCheck_Version: '1.31.0-dev.12'
+ UnoCheck_Version: '1.33.1'
steps:
- pwsh: |
diff --git a/global.json b/global.json
index ad95fa33e..64f3f8667 100644
--- a/global.json
+++ b/global.json
@@ -4,6 +4,6 @@
},
// To update the version of Uno please update the version of the Uno.Sdk here. See https://aka.platform.uno/upgrade-uno-packages for more information.
"msbuild-sdks": {
- "Uno.Sdk": "6.2.36"
+ "Uno.Sdk": "6.4.42"
}
}