Кроссплатформенна розробка мобільного додатку на .NET MAUI
Ми розробляємо кроссплатформенні мобільні додатки на .NET MAUI — єдина кодова база для iOS, Android та Windows. Якщо ваша команда вже використовує C# та ASP.NET Core, MAUI стане природним розширенням: ті самі патерни, той самий DI-контейнер, той самий NuGet. Для підприємств, де мобільний додаток — фронтенд до .NET-бекенду, це оптимальний шлях з точки зору уніфікації команди та успадкування коду.
.NET MAUI — прямий спадкоємець Xamarin.Forms, але архітектурно перероблений. Замість окремих проєктів для кожної платформи — один csproj з умовними залежностями. Це означає один appsettings.json, один DI-контейнер (Microsoft.Extensions.DependencyInjection), одні моделі. Перехід мінімальний: патерни ті самі, інструментарій (актуальна версія Visual Studio / Rider) той самий.
Чому .NET MAUI швидший за Xamarin.Forms?
MAUI використовує Handlers замість Renderers, що скорочує ієрархію в'ю на 2–3 рівні та зменшує накладні витрати на 30–50 %. На практиці це означає більш плавний скролінг та менше споживання пам'яті. Microsoft Learn: .NET MAUI Handlers.
Де виникають реальні проблеми
Hot Reload працює з застереженнями. XAML Hot Reload в останніх версіях Visual Studio нормально справляється з простими змінами розмітки. Але зміни в C# code-behind або view model вимагають перезапуску — .NET Hot Reload в MAUI ненадійний при складних ієрархіях. Ітерація по UI займає більше часу, ніж у Flutter або React Native.
Розмір бінарника. Базовий APK .NET MAUI без trimming — 30–50 МБ. З PublishTrimmed=true та RuntimeIdentifier=android-arm64 вдається стиснути до 15–25 МБ. Однак trimming ламає рефлексію (Reflection), на якій будується частина NuGet-пакетів. Кожен пакет потрібно перевіряти на сумісність з AOT/trimming.
NativeAOT на iOS — з актуальною версією .NET доступний. Дає кращий startup time та розмір, але вимагає повної відмови від runtime Reflection. Якщо проєкт використовує System.Text.Json з source generators — окей. Якщо Newtonsoft.Json — міграція обов'язкова.
Перевірка сумісності з тримінгом
Додайте в csproj `Як .NET MAUI справляється з офлайн-режимом?
Корпоративний додаток для польових інспекторів: офлайн-робота з формами та фотографіями, синхронізація при появі мережі. Стек: MAUI + EF Core SQLite + Polly для retry черги + Microsoft.Maui.Essentials для доступу до камери та GPS. Платформозалежна частина — тільки робота з файловою системою (шляхи різні на iOS Documents vs Android GetExternalFilesDir). Порівняно з Xamarin.Forms, обсяг платформозалежного коду знизився на 40%. CI — Azure DevOps Pipelines з завданнями dotnet publish під кожну платформу, підпис через KeyVault.
Стек та архітектура
MVVM — стандарт для MAUI. CommunityToolkit.Mvvm покриває 90% потреб: [ObservableProperty], [RelayCommand], [NotifyCanExecuteChangedFor] через source generators. Жодного бойлерплейту INotifyPropertyChanged вручну.
Shell-навігація (Shell) для стандартних випадків; для складної навігації з передачею об'єктів — NavigationPage або ReactiveUI.Maui. Prism.Maui — якщо команда з ним знайома по WPF/UWP.
Мережевий шар — HttpClientFactory через DI, Refit для типізованих REST-клієнтів, Polly для retry/circuit breaker. gRPC-клієнт через Grpc.Net.Client працює на iOS та Android без додаткових налаштувань починаючи з певної версії .NET.
Локальна БД — SQLite-net-pcl для простих випадків, LiteDB для документ-орієнтованого сховища. Entity Framework Core з SQLite провайдером працює, але в trim-сценарії вимагає EFCore.TrimmingSupport.
Push-сповіщення — Plugin.Firebase.CloudMessaging для FCM; APNs на iOS налаштовується через UNUserNotificationCenter в MauiProgram.cs.
Інтеграція з платформою
Доступ до нативних API — через Microsoft.Maui.Essentials: геолокація, акселерометр, Bluetooth, камера, біометрія (SecureStorage + Fingerprint). Якщо потрібен доступ за межами Essentials — DependencyService з платформозалежними реалізаціями або прямий виклик нативного коду через #if ANDROID / #if IOS в partial класах.
Біндинги до нативних SDK: на Android — Java/Kotlin Binding Library через Binding Project; на iOS — ObjectiveC/Swift Binding через ApiDefinitions.cs. Процедура трудомістка, але відпрацьована.
Терміни
| Масштаб | Терміни |
|---|---|
| Корпоративний MVP, 8–12 екранів | 8–14 тижнів |
| Продукт з офлайном та синхронізацією | 4–7 місяців |
| Платформа з інтеграцією корп. систем (SAP, 1C) | 6–12 місяців |
| Стек | Продуктивність |
|---|---|
| Xamarin.Forms | Базова (Renderer) |
| .NET MAUI | На 30–50% вища (Handler) |
Вартість розраховується індивідуально після аналізу вимог та існуючої .NET-інфраструктури клієнта. Зв'яжіться з нами для попередньої оцінки.
Що входить в розробку
- Вихідний код в репозиторії (Git) з історією комітів;
- CI/CD пайплайн (Azure DevOps / GitHub Actions) з підписом та деплоєм;
- Документація архітектури та API;
- Налаштування App Store Connect та Google Play Console (акаунти клієнта);
- Навчання команди супроводу (2–3 сесії);
- Гарантія на виправлення багів протягом 30 днів після передачі.
Замовте розробку під ключ — отримайте готовий до випуску додаток.
На що звертаємо увагу при аудиті
Три речі, які бачимо найчастіше в успадкованих MAUI-проєктах: відсутність trimming-сумісності (додаток важить 60+ МБ), використання застарілих Renderer з Xamarin.Forms замість переходу на Handler, та синхронні операції з БД на UI thread через EF Core без async/await. Останнє — гарантований ANR на Android. Ми допомагаємо мігрувати та оптимізувати — пишіть.







