NET MAUI – единая кодовая база, много платформ

Автор:

devblogs.microsoft.com

Встречайте платформу .NET MAUI, выход которой знаменует собой новую важную веху в многолетнем пути к унификации платформы .NET. Теперь у сообщества из более чем 5 миллионов разработчиков .NET есть первоклассный кроссплатформенный стек для разработки пользовательского интерфейса под Android, iOS, macOS и Windows, дополняющий инструментарий .NET (SDK) и базовую библиотеку классов (BCL). С помощью .NET теперь можно создать все, что угодно.

И это только начало большого пути по созданию инструментов для разработки десктопных и мобильных приложений, которые порадуют разработчиков .NET. На следующем этапе закладывается основа для расширения экосистемы .NET, чтобы перенести плагины, библиотеки и сервисы из .NET Framework и старой системы проектов в .NET 6 и проекты в стиле SDK.

План разработки .NET MAUI полностью соответствует Текущему расписанию релизов. Постоянное внимание в .NET MAUI по-прежнему сосредоточено на обеспечении качества, решении известных проблем и определении приоритетов на основе отзывов разработчиков. Также проводятся работы по поддержке и обновлению инструментов для разработки приложений, ориентированных исключительно на Android, Android Wear, CarPlay, iOS, macOS и tvOS, напрямую используя нативные инструментальные средства .NET и вспомогательные библиотеки AndroidX, Facebook, Firebase, Google Play Services и SkiaSharp.

С .NET MAUI вы можете достичь бескомпромиссного пользовательского опыта, написав и используя при этом больше общего кода, чем когда-либо прежде.

Нативный UI никаких компромиссов

Основная цель .NET MAUI заключается в том, чтобы позволить разработчикам обеспечить в приложениях наилучший пользовательский опыт (UX) в соответствии с особенностями каждой платформы (Android, iOS, macOS, Windows, и Tizen благодаря сотрудничеству с Samsung), в то же время создавая свои уникальные бренды, благодаря богатым возможностям графики и стилизации. Прямо «из коробки» приложение на каждой платформе выглядит и ведет себя так, как должно, без каких-либо дополнительных виджетов или стилей, которые необходимо имитировать. Например, работа .NET MAUI на Windows обеспечивается благодаря WinUI 3 - главному компоненту нативного UI, который поставляется вместе с Windows App SDK.

Для разработки ваших приложений используйте C#, XAML и богатый инструментарий из более чем 40 готовых контролов, контейнеров (layouts) и экранов (pages). Опираясь на Xamarin контролы для мобильной разработки, .NET MAUI добавляет поддержку для десктопных приложений со множеством окон, различных меню и возможностей анимации, а также встроенную графику для отрисовки границ, форм, теней и др.

Доступность прежде всего

Одним из основных преимуществ использования нативного UI является унаследованная поддержка Accessibility, которую мы можем реализовать с помощью семантических сервисов. Это позволяет создавать приложения с широкими возможностями доступа проще, чем когда-либо. В рамках совместного сотрудничества с пользователями в .NET MAUI были улучшены инструменты разработки приложений с точки зрения доступности.

Разработаны семантические сервисы для управления:

  • такими свойствами, как описание, подсказка и уровень заголовка;
  • фокусом;
  • устройством для чтения с экрана;
  • автоматическими свойствами;

Не только UI

.NET MAUI предоставляет простые API для доступа к нативным («родным») сервисам и функциям каждой платформы, таким как акселерометр, действия приложения, файловая система, уведомления и многое другое. В примере ниже мы конфигурируем «действия приложения» - специальное меню с набором действий, вызываемое долгим нажатием на иконку приложения на каждой платформе:

AppActions.SetAsync(
    new AppAction("current_info", "Check Current Weather", icon: "current_info"),
    new AppAction("add_location", "Add a Location", icon: "add_location")
);

Простая кастомизация

Расширяете ли вы возможности контролов .NET MAUI или создаете новый платформенный функционал, архитектура .NET MAUI рассчитана на масштабируемость, и у вас не возникнет проблем с этим. Рассмотрим, например, контрол ввода Entry - канонический пример контрола, который по-разному отображается на разных платформах. Android отрисовывает подчеркивание под текстовым полем, и разработчики часто хотят убрать это подчеркивание.

С .NET MAUI настройка Entry в масштабах всего проекта - это всего лишь несколько строк кода:

#if ANDROID
Microsoft.Maui.Handlers.EntryHandler.Mapper.ModifyMapping("NoUnderline", (h, v) =>
{
    h.PlatformView.BackgroundTintList =
	ColorStateList.ValueOf(Colors.Transparent.ToPlatform());
});
#endif

Вот отличный недавний пример создания нового платформенного контрола Map от компании Cayas Software. Статья в блоге компании демонстрирует создание специального обработчика (handler) для контрола, его реализацию на каждой платформе, а затем обеспечение доступности контрола путем его регистрации в .NET MAUI.

.ConfigureMauiHandlers(handlers =>
{
  handlers.AddHandler(typeof(MapHandlerDemo.Maps.Map),typeof(MapHandler));
})

Производительность современного разработчика

Мы хотим, чтобы .NET не только была технологией, позволяющей создавать все, что угодно, но и повышала производительность разработчиков, используя общие возможности языка, паттерны и лучшие практики, а также инструментарий.

.NET MAUI использует новые возможности C# 10, представленные еще в .NET 6, включая глобальные операторы using и компактную запись пространства имен на уровне файла, что позволяет сократить бойлерплейт код в файлах. Также .NET MAUI выводит возможности мультитаргетинга на новый уровень благодаря подходу «один проект».


В новых проектах .NET MAUI файлы платформенного кода располагаются во вложенных папках, что позволяет разработчику сосредоточиться на приложении, не тратя времени на переключения между проектами платформ. В папке Resources вашего проекта есть единое место для управления всеми ресурсами приложения: шрифтами, изображениями, иконкой приложения, сплеш-экраном, активами (assets) и стилями. .NET MAUI выполнит всю необходимую работу по их оптимизации под уникальные требования каждой платформы.

При этом структура с отдельными проектами на каждую платформу по-прежнему доступна разработчикам.

.NET MAUI использует паттерн проектирования «Строитель», ставший популярным благодаря библиотекам Microsoft.Extensions в приложениях ASP.NET и Blazor, для инициализации и конфигурации приложения. С помощью него вы можете, например, зарегистрировать свои шрифты, подключиться к специфичным для платформы событиям жизненного цикла приложения, настроить зависимости, включить определенные функции, подключить сторонние сервисы и многое другое.

public static class MauiProgram
{
    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();
        builder
            .UseMauiApp()
            .ConfigureServices()
            .ConfigureFonts(fonts =>
            {
                fonts.AddFont("Segoe-Ui-Bold.ttf", "SegoeUiBold");
                fonts.AddFont("Segoe-Ui-Regular.ttf", "SegoeUiRegular");
                fonts.AddFont("Segoe-Ui-Semibold.ttf", "SegoeUiSemibold");
                fonts.AddFont("Segoe-Ui-Semilight.ttf", "SegoeUiSemilight");
            });

        return builder.Build();
    }
}


public static class ServicesExtensions
{
    public static MauiAppBuilder ConfigureServices(this MauiAppBuilder builder)
    {
        builder.Services.AddMauiBlazorWebView();
        builder.Services.AddSingleton();
        builder.Services.AddSingleton();
        builder.Services.AddSingleton();
#if WINDOWS
        builder.Services.TryAddSingleton<_SharedMauiLib.INativeAudioService2c_ SharedMauiLib.Platforms.Windows.NativeAudioService="">();
#elif ANDROID
        builder.Services.TryAddSingleton<_SharedMauiLib.INativeAudioService2c_ SharedMauiLib.Platforms.Android.NativeAudioService="">();
#elif MACCATALYST
        builder.Services.TryAddSingleton<_SharedMauiLib.INativeAudioService2c_ SharedMauiLib.Platforms.MacCatalyst.NativeAudioService="">();
        builder.Services.TryAddSingleton< Platforms.MacCatalyst.ConnectivityService>();
#elif IOS
        builder.Services.TryAddSingleton<_SharedMauiLib.INativeAudioService2c_ SharedMauiLib.Platforms.iOS.NativeAudioService="">();
#endif

        builder.Services.TryAddTransient();
        builder.Services.TryAddSingleton();

        builder.Services.AddScoped();
        builder.Services.AddScoped();
        builder.Services.AddScoped(_ =>
            new ListenTogetherHubClient(Config.ListenTogetherUrl));


        return builder;
    }
}

Подробнее с информацией о конфигурации приложения в .NET MAUI и подходе «один проект» вы можете ознакомиться в официальной документации.

Оптимизация скорости работы приложения

.NET MAUI создана для производительности. В платформе реализованы механизмы для ускорения запуска приложения, особенно на Android. UI контролы в .NET MAUI реализуют тонкий, несвязанный паттерн проектирования обработчик-маппер (handler-mapper) над нативными платформенными контролами. Такой подход уменьшает количество слоев в логике визуализации UI и упрощает кастомизацию контролов.

Контейнеры в .NET MAUI были разработаны так, чтобы использовать паттерн последовательного управления, который оптимизирует этапы измерения (measure) и размещения (arrange) для более быстрой визуализации и обновления UI. Платформа также предоставляет контейнеры, предварительно оптимизированные для конкретных сценариев, такие как HorizontalStackLayout и VerticalStackLayout в дополнение к StackLayout.

С самого начала разработки .NET MAUI была поставлена цель улучшения производительности запуска приложения и уменьшения итогового размера приложения при переходе на .NET 6. На данный момент достигнуто улучшение производительности на 34.9% для .NET MAUI и на 39.4% для .NET for Android. Эти преимущества распространяются и на сложные, большие приложения; как пример, .NET Podcast приложение - улучшение производительности его запуска достигло 37.3% (с 1299 мс до 814.2 мс).

Соответствующие настройки оптимизации в Visual Studio включены по умолчанию для Release сборок.

Начните сегодня

Чтобы начать использовать .NET MAUI на Windows, установите или обновите Visual Studio 2022 до версии 17.4+.

Чтобы использовать .NET MAUI на Mac, установите новую версию Visual Studio 2022 для Mac (17.4+).

На Windows уже сегодня вы можете ускорить цикл разработки с помощью XAML и механизма .NET Hot Reload, а также мощных редакторов для XAML, C#, Razor и CSS. С помощью XAML Live Preview и Live Visual Tree вы можете предварительно просматривать, располагать и инспектировать элементы пользовательского интерфейса (UI), а также изменять UI в процессе отладки. Новый подход «один проект» в .NET MAUI теперь включает страницы свойств проекта для редактирования настроек приложений с мультиплатформенным таргетингом через визуальный интерфейс.

На Mac уже сегодня вы можете работать с решениями .NET MAUI, содержащими единый проект или несколько платформенных проектов, отлаживать их, используя все нативные средства Visual Studio 2022 для Mac. Другие улучшения производительности разработки приложений .NET MAUI будут представлены в последующих предварительных версиях.

Мы рекомендуем разработчикам начать обновлять библиотеки до .NET MAUI и создавать новые проекты на .NET MAUI уже сегодня. Прежде чем с головой окунуться в процесс перевода текущих Xamarin проектов на .NET MAUI, обновите компоненты Visual Studio, проверьте свои зависимости и изучите известные проблемы, чтобы правильно оценить время, необходимое для перехода. Помните, что Xamarin будет продолжать поддерживаться в соответствии с современной политикой жизненного цикла, которая предусматривает 2 года поддержки с момента последнего крупного релиза.

Материалы по теме