From 207a6487e450c6d784ea52e84bc6fbe04448533b Mon Sep 17 00:00:00 2001 From: agneszitte Date: Mon, 15 Dec 2025 20:40:22 -0500 Subject: [PATCH 1/5] chore: Upgrade to .NET 10.0, Uno.Sdk 6.4.42, remove MacCatalyst as deprecated and migrate macOS to Desktop (Skia) --- .github/workflows/azure-static-webapp.yml | 12 +-- .run/Readme.md | 3 + ....Gallery (WebAssembly IIS Express).run.xml | 19 +++++ .run/Uno.Gallery (WebAssembly).run.xml | 19 +++++ .run/Uno.Gallery.run.xml | 18 +++++ .vscode/extensions.json | 5 ++ .vscode/launch.json | 77 +++++++++++++++++++ .vscode/settings.json | 11 ++- .vscode/tasks.json | 57 ++++++++++++++ .../Uno.Gallery.UITests.csproj | 2 +- Uno.Gallery/App.xaml.cs | 4 +- .../Entitlements.plist | 5 ++ .../{MacCatalyst => Desktop}/Info.plist | 14 +--- .../Platforms/MacCatalyst/Main.maccatalyst.cs | 25 ------ .../LaunchImages.launchimage/Contents.json | 58 -------------- Uno.Gallery/Properties/launchSettings.json | 2 +- Uno.Gallery/Uno.Gallery.csproj | 59 +++++--------- azure-pipelines.yml | 66 +++++++--------- build/build.csproj | 18 +++-- build/scripts/android-uitest-build.sh | 2 +- build/scripts/android-uitest-run.sh | 2 +- build/scripts/ios-uitest-build.sh | 2 +- build/scripts/ios-uitest-run.sh | 6 +- build/scripts/local-ios-uitest-run.sh | 2 +- build/scripts/wasm-uitest-build.sh | 9 ++- build/stage-build-android-mobile.yml | 8 +- build/stage-build-macos-desktop.yml | 54 +++++++++++++ build/stage-build-mobile.yml | 2 +- build/stage-build-skia-desktop.yml | 4 +- build/stage-build-wasm.yml | 2 +- build/stage-build-windows.yml | 4 +- build/stage-uitests-android.yml | 8 +- build/stage-uitests-ios.yml | 4 +- build/stage-uitests-wasm.yml | 9 ++- .../stage-publish-catalyst-canary.yml | 62 --------------- .../stage-publish-ios-canary.yml | 4 +- .../stage-publish-macos-desktop-canary.yml | 38 +++++++++ build/templates/canary-updater.yml | 6 +- build/templates/dotnet-install-linux.yml | 4 +- build/templates/dotnet-install-mac.yml | 4 +- build/templates/dotnet-install-windows.yml | 4 +- .../master-publish/stage-publish-catalyst.yml | 62 --------------- .../master-publish/stage-publish-ios.yml | 4 +- .../stage-publish-macos-desktop.yml | 39 ++++++++++ build/templates/set-emsdk-cache.yml | 2 +- global.json | 2 +- 46 files changed, 464 insertions(+), 359 deletions(-) create mode 100644 .run/Readme.md create mode 100644 .run/Uno.Gallery (WebAssembly IIS Express).run.xml create mode 100644 .run/Uno.Gallery (WebAssembly).run.xml create mode 100644 .run/Uno.Gallery.run.xml create mode 100644 .vscode/extensions.json create mode 100644 .vscode/launch.json create mode 100644 .vscode/tasks.json rename Uno.Gallery/Platforms/{MacCatalyst => Desktop}/Entitlements.plist (63%) rename Uno.Gallery/Platforms/{MacCatalyst => Desktop}/Info.plist (74%) delete mode 100644 Uno.Gallery/Platforms/MacCatalyst/Main.maccatalyst.cs delete mode 100644 Uno.Gallery/Platforms/MacCatalyst/Media.xcassets/LaunchImages.launchimage/Contents.json create mode 100644 build/stage-build-macos-desktop.yml delete mode 100644 build/templates/canary-publish/stage-publish-catalyst-canary.yml create mode 100644 build/templates/canary-publish/stage-publish-macos-desktop-canary.yml delete mode 100644 build/templates/master-publish/stage-publish-catalyst.yml create mode 100644 build/templates/master-publish/stage-publish-macos-desktop.yml 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/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/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..f84db03c6 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 - + - + diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 4b07720b5..1ce5f1cc5 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -42,8 +42,8 @@ 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 @@ -96,7 +96,7 @@ stages: - 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 + value: net10.0-windows10.0.19041 - name: ArtifactName value: Windows - name: VersionCodeOffset @@ -130,29 +130,22 @@ stages: strategy: matrix: iOS: - BuildTargetFramework: net9.0-ios + BuildTargetFramework: net10.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 + BuildTargetFramework: net10.0-ios ArtifactName: iOS-mobile ApplicationBuildNumberOffset: 50 BuildCommand: publish UseNativeRendering: false VariantName: Skia - Catalyst_Skia: - BuildTargetFramework: net9.0-maccatalyst - ArtifactName: Catalyst + macOS_Desktop: + BuildTargetFramework: net10.0-desktop + ArtifactName: macOS-desktop ApplicationBuildNumberOffset: 50 BuildCommand: build UseNativeRendering: false @@ -176,29 +169,18 @@ stages: # deleteCert: true - task: InstallAppleCertificate@2 - displayName: Install Certificate + displayName: Install Certificate (Mac Installer) inputs: certSecureFile: UnoPlatform-MacInstaller.p12 certPwd: $(appleappstorecertificatepassword) - keychain: temp + keychain: default # disabled because of azure devops failing to uninstall as of 2022-11-16 # deleteCert: true + condition: and(succeeded(), eq(variables['BuildTargetFramework'], 'net10.0-desktop')) # - # Gallery Skia + # iOS Provisioning Profiles (Skia variant) # - - task: InstallAppleProvisioningProfile@1 - displayName: 'Install Apple Provisioning Profile' - inputs: - provisioningProfileLocation: 'secureFiles' - provProfileSecureFile: Uno_Gallery_Catalyst.provisionprofile - - - 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: @@ -212,21 +194,24 @@ stages: provProfileSecureFile: Uno_Gallery_Canary_iOS.mobileprovision # - # Gallery Native + # macOS Desktop Provisioning Profiles (Skia variant) # - - task: InstallAppleProvisioningProfile@1 displayName: 'Install Apple Provisioning Profile' inputs: provisioningProfileLocation: 'secureFiles' - provProfileSecureFile: Uno_Gallery_Native_Catalyst.provisionprofile - + provProfileSecureFile: Uno_Gallery_macOS_Desktop.provisionprofile + - task: InstallAppleProvisioningProfile@1 displayName: 'Install Apple Provisioning Profile' inputs: provisioningProfileLocation: 'secureFiles' - provProfileSecureFile: Uno_Gallery_Native_Canary_Catalyst.provisionprofile - + provProfileSecureFile: Uno_Gallery_Canary_macOS_Desktop.provisionprofile + + # + # iOS Provisioning Profiles (Native variant) + # + - task: InstallAppleProvisioningProfile@1 displayName: 'Install Apple Provisioning Profile' inputs: @@ -244,7 +229,10 @@ stages: parameters: xCodeRoot: $(XCODE_ROOT) - - template: build/stage-build-mobile.yml + - ${{ if eq(variables['BuildTargetFramework'], 'net10.0-desktop') }}: + - template: build/stage-build-macos-desktop.yml + - ${{ else }}: + - template: build/stage-build-mobile.yml - stage: WebAssembly displayName: 'WebAssembly' @@ -292,11 +280,11 @@ stages: - ${{ 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-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-catalyst.yml + - template: build/templates/master-publish/stage-publish-macos-desktop.yml - template: build/templates/master-publish/stage-publish-android.yml 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..a998646d6 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,7 +34,7 @@ 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 diff --git a/build/stage-build-macos-desktop.yml b/build/stage-build-macos-desktop.yml new file mode 100644 index 000000000..5f0c79a10 --- /dev/null +++ b/build/stage-build-macos-desktop.yml @@ -0,0 +1,54 @@ +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 + echo "BUILD_SOURCEBRANCH: $BUILD_SOURCEBRANCH" + dotnet publish -f net10.0-desktop -r osx-x64 -c Release \ + -p:TargetFrameworkOverride=net10.0-desktop \ + -p:PackageFormat=pkg \ + -p:InformationalVersion=$(NBGV_InformationalVersion) \ + -p:CodesignKey="$(MacOS_Certificate_Identity)" \ + -bl:$(build.artifactstagingdirectory)/pkg-$(BuildTargetFramework).binlog + displayName: Create installer (.pkg) + env: + XCODE_ROOT: $(XCODE_ROOT) + +- task: CopyFiles@2 + displayName: 'Publish Binaries' + inputs: + SourceFolder: $(build.sourcesdirectory)/Uno.Gallery/bin/Release/net10.0-desktop/osx-x64/publish/ + Contents: | + **/*.pkg + TargetFolder: $(build.artifactstagingdirectory) + CleanTargetFolder: false + OverWrite: false + flattenFolders: false + +- task: PublishBuildArtifacts@1 + retryCountOnTaskFailure: 3 + condition: succeeded() + inputs: + ArtifactName: $(ArtifactName) + PathtoPublish: $(build.artifactstagingdirectory) + +- task: PublishBuildArtifacts@1 + retryCountOnTaskFailure: 3 + condition: always() + inputs: + PathtoPublish: $(build.artifactstagingdirectory) + ArtifactName: $(ArtifactName)-logs diff --git a/build/stage-build-mobile.yml b/build/stage-build-mobile.yml index 70ea7a8de..d08cbefb5 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 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/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..333eb2508 100644 --- a/build/templates/canary-publish/stage-publish-ios-canary.yml +++ b/build/templates/canary-publish/stage-publish-ios-canary.yml @@ -27,7 +27,7 @@ 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 @@ -54,6 +54,6 @@ inputs: serviceEndpoint: 'App Store (uno platform)' appIdentifier: uno.platform.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: 6739235480 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..14a104797 --- /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: Apple + + 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/**/*.pkg' + shouldSkipWaitingForProcessing: true + appSpecificId: 1619130328 diff --git a/build/templates/canary-updater.yml b/build/templates/canary-updater.yml index 607a5e12a..5204bbf08 100644 --- a/build/templates/canary-updater.yml +++ b/build/templates/canary-updater.yml @@ -53,7 +53,7 @@ steps: $a = $_.fullname; ( get-content $a ) | foreach-object { $_ -replace "uno.platform.gallery.skia","uno.platform.gallery.skia-canary" } | set-content $a } - displayName: 'Adjust info.plist bundle name (skia)' + displayName: 'Adjust ApplicationId (Skia variants)' condition: startsWith(variables['Build.SourceBranch'], 'refs/heads/canaries') - pwsh: | @@ -62,7 +62,7 @@ steps: $a = $_.fullname; ( get-content $a ) | foreach-object { $_ -replace "com.nventive.uno.ui.demo","com.nventive.uno.ui.demo.canary" } | set-content $a } - displayName: 'Adjust info.plist bundle name (Android)' + displayName: 'Adjust ApplicationId (Android Skia)' condition: startsWith(variables['Build.SourceBranch'], 'refs/heads/canaries') - pwsh: | @@ -71,5 +71,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-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..f97faca78 100644 --- a/build/templates/master-publish/stage-publish-ios.yml +++ b/build/templates/master-publish/stage-publish-ios.yml @@ -27,7 +27,7 @@ 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 @@ -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 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..9a9a2584a --- /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: Apple + + 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/**/*.pkg' + shouldSkipWaitingForProcessing: true + appSpecificId: 1619130328 + 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" } } From dda8f15b7a7ad3d0ae28e9027b6c042dc05429a3 Mon Sep 17 00:00:00 2001 From: agneszitte Date: Wed, 17 Dec 2025 09:46:00 -0500 Subject: [PATCH 2/5] chore: More tests and adjustments --- Directory.Build.props | 6 + Uno.Gallery/Directory.Build.props | 12 + Uno.Gallery/Uno.Gallery.csproj | 7 +- azure-pipelines.yml | 464 ++++++++++-------- before.Uno.Gallery.sln.targets | 6 + build/stage-build-android-mobile.yml | 4 +- build/stage-build-macos-desktop.yml | 131 ++++- build/stage-build-mobile.yml | 8 +- build/templates/APP_ID_MAPPINGS.md | 139 ++++++ .../stage-publish-android-canary.yml | 2 +- .../stage-publish-ios-canary.yml | 6 +- .../stage-publish-macos-desktop-canary.yml | 4 +- build/templates/canary-updater.yml | 17 +- .../master-publish/stage-publish-android.yml | 2 +- .../master-publish/stage-publish-ios.yml | 4 +- .../stage-publish-macos-desktop.yml | 6 +- nuget.config | 4 + 17 files changed, 584 insertions(+), 238 deletions(-) create mode 100644 Uno.Gallery/Directory.Build.props create mode 100644 before.Uno.Gallery.sln.targets create mode 100644 build/templates/APP_ID_MAPPINGS.md 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/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/Uno.Gallery.csproj b/Uno.Gallery/Uno.Gallery.csproj index f84db03c6..4d81cd325 100644 --- a/Uno.Gallery/Uno.Gallery.csproj +++ b/Uno.Gallery/Uno.Gallery.csproj @@ -27,7 +27,7 @@ uno.platform.gallery com.nventive.uno.ui.demo - uno.platform.gallery_native + uno.platform.gallery.native com.nventive.uno.gallery uno.platform.gallery.native @@ -221,4 +221,9 @@ + + + true + + diff --git a/azure-pipelines.yml b/azure-pipelines.yml index 1ce5f1cc5..3328f3625 100644 --- a/azure-pipelines.yml +++ b/azure-pipelines.yml @@ -49,113 +49,152 @@ variables: 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: 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: 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: 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 - macOS_Desktop: - BuildTargetFramework: net10.0-desktop - ArtifactName: macOS-desktop - 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: @@ -165,37 +204,16 @@ 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 (Mac Installer) inputs: certSecureFile: UnoPlatform-MacInstaller.p12 certPwd: $(appleappstorecertificatepassword) - keychain: default - # disabled because of azure devops failing to uninstall as of 2022-11-16 - # deleteCert: true - condition: and(succeeded(), eq(variables['BuildTargetFramework'], 'net10.0-desktop')) - - # - # 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 + keychain: temp + continueOnError: true - # - # macOS Desktop Provisioning Profiles (Skia variant) - # + # macOS Desktop Provisioning Profiles - task: InstallAppleProvisioningProfile@1 displayName: 'Install Apple Provisioning Profile' inputs: @@ -208,83 +226,141 @@ stages: provisioningProfileLocation: 'secureFiles' provProfileSecureFile: Uno_Gallery_Canary_macOS_Desktop.provisionprofile - # - # 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) - - ${{ if eq(variables['BuildTargetFramework'], 'net10.0-desktop') }}: - - template: build/stage-build-macos-desktop.yml - - ${{ else }}: - - 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-macos-desktop-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-macos-desktop.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/stage-build-android-mobile.yml b/build/stage-build-android-mobile.yml index a998646d6..6d5b86097 100644 --- a/build/stage-build-android-mobile.yml +++ b/build/stage-build-android-mobile.yml @@ -36,8 +36,8 @@ steps: inputs: 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 index 5f0c79a10..ada63f18f 100644 --- a/build/stage-build-macos-desktop.yml +++ b/build/stage-build-macos-desktop.yml @@ -14,41 +14,130 @@ steps: - template: templates/dotnet-install-mac.yml - template: templates/canary-updater.yml - + - bash: | cd $(build.sourcesdirectory)/Uno.Gallery - echo "BUILD_SOURCEBRANCH: $BUILD_SOURCEBRANCH" - dotnet publish -f net10.0-desktop -r osx-x64 -c Release \ - -p:TargetFrameworkOverride=net10.0-desktop \ - -p:PackageFormat=pkg \ - -p:InformationalVersion=$(NBGV_InformationalVersion) \ - -p:CodesignKey="$(MacOS_Certificate_Identity)" \ + + # 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 entire solution first (all projects and frameworks) + # Then publish specific framework with explicit runtime version for Mono runtime + dotnet restore $(build.sourcesdirectory)/Uno.Gallery.sln \ + -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" \ + /p:RuntimeFrameworkVersion=10.0.1-servicing.25554.104 \ + -nologo --verbosity normal \ -bl:$(build.artifactstagingdirectory)/pkg-$(BuildTargetFramework).binlog - displayName: Create installer (.pkg) + + # 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) -- task: CopyFiles@2 - displayName: 'Publish Binaries' - inputs: - SourceFolder: $(build.sourcesdirectory)/Uno.Gallery/bin/Release/net10.0-desktop/osx-x64/publish/ - Contents: | - **/*.pkg - TargetFolder: $(build.artifactstagingdirectory) - CleanTargetFolder: false - OverWrite: false - flattenFolders: false +- 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: $(ArtifactName) + ArtifactName: macOS-desktop PathtoPublish: $(build.artifactstagingdirectory) - task: PublishBuildArtifacts@1 retryCountOnTaskFailure: 3 condition: always() inputs: - PathtoPublish: $(build.artifactstagingdirectory) - ArtifactName: $(ArtifactName)-logs + PathtoPublish: $(build.artifactstagingdirectory)/logs + ArtifactName: macos-logs diff --git a/build/stage-build-mobile.yml b/build/stage-build-mobile.yml index d08cbefb5..44dad4444 100644 --- a/build/stage-build-mobile.yml +++ b/build/stage-build-mobile.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/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-ios-canary.yml b/build/templates/canary-publish/stage-publish-ios-canary.yml index 333eb2508..e21d28d6d 100644 --- a/build/templates/canary-publish/stage-publish-ios-canary.yml +++ b/build/templates/canary-publish/stage-publish-ios-canary.yml @@ -29,7 +29,7 @@ appIdentifier: uno.platform.gallery.native-canary 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 + 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 index 14a104797..5e5d3d92a 100644 --- a/build/templates/canary-publish/stage-publish-macos-desktop-canary.yml +++ b/build/templates/canary-publish/stage-publish-macos-desktop-canary.yml @@ -1,7 +1,7 @@ stages: - stage: macOS_Desktop_Publish displayName: 'macOS Desktop Publish' - dependsOn: Apple + dependsOn: Skia_Desktop jobs: - deployment: 'macOS_Desktop_Publish_Skia' @@ -33,6 +33,6 @@ serviceEndpoint: 'App Store (uno platform)' appIdentifier: com.nventive.uno.gallery-canary appType: macOS - ipaPath: '$(Pipeline.Workspace)/drop/net10.0-desktop/**/*.pkg' + 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 5204bbf08..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 ApplicationId (Skia variants)' + 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 Skia)' + 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 ApplicationId (iOS Native)' condition: startsWith(variables['Build.SourceBranch'], 'refs/heads/canaries') - pwsh: | 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-ios.yml b/build/templates/master-publish/stage-publish-ios.yml index f97faca78..d2b53d252 100644 --- a/build/templates/master-publish/stage-publish-ios.yml +++ b/build/templates/master-publish/stage-publish-ios.yml @@ -29,7 +29,7 @@ appIdentifier: uno.platform.gallery.native 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' @@ -56,4 +56,4 @@ appIdentifier: com.nventive.uno.gallery 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 index 9a9a2584a..51ba273de 100644 --- a/build/templates/master-publish/stage-publish-macos-desktop.yml +++ b/build/templates/master-publish/stage-publish-macos-desktop.yml @@ -1,7 +1,7 @@ stages: - stage: macOS_Desktop_Publish displayName: 'macOS Desktop Publish' - dependsOn: Apple + dependsOn: Skia_Desktop jobs: - deployment: 'macOS_Desktop_Publish_Skia' @@ -33,7 +33,7 @@ serviceEndpoint: 'App Store (uno platform)' appIdentifier: com.nventive.uno.gallery appType: macOS - ipaPath: '$(Pipeline.Workspace)/drop/net10.0-desktop/**/*.pkg' + ipaPath: '$(Pipeline.Workspace)/drop/net10.0-desktop/osx-x64/publish/*.pkg' shouldSkipWaitingForProcessing: true - appSpecificId: 1619130328 + appSpecificId: 1380984680 diff --git a/nuget.config b/nuget.config index ad467f12a..15c156fdc 100644 --- a/nuget.config +++ b/nuget.config @@ -3,5 +3,9 @@ + + + + From 719babada74c2a957f000de7b90e785d58c04f53 Mon Sep 17 00:00:00 2001 From: agneszitte Date: Wed, 17 Dec 2025 09:57:55 -0500 Subject: [PATCH 3/5] chore: More tests --- build/stage-build-macos-desktop.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/build/stage-build-macos-desktop.yml b/build/stage-build-macos-desktop.yml index ada63f18f..9fa559607 100644 --- a/build/stage-build-macos-desktop.yml +++ b/build/stage-build-macos-desktop.yml @@ -50,9 +50,10 @@ steps: # Remove extended attributes from source xattr -cr $(build.sourcesdirectory) 2>/dev/null || true - # Restore entire solution first (all projects and frameworks) + # Restore the Gallery project with RID to download osx-x64 runtime pack # Then publish specific framework with explicit runtime version for Mono runtime - dotnet restore $(build.sourcesdirectory)/Uno.Gallery.sln \ + dotnet restore $(build.sourcesdirectory)/Uno.Gallery/Uno.Gallery.csproj \ + -r osx-x64 \ -nologo --verbosity quiet dotnet publish $(build.sourcesdirectory)/Uno.Gallery/Uno.Gallery.csproj \ From 87b0a2be984f7caa9423f5e0f826f635d3e80bd8 Mon Sep 17 00:00:00 2001 From: agneszitte Date: Wed, 17 Dec 2025 10:21:59 -0500 Subject: [PATCH 4/5] chore: more tests --- build/stage-build-macos-desktop.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/build/stage-build-macos-desktop.yml b/build/stage-build-macos-desktop.yml index 9fa559607..7f7838b82 100644 --- a/build/stage-build-macos-desktop.yml +++ b/build/stage-build-macos-desktop.yml @@ -50,10 +50,11 @@ steps: # Remove extended attributes from source xattr -cr $(build.sourcesdirectory) 2>/dev/null || true - # Restore the Gallery project with RID to download osx-x64 runtime pack - # Then publish specific framework with explicit runtime version for Mono runtime + # Restore the Gallery project with RID and explicit runtime version for Mono runtime + # The servicing version 10.0.1-servicing.25554.104 is required because 10.0.0 doesn't exist dotnet restore $(build.sourcesdirectory)/Uno.Gallery/Uno.Gallery.csproj \ -r osx-x64 \ + /p:RuntimeFrameworkVersion=10.0.1-servicing.25554.104 \ -nologo --verbosity quiet dotnet publish $(build.sourcesdirectory)/Uno.Gallery/Uno.Gallery.csproj \ From 76a8e065c10f0dcca641f41f79a2a7272447389d Mon Sep 17 00:00:00 2001 From: agneszitte Date: Wed, 17 Dec 2025 20:54:19 -0500 Subject: [PATCH 5/5] chore: More tests without feed --- build/stage-build-macos-desktop.yml | 6 ++---- nuget.config | 4 ---- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/build/stage-build-macos-desktop.yml b/build/stage-build-macos-desktop.yml index 7f7838b82..3bbc33213 100644 --- a/build/stage-build-macos-desktop.yml +++ b/build/stage-build-macos-desktop.yml @@ -50,11 +50,10 @@ steps: # Remove extended attributes from source xattr -cr $(build.sourcesdirectory) 2>/dev/null || true - # Restore the Gallery project with RID and explicit runtime version for Mono runtime - # The servicing version 10.0.1-servicing.25554.104 is required because 10.0.0 doesn't exist + # 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 \ - /p:RuntimeFrameworkVersion=10.0.1-servicing.25554.104 \ -nologo --verbosity quiet dotnet publish $(build.sourcesdirectory)/Uno.Gallery/Uno.Gallery.csproj \ @@ -63,7 +62,6 @@ steps: /p:InformationalVersion="$NBGV_InformationalVersion" \ /p:CodesignKey="$MACOS_CERT_IDENTITY" \ /p:PackageSigningKey="$MACOS_INSTALLER_CERT_IDENTITY" \ - /p:RuntimeFrameworkVersion=10.0.1-servicing.25554.104 \ -nologo --verbosity normal \ -bl:$(build.artifactstagingdirectory)/pkg-$(BuildTargetFramework).binlog diff --git a/nuget.config b/nuget.config index 15c156fdc..ad467f12a 100644 --- a/nuget.config +++ b/nuget.config @@ -3,9 +3,5 @@ - - - -