Почему миграция с Xamarin на .NET MAUI неизбежна?
Представьте: ваше мобильное приложение на Xamarin.Forms внезапно перестаёт запускаться на iOS 17 — система уведомляет о несовместимости с новым SDK. Поддержка Xamarin.iOS, Xamarin.Android и Xamarin.Forms официально прекращена Microsoft: нет обновлений безопасности, исправлений багов, совместимости с новыми API. Приложение на Xamarin — накапливающийся технический долг с чётким крайним сроком. .NET MAUI — единственный преемник, стабильный для продакшена. Наша команда с 8-летним опытом в .NET-экосистеме провела 20+ успешных миграций. Мы минимизируем риски на каждом этапе и гарантируем, что ваше приложение будет работать на последних версиях iOS и Android.
Что конкретно ломается при миграции?
Структура проекта
В Xamarin.Forms три отдельных проекта: общий PCL/Shared, iOS head и Android head. В MAUI — единый multi-target проект: один .csproj с <TargetFrameworks>net8.0-ios;net8.0-android</TargetFrameworks>. Нативные ресурсы (иконки, шрифты, Assets) переносятся в Resources/ в корне. AppDelegate.cs и MainActivity.cs пересобираются автоматически, но требуют проверки.
Namespace и API
Xamarin.Forms → Microsoft.Maui. Это касается каждого using-а. Простой find & replace сработает лишь частично: Device.BeginInvokeOnMainThread → MainThread.BeginInvokeOnMainThread, Application.Current.MainPage → Application.Current?.Windows[0].Page. Renderers целиком заменяются на Handlers — принципиально другая модель кастомизации нативных контролов.
Renderers → Handlers
Самый болезненный участок. Каждый кастомный рендерер для Entry — это класс, наследующий EntryRenderer с переопределением OnElementChanged. В MAUI Handler — маппинг свойств через PropertyMapper и CommandMapper. На проекте с 5–10 кастомными рендерерами это 2–3 недели чистой работы. Мы переписываем их с нуля, используя встроенные Handler’ы MAUI, что часто уменьшает объём кода на 30–50%.
Зависимости и плагины
Часть Xamarin-плагинов (например, из Xamarin.Essentials — теперь встроена в MAUI) просто исчезла. Сторонние пакеты проверяем на NuGet на совместимость с net8.0-ios и net8.0-android. Несовместимые заменяем аналогами или пишем обёртки.
Как мы проводим миграцию?
Процесс состоит из следующих этапов:
- Аудит зависимостей и рендереров — собираем полный список NuGet-пакетов, проверяем каждый на MAUI-совместимость; составляем реестр кастомных рендереров с трудоёмкостью перехода на Handlers.
- Автоматическая конвертация с помощью Upgrade Assistant — инструмент механически обновляет
.csproj, target frameworks, переносит ресурсы. Это ~30–40% работы. - Ручная доработка — правка рендереров, навигации, DI, обновление XAML-разметки. Для Shell-навигации MAUI концептуально идентичен Xamarin.Forms, поэтому
AppShell.xamlпереезжает с минимальными правками. Dependency Injection переносится на встроенныйMauiAppBuilderнаMicrosoft.Extensions.DependencyInjection. - Тестирование — покрытие бизнес-логики unit-тестами (xUnit, NUnit) до миграции; после — UI-тесты на Appium + MAUI UI Testing и ручное тестирование на физических устройствах iOS и Android. Сборки распространяем через TestFlight и Firebase App Distribution.
- Деплой в сторах — настройка CI/CD (Azure DevOps, GitHub Actions), развёртывание в App Store Connect и Google Play Console, настройка push-уведомлений (APNs/FCM) и deep linking (Universal Links / App Links).
Почему MAUI лучше Xamarin?
MAUI ускоряет сборку в 2 раза и сокращает размер установочного файла на 30% по сравнению с Xamarin.Forms. Вот ключевые различия:
| Характеристика | Xamarin.Forms | .NET MAUI |
|---|---|---|
| Архитектура проекта | 3 отдельных head-проекта | Единый multi-target проект |
| Модель рендеринга | Renderers (наследование) | Handlers (PropertyMapper) |
| Dependency Injection | Сторонние DI-контейнеры | Встроенный MauiAppBuilder |
| Производительность при запуске | ~2–4 секунды | ~1–2 секунды |
| Размер IPA/APK | ~30 MB iOS, ~20 MB Android | ~25 MB iOS, ~15 MB Android |
Типичные ошибки при самостоятельной миграции
- Забывают проверить все
using-и, что приводит к ошибкам компиляции. - Не учитывают изменения в API:
Device.BeginInvokeOnMainThreadне заменяют наMainThread.BeginInvokeOnMainThread. - Пытаются запустить старый Xamarin-плагин без проверки совместимости — получают runtime-краш.
- Используют устаревший
Application.Current.MainPageвместоApplication.Current?.Windows[0].Page.
Что входит в наш сервис?
- Аудит текущего приложения: .csproj, NuGet, рендереры, навигация, кастомные библиотеки.
- План миграции с пошаговым расписанием и оценкой рисков.
- Автоматическая конвертация через Upgrade Assistant с последующей ручной доводкой.
- Переписывание всех кастомных рендереров на Handlers.
- Обновление DI, навигации, сервисов, ресурсов.
- Настройка CI/CD (Azure DevOps, GitHub Actions) для сборки под iOS и Android.
- Тестирование: unit, integration, UI, ручное на устройствах.
- Развёртывание в App Store Connect и Google Play Console, включая push-уведомления и deep linking.
- Обучение вашей команды работе с MAUI (1–2 дня воркшопа).
- Пост-миграционная поддержка 1 месяц.
Сроки и ориентиры
| Размер проекта | Кастомные рендереры | Ориентир |
|---|---|---|
| До 20 экранов | Нет / 1–3 | 3–5 недель |
| 20–50 экранов | 3–10 | 6–10 недель |
| 50+ экранов | 10+ | 12+ недель |
Стоимость рассчитывается индивидуально после аудита вашего проекта. Закажите бесплатный аудит вашего Xamarin-приложения — мы оценим объём работ и подберём оптимальный формат сотрудничества.
Наш опыт: 8+ лет разработки мобильных приложений на .NET, 20+ успешных миграций с Xamarin на MAUI. Гарантируем результат — ваше приложение будет работать на новых версиях iOS и Android без потери функциональности.
Свяжитесь с нами, чтобы обсудить детали.







