Введение в .NET MAUI
.NET Multi-platform App UI или сокращенно MAUI представляет кроссплатформенный фреймворк от компании Microsoft для создания нативных мобильных и десктопных приложений с использованием языка программирования C# и языка разметки XAML. С помощью .NET MAUI можно разрабатывать приложения под такие операционные системы как Android, iOS, macOS и Windows, используя при этом один и тот же код.
Первая версия MAUI вышла в мае 2022 года, далее в ноябре 2022 года вышли обновления для .NET 7. Однако стоит отметить, что сам фреймворк .NET Multi-platform App UI фактически представляет эволюцию другого фреймворка — Xamarin Forms , который имеет более чем 10-летнюю историю и который с 2016 года был куплен и развивался компанией Microsoft. Поэтому, имя опыт работы с Xamarin Forms, не составит больших проблем перейти на .NET MAUI.
Также стоит отметить, что .NET MAUI — это opensource-фреймворк, код которого можно найти в репозитории на github по адресу https://github.com/dotnet/maui
Зачем использовать .NET Multi-platform App UI, какие преимущества она несет? При разработке приложения сразу под несколько платформ (iOS, Android, Windows, macOS) разработчики сталкиваются со следующими трудностями:
- различие в подходах построение графического интерфейса так или иначе влияет на разработку. Разработчики вынуждены подстраивать приложение под требования к интерфейсу на конкретной платформе
- разные API — различие в программных интерфейсах и реализациях тех или иных функциональностей также требует от программиста учет этих специфических особенностей
- разные платформы для разработки. Например, чтобы создавать приложения для iOS нам необходима соответствующая среда — Mac OS X и ряд специальных инструментов, типа XCode. А в качестве языка программирования выбирается Objective-C или Swift. Для Android мы можем использовать самый разный набор сред — Android Studio, Intellij IDEA, Eclipse и т.д. Но здесь для подавляющего большинства приложений применяется Java или Kotlin. А для создания приложений под Windows используется Visual Studio, а в качестве языков — C#, F#, VB.NET, C++
Такой диапазон платформ, средств разработки и языков программирования не может положительно сказываться на сроках создания приложений, и, в конечном счете, на денежных средствах, выделяемых на разработку. Было бы очень эффективно иметь один инструмент, который позволял легко и просто создавать приложения сразу для всех платформ. И именно таким инструментом и является платформа MAUI .
Преимущества разработки на MAUI:
- В процессе разработки создается единый проект, который использует общий код для всех платформ
- MAUI предоставляет прямой доступ к нативным API каждой платформы, в том числе к аппаратным возможностям платформ
- При создании приложений мы можем использовать платформу .NET и язык программирования C# (а также F#), который является достаточно производительным, и в тоже время ясным и простым для освоения и применения
- Богатая коллекция встроенных элементов управления
- Поддержка привязки данных
- Возможности настройки поведения визуального интерфейса и встроенного функционала
- Богатые возможности по работе с графикой
- Наличие hot reload, что упрощает разработку
Поддерживаемые платформы
На момент написания данной статьи .NET Multi-platform App UI (.NET MAUI) официально поддерживает следующие платформы:
- Android 5.0 (API 21) и выше
- iOS 10 и выше
- macOS 10.13 и выше (с помощью Mac Catalyst)
- Windows 11 and Windows 10 версии 1809 и выше (с использованием WinUI 3).
Кроме того, подсистема .NET MAUI Blazor часть выше поднимает планку поддерживаемых версий:
- Android 7.0 (API 24) и выше
- iOS 14 и выше
- macOS 11 и выше (с помощью Mac Catalyst)
Также неофициально сообществом поддерживается Linux — проект maui-linux. Кроме того, компания Samsung осуществляет поддержку для ОС Tizen.
Как работает MAUI
.NET MAUI объединяет API операционных систем Android, iOS, macOS и Windows в один единый API, который позволяет написать один общий код для всех поддерживаемых операционных систем и при необходимости добавлять для каждой отдельной платформы специфические для нее функциональности. Схематически работу .NET MAUI можно представить следующим образом:
.NET MAUI предоставляет единый фреймворк для создания приложений. Однако в процессе работы он опирается на ряд субплатформ, через которые идет взаимодействие с каждой отдельной операционной системой: .NET for Android, .NET for iOS, .NET for macOS и Windows UI 3 (WinUI 3). И в общем случае код приложения сначала обращается к платформе .NET MAUI, а та затем обращается к субплатформе для конкретной ОС. Хотя фреймворк также позволяет напрямую обращаться коду приложения к этим субплатформам.
Все эти субплатформы работают поверх библиотеки классов .NET 6 Base Class Library (BCL). Эта библиотека позволяет абстрагироваться от деталей реализации конкретной платформы и зависит от среды выполнения .NET, в которой выполняется код. Для Android, iOS и macOS среду выполнения для приложения предоставляет фреймворк Mono (реализация .NET). На Windows среда выполнения предоставляется Win32.
Таким образом, разработчик может определить общую единую логику для приложения для каждой отдельной платформы. И также при необходимости может задействовать специфические для каждой платформы функциональности.
Инструменты разработки
Разрабатывать приложения формально можно на Windows и MacOS. Однако если стоит задача разрабатывать приложения под iOS и MacOS, то для этого необходим MacOS.
В качестве среды разработки используется Visual Studio 2022 и выше. На MacOS в этом случае используется Visual Studio for Mac. При большом желании также можно использовать Visual Studio Code.
Установка .NET MAUI
Чтобы разрабтывать в Visual Studio приложения на платформе .NET MAUI в программе для установщика Visual Studio необходимо выбрать и установить элемент Разработка с помощью .NET Multi-Platform App UI «Разработка мобильных приложений на .NET»:
Аналогично eсли мы хотим в Visual Studio for Mac создавать проекты под MAUI, то при установке необходимо отметить соответствующий пункт:
Си шарп мобильные приложения
Рассмотрим запуск простейшего проекта по умолчанию на ОС Android. Но вначале рассмотрим, как приложение вообще запускается на Android. Для этого обратимся к проекте к папке Platforms/Android/ , которая содержит файлы для взаимодействия с ОС Android.
Здесь нас будут интересовать два файла: MainActivity.cs и MainApplication.cs .
Взаимодействие с MAUI с Android
Одним из основных понятий приложения на Android является activity , которая обычно представляет отдельный экран. То есть то, что видим на экране мобильного устройства Android, как правило, представляет activity. И для определения интерфейса приложения Android в данной папке по умолчанию создается файл MainActivity.cs :
using Android.App; using Android.Content.PM; using Android.OS; namespace HelloApp; [Activity(Theme = «@style/Maui.SplashTheme», MainLauncher = true, ConfigurationChanges = ConfigChanges.ScreenSize | ConfigChanges.Orientation | ConfigChanges.UiMode | ConfigChanges.ScreenLayout | ConfigChanges.SmallestScreenSize | ConfigChanges.Density)] public class MainActivity : MauiAppCompatActivity
Здесь видно, что по умолчанию код класса MainActivity ничего не определяет, просто наследуется от другого класса MauiAppCompatActivity. Однако если мы обратимся к классу MauiAppCompatActivity:
using Android.OS; using AndroidX.AppCompat.App; using Microsoft.Maui.LifecycleEvents; using Microsoft.Maui.Platform; namespace Microsoft.Maui < public partial class MauiAppCompatActivity : AppCompatActivity < protected virtual bool AllowFragmentRestore =>false; protected override void OnCreate(Bundle? savedInstanceState) < // содержимое опущено для краткости base.OnCreate(savedInstanceState); // определяем графический интерфейс окна приложения this.CreatePlatformWindow(MauiApplication.Current.Application, savedInstanceState); >> >
Все классы MAUI, предназначенные для взаимодействия с платформой Android, можно найти на github по адресу https://github.com/dotnet/maui/tree/main/src/Core/src/Platform/Android
Класс MauiAppCompatActivity в методе OnCreate, который вызывается ОС Android при старте приложения, вызывает метод CreatePlatformWindow , который определен для одного из родительских классах (класс Activity) и в котором фактически и определяется графический интерфейс окна.
Для установки интерфейса применяется свойство MauiApplication.Current.Application , то есть что хранится в этом свойстве, то и будет фактически представлять интерфейс приложения. Значение этого свойства представляет объект класса MainApplication , который определяется в файле MainApplication.cs :
using Android.App; using Android.Runtime; namespace HelloApp; [Application] public class MainApplication : MauiApplication < public MainApplication(IntPtr handle, JniHandleOwnership ownership) : base(handle, ownership) < >protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp(); >
Для определения интерфейса переопределяется абстрактный метод CreateMauiApp() , в котором вызывается метод MauiProgram.CreateMauiApp() (из файла MauiProgram.cs ), который создает объект MauiApp и является точкой входа в приложение MAUI.
Таким образом, главный класс, который для ОС Android определяет визуальное содержимое — MainActivity использует класс MainApplication, а тот — класс MauiApp.
Запуск проекта
Если рабочая машина, на которой ведется разработка, поддерживает виртуализацию, то мы можем для отладки приложений использовать эмуляторы: эмулятор Android от Microsoft или Android Player.
Если у нас есть устройство с ОС Android, то мы можем его использовать для тестирования. Для этого надо подключить это устройство к компьютеру с помощью USB-кабеля. А на самом мобильном устройстве установить режим разработчика в параметрах.
Для установки устройства перейдем в Visual Studio в поле устройств запуска и в выпадающем списке выберем пункт Android local Devices и в подменю для этого пункта выберем подключенное устройство с Android.
Если же все настроено правильно, то в панели инструментов Visual Studio отобразит подключенное устройство. В моем случае это устройство Nexus 5X. Попутно в списке могут отображаться и другие подключенные устройства и эмуляторы.
И после запуска проекта на выполнение на мобильном устройстве отобразится интерфейс нашего приложения:
Управление настройками проекта и SDK
Если необходимо установить какую-то новую версию Android API или какие-то компоненты из Android SDK, которые должны применяться с приложением, необходимо перейти к меню Tools -> Android -> Android SDK Manager
Для управления настройками Android проекта можно перейти в свойства проекта. Здесь есть ряд опций для настройки. Прежде всего в секции Android Targets можно настроить целевую применяемую и минимальную версии Android API:
В частности, здесь нам доступны следующие опции:
- Target the Android platform : при установке этого флажка .NET MAUI при построении проекта будет также создавать версию приложения для Android.
- Target .NET Runtime : применяемая версия .NET
- Target Android Framework : целевая версия Android
- Minimum Target Android Framework : минимальная версия Android, под которую создается приложение
Кроме того, в секции Android можно установить параметры манифеста Android, а также опции для публикации приложения.