Back to Uno

Using the Uno.Sdk

doc/articles/features/using-the-uno-sdk.md

6.6-release-branch-cut29.4 KB
Original Source

Using the Uno.Sdk

Uno Platform projects use the Uno.Sdk package that is designed to keep projects simple, yet configurable. It imports the Microsoft.Net.Sdk (and the Microsoft.Net.Sdk.Web for WebAssembly).

This document explains the many features of this SDK and how to configure its behavior.

[!TIP] Uno.Sdk enabled projects are best experienced using the MSBuild Editor Visual Studio Extension to provide intellisense.

Managing the Uno.Sdk version

Updating the Uno.Sdk is done through the global.json file.

Uno Platform Features

As Uno Platform can be used in many different ways, in order to reduce the build time and avoid downloading many packages, the Uno.Sdk offers a way to simplify which Uno Platform features should be enabled.

You can use the UnoFeatures property in the csproj or Directory.Build.props as shown here:

xml
<UnoFeatures>
    Material;
    Hosting;
    Toolkit;
    Logging;
    Serilog;
    MVUX;
    Configuration;
    Http;
    HttpRefit;
    HttpKiota;
    Serialization;
    Localization;
    Navigation;
    SkiaRenderer;
</UnoFeatures>

[!IMPORTANT] Once you have changed the features list, Visual Studio requires restoring packages explicitly, or building the app once for the change to take effect.

This allows for the SDK to selectively include references to relevant sets of Nuget packages to enable features for your app.

Here are the supported features:

FeatureDescription
AuthenticationAdds the Uno.Extensions packages for Custom Authentication.
AuthenticationMsalAdds the Uno.Extensions packages for Authentication using Microsoft.Identity.Client.
AuthenticationOidcAdds the Uno.Extensions packages for Authentication using a custom Oidc client.
ConfigurationAdds the Uno.Extensions packages for Configuration.
CSharpMarkupAdds support for C# Markup.
CupertinoAdds support for the Cupertino Design Theme library. If the Toolkit feature is also used, it will add support for the Cupertino Design Toolkit library.
DspAdds support for the Uno.Dsp.Tasks packages.
ExtensionsAdds the most commonly used Extensions Packages for Hosting, Configuration, and Logging.
FoldableAdds a reference to Uno.WinUI.Foldable.
GLCanvasAdds support for the OpenGL Canvas.
SpellCheckingAdds support for spell checking.
GooglePlayAdds support for In App Reviews. For more information, see the Store Context documentation.
HostingAdds support for Dependency Injection using Uno.Extensions.Hosting packages.
HttpAdds support for custom Http Clients with Uno.Extensions.
HttpRefitAdds support for strongly-typed REST API clients via Refit
HttpKiotaAdds support for OpenAPI-generated clients via Kiota
LocalizationAdds support for Localization using Uno.Extensions.
LoggingAdds support for Logging using Uno.Extensions.
LoggingSerilogAdds support for Serilog using Uno.Extensions.
LottieAdds support for Lottie animations.
MaterialAdds support for the Material Design Theme library. If the Toolkit feature is also used, it will add support for the Material Design Toolkit library.
MauiEmbeddingAdds support for embedding Maui controls in Uno Platform applications.
MediaPlayerElementAdds native references where needed to use MediaPlayerElement.
MvvmAdds support for the CommunityToolkit.Mvvm package.
MVUXAdds support for MVUX.
NavigationAdds support for Navigation using Uno.Extensions.
PrismAdds Prism support for Uno Platform applications WinUI.
SerializationAdds support for Serialization using Uno.Extensions.
SimpleThemeAdds support for the Simple Design Theme library. If the Toolkit feature is also used, it will add support for the Simple Design Toolkit library.
SkiaAdds support for SkiaSharp.
SkiaRendererAdds support for using Skia as the graphics rendering engine. For more details, see Skia Rendering documentation.
SpellCheckingAdds support for spell-checking in TextBox controls on all Skia-based targets via Uno.WinUI.SpellChecking.
StorageAdds support for Storage using Uno.Extensions.
SvgSVG support for iOS, and Android. This option is not needed when only targeting WebAssembly and WinAppSDK.
ThemeServiceAdds the Uno.Extensions.Core.WinUI package.
ToolkitAdds support for the Uno.Toolkit.
WebViewAdds support for the WebView2 control.

Implicit Packages

Uno Platform is composed of many required and optional NuGet packages. By default, the SDK automatically references the Uno.UI required packages based on the current target framework, using versions appropriate for the version of Uno Platform being used.

It is possible to configure the version of those packages in two ways. The first is by using an explicit PackageReference to any of the Uno Platform packages, or by using the *Version properties supported by the SDK. These versions are used by the UnoFeatures defined for your app.

Here are the supported properties:

Uno Platform Packages

PropertyNuGet Package(s)Description
UnoCoreLoggingSingletonVersionUno.Core.Extensions.Logging.SingletonProvides a logging singleton pattern with helpers and extension methods for simplified logging.
UnoCSharpMarkupVersionUno.WinUI.Markup and similar packagesEnables C# Markup, the use of C# for building UI markup, similar to XAML but with C# syntax.
UnoDspTasksVersionUno.Dsp.Tasks and similar packagesIncludes tasks for Uno DSP (Theme colors import) within Uno Platform projects.
UnoExtensionsVersionUno.Extensions.Storage.WinUI and similar packagesExtends the Uno Platform with additional methods and classes for more versatile application development.
UnoLoggingVersionUno.Extensions.Logging.OSLog and similar packagesImplements logging mechanisms to help with monitoring and debugging Uno Platform applications.
UnoResizetizerVersionUno.ResizetizerProvides tools for automatically resizing and managing image assets in Uno Platform projects.
UnoThemesVersionUno.Material.WinUI and similar packagesSupplies a variety of themes that can be applied to Uno Platform applications to enhance the UI.
UnoToolkitVersionUno.Toolkit.WinUI and similar packagesOffers a collection of controls, helpers, and tools to complement the standard WinUI components.
UnoUniversalImageLoaderVersionUno.UniversalImageLoaderFacilitates the loading and displaying of images across different platforms supported by Uno.
UnoWasmBootstrapVersionUno.Wasm.Bootstrap and similar packagesEnables the bootstrapping of Uno Platform applications running on WebAssembly.

[!NOTE] In the 5.2 version of the Uno.Sdk you must provide a value for UnoExtensionsVersion, UnoThemesVersion, UnoToolkitVersion, and UnoCSharpMarkupVersion in order to use the packages associated with the UnoFeatures from these libraries as they are downstream dependencies of the Uno repository.

Third Party Packages

PropertyNuGet Package(s)Description
AndroidMaterialVersionXamarin.Google.Android.MaterialImplements Material Design components for Android using Xamarin bindings.
AndroidXActivityVersionXamarin.AndroidX.ActivityProvides classes to build Android activities with AndroidX libraries.
AndroidXAppCompatVersionXamarin.AndroidX.AppCompatOffers backward-compatible versions of Android components with AndroidX.
AndroidXBrowserVersionXamarin.AndroidX.BrowserContains components to implement browser features with AndroidX.
AndroidXCollectionVersionXamarin.AndroidX.Collection and similar packagesProvides AndroidX extensions for collections like sparse arrays and bundles.
AndroidXLegacySupportV4VersionXamarin.AndroidX.Legacy.Support.V4Supports older Android versions with AndroidX compatibility libraries.
AndroidXSplashScreenVersionXamarin.AndroidX.Core.SplashScreenSupport for Android splash screen customization.
AndroidXNavigationVersionXamarin.AndroidX.Navigation.UI and similar packagesFacilitates navigation within an Android app using AndroidX.
AndroidXRecyclerViewVersionXamarin.AndroidX.RecyclerViewImplements a flexible view for providing a limited window into large datasets with AndroidX.
AndroidXSwipeRefreshLayoutVersionXamarin.AndroidX.SwipeRefreshLayoutProvides a swipe-to-refresh UI pattern with AndroidX.
CommunityToolkitMvvmVersionCommunityToolkit.MvvmDelivers a set of MVVM (Model-View-ViewModel) components for .NET applications.
MicrosoftIdentityClientVersionMicrosoft.Identity.ClientProvides an authentication library for Microsoft Identity Platform.
MicrosoftLoggingVersionMicrosoft.Extensions.Logging.ConsoleEnables logging to the console with Microsoft's extensions.
PrismVersionPrism.Uno.WinUI and similar packagesIntegrates the Prism library, which aids in building loosely coupled, maintainable, and testable applications.
SkiaSharpVersionSkiaSharp.Skottie and similar packagesProvides a cross-platform 2D graphics API for .NET platforms based on Google's Skia Graphics Library.
SvgSkiaVersionSvg.SkiaRenders SVG files using the SkiaSharp graphics engine.
WinAppSdkBuildToolsVersionMicrosoft.Windows.SDK.BuildToolsContains the tools required to build applications for the Microsoft Windows App SDK.
WinAppSdkVersionMicrosoft.WindowsAppSDKProvides project templates and tools for building Windows applications.
WindowsCompatibilityVersionMicrosoft.Windows.CompatibilityEnables Windows desktop apps to use .NET Core by providing access to additional Windows APIs.

Those properties can be set from Directory.Build.props or may be set in the csproj file for your project.

xml
<!-- .csproj file -->
<Project Sdk="Uno.Sdk">
  <PropertyGroup>

      ...

      <UnoFeatures>
        Material;
        Dsp;
        Hosting;
        Toolkit;
        Logging;
        MVUX;
        Configuration;
        Http;
        Serialization;
        Localization;
        Navigation;
        ThemeService;
        Mvvm;
        SkiaRenderer;
      </UnoFeatures>
      
      <UnoToolkitVersion>6.3.6</UnoToolkitVersion>
      <MicrosoftLoggingVersion>9.0.1</MicrosoftLoggingVersion>
      <CommunityToolkitMvvmVersion>8.4.0</CommunityToolkitMvvmVersion>
  </PropertyGroup>    
</Project>

In the sample above, we are overriding the default versions of the UnoToolkit, MicrosoftLogging, and CommunityToolkitMvvm packages.

Disabling Implicit Uno Packages

If you wish to disable Implicit package usage, add the following:

xml
<DisableImplicitUnoPackages>true</DisableImplicitUnoPackages>

to your Directory.Build.props file or csproj file. You will be then able to manually add the NuGet packages for your project.

[!NOTE] When disabling Implicit Uno Packages it is recommended that you use the $(UnoVersion) to set the version of the core Uno packages that are versioned with the SDK as the SDK requires Uno.WinUI to be the same version as the SDK to ensure proper compatibility.

Supported OS Platform versions

By default, the Uno.Sdk specifies a set of OS Platform versions, as follows:

TargetSupportedOSPlatformVersion
Android21
iOS14.2
macOS10.14
tvOS14.2
WinUI10.0.18362.0

You can set this property in a Choose MSBuild block in order to alter its value based on the active TargetFramework.

xml
 <Choose>
    <When Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">
      <PropertyGroup>
        <SupportedOSPlatformVersion>21.0</SupportedOSPlatformVersion>
      </PropertyGroup>
    </When>
    <When Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">
      <PropertyGroup>
        <SupportedOSPlatformVersion>14.2</SupportedOSPlatformVersion>
      </PropertyGroup>
    </When>
    <When Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'macos'">
      <PropertyGroup>
        <SupportedOSPlatformVersion>10.14</SupportedOSPlatformVersion>
      </PropertyGroup>
    </When>
    <When Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'tvOS'">
      <PropertyGroup>
        <SupportedOSPlatformVersion>14.2</SupportedOSPlatformVersion>
      </PropertyGroup>
    </When>
    <When Condition="$(TargetFramework.Contains('windows10'))">
      <PropertyGroup>
        <SupportedOSPlatformVersion>10.0.18362.0</SupportedOSPlatformVersion>
        <TargetPlatformMinVersion>10.0.18362.0</TargetPlatformMinVersion>
      </PropertyGroup>
    </When>
  </Choose>

Visual Studio First-TargetFramework Workarounds

Using a Single Project in Visual Studio requires the Uno Platform tooling to apply workarounds in order to have an acceptable debugging experience.

For some of the platforms (Desktop, WinAppSDK, and WebAssembly), the corresponding target frameworks must be placed first in order for debugging and publishing to function properly. To address that problem, the Uno Platform tooling modifies the csproj file to reorder the TargetFrameworks property so that the list is accepted by Visual Studio.

As a result, the csproj file is on disk and will show the file as modified in your source control, yet the automatic change can be reverted safely. If the behavior is impacting your IDE negatively, you can disable it by adding the following in your .csproj file:

xml
<PropertyGroup>
  <UnoDisableVSTargetFrameworksRewrite>true</UnoDisableVSTargetFrameworksRewrite>
</PropertyGroup>

Note that we are currently tracking these Visual Studio issues, make sure to upvote them:

Disabling Default Items

The Uno.Sdk will automatically includes files that you previously needed to manage within your projects. These default items include definitions for including files within the Content, Page, and PRIResource item groups. Additionally, if you have referenced the Uno.Resizetizer it will add default items for the UnoImage allowing you to more easily manage your image assets.

You may disable this behavior in one of two ways:

xml
<PropertyGroup>
  <!-- Globally disable all default includes from the `Uno.Sdk`, `Microsoft.NET.Sdk`, and if building on WASM `Microsoft.NET.Sdk.Web` -->
  <EnableDefaultItems>false</EnableDefaultItems>

  <!-- Disable only default items provided by the `Uno.Sdk` -->
  <EnableDefaultUnoItems>false</EnableDefaultUnoItems>
</PropertyGroup>

WinAppSdk PRIResource Workaround

Many Uno projects and libraries make use of a winappsdk-workaround.targets file that corrects a bug found in WinUI. When using the Uno.Sdk these targets now are provided for you out of the box. This extra set of workaround targets can be disabled by setting the following property:

xml
<PropertyGroup>
  <DisableWinUI8857_Workaround>true</DisableWinUI8857_Workaround>
</PropertyGroup>

Cross Targeting Support

By Default when using the Uno.Sdk you get the added benefit of default includes for an easier time building Cross Targeted Applications. The supported file extensions are as shown below:

  • *.wasm.cs (WebAssembly)
  • *.desktop.cs (Desktop)
  • *.iOS.cs (iOS)
  • *.tvOS.cs(tvOS)
  • *.UIKit.cs, *.Apple.cs (iOS & tvOS)
  • *.Android.cs (Android)
  • *.WinAppSDK.cs (Windows App SDK)

For class libraries we also provide:

  • *.reference.cs (Reference only)
  • *.crossruntime.cs (WebAssembly, Desktop, or Reference)

[!NOTE] For backwards compatibility, using .skia.cs is currently equivalent to .desktop.cs. This might change in the future, so we recommend using the suffixes above instead.

As discussed above setting EnableDefaultUnoItems to false will disable these includes.

[!TIP] When you need to exclude specific files from a particular target framework (such as WebAssembly), you can use a custom MSBuild target:

xml
<Target Name="AdjustAppItemGroups" BeforeTargets="ResolveAssemblyReferences">
    <ItemGroup Condition="'$(TargetFramework)' == 'net10.0-browserwasm'">
        <None Remove="Page.xaml"/>
        <Page Remove="Page.xaml"/>
    </ItemGroup>
</Target>

This approach allows you to selectively remove pages from specific target frameworks while maintaining them in others.

Apple Privacy Manifest Support

Starting May 1st, 2024, Apple requires the inclusion of a new file, the Privacy Manifest file (named PrivacyInfo.xcprivacy), in app bundles. This file is crucial for complying with updated privacy regulations.

For projects using the Uno.Sdk (version 5.2 or later), the Platforms/iOS/PrivacyInfo.xcprivacy file is automatically integrated within the app bundle. An example of this manifest file can be found in the Uno.Templates repository.

For more information on how to include privacy entries in this file, see the Microsoft .NET documentation on the subject, as well as Apple's documentation.

[!NOTE] If your application is using the Uno Platform 5.1 or earlier, or is not using the Uno.Sdk, you can include the file using the following:

xml
 <ItemGroup Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">
   <BundleResource Include="iOS\PrivacyInfo.xcprivacy" LogicalName="PrivacyInfo.xcprivacy" />
 </ItemGroup>