Как устроен проект Xamarin.Forms (структура проектов)?
Проект Xamarin.Forms использует мультипроектную архитектуру, где основной код, включая бизнес-логику и пользовательский интерфейс, располагается в общем (shared) проекте, а специфичный для платформ код — в отдельных проектах под Android, iOS и, при необходимости, UWP. Такая структура позволяет создавать кросс-платформенные мобильные приложения, которые компилируются в родные приложения для каждой платформы, сохраняя при этом большую часть общего кода.
Общая структура Xamarin.Forms-решения
Проект Xamarin.Forms обычно состоит из следующих основных частей:
SolutionName/
├── SolutionName (Shared Project или .NET Standard)
│ ├── Models/
│ ├── Views/
│ ├── ViewModels/
│ ├── Services/
│ ├── Resources/
│ ├── App.xaml
│ ├── App.xaml.cs
│ └── SolutionName.csproj
├── SolutionName.Android/
│ └── MainActivity.cs
│ └── Resources/
├── SolutionName.iOS/
│ └── AppDelegate.cs
│ └── Assets.xcassets/
├── SolutionName.UWP/ (опционально)
│ └── MainPage.xaml.cs
1. Общий проект (Shared/.NET Standard)
Это ядро приложения, где пишется основной UI, логика и архитектура MVVM. Он не содержит кода, зависящего от конкретной платформы.
Основные файлы и папки:
App.xaml / App.xaml.cs
Точка входа в приложение. Здесь задаются глобальные ресурсы (стили) и начальная страница:
```python
public App()
{
InitializeComponent();
MainPage = new NavigationPage(new MainPage());
}
- **Models/
**Классы, представляющие данные. Например: User, Product, Order.
- **Views/
**XAML-страницы (Pages), описывающие внешний вид пользовательского интерфейса. Например: MainPage.xaml, LoginPage.xaml.
- **ViewModels/
**Классы для логики представления, используемые в MVVM. Содержат команды и свойства, связанные с UI.
- **Services/
**Логика для взаимодействия с внешними API, базами данных, кэшем и пр.
- **Resources/
**Файлы ресурсов: стили, темы, шрифты, переводы (RESX), изображения (для общего кода).
- **Converters/
**Конвертеры значений, применяемые в XAML (например, BoolToVisibilityConverter).
- **Behaviors/
**Расширения поведения UI-элементов (например, запрет на ввод спецсимволов).
- **Helpers/
**Утилитарные классы и вспомогательные методы.
## **2\. Проект SolutionName.Android**
Содержит Android-специфичные файлы и служит точкой входа для Android-приложения.
### **Основные файлы:**
**MainActivity.cs
**Главная активность приложения. Она инициализирует Xamarin.Forms и указывает, с чего начать:
<br/>```python
\[Activity(Label = "MyApp", MainLauncher = true)\]
public class MainActivity : global::Xamarin.Forms.Platform.Android.FormsAppCompatActivity
{
protected override void OnCreate(Bundle savedInstanceState)
{
Xamarin.Essentials.Platform.Init(this, savedInstanceState);
Xamarin.Forms.Forms.Init(this, savedInstanceState);
LoadApplication(new App());
}
}
-
Resources/
Папка с ресурсами Android (аналог res/ в Android Studio):-
drawable/ — изображения
-
layout/ — XML-макеты (редко используется)
-
values/ — строки, стили и темы
-
mipmap/ — иконки приложения
-
-
AndroidManifest.xml
Файл конфигурации Android-приложения: разрешения, минимальная версия SDK, активности и т.п. -
Properties/AssemblyInfo.cs
Метаинформация о сборке. -
Dependencies
Здесь подключаются NuGet-пакеты, например Xamarin.Essentials, Xamarin.Forms.
3. Проект SolutionName.iOS
Предназначен для сборки приложения под iOS.
Основные файлы:
AppDelegate.cs
Основной входной класс приложения iOS. Аналог MainActivity в Android.
```python
public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
Xamarin.Forms.Forms.Init();
LoadApplication(new App());
return base.FinishedLaunching(app, options);
}
- **Info.plist
**Конфигурационный файл iOS-приложения: название, разрешения, версия iOS, иконки.
- **Assets.xcassets
**Графические ресурсы (иконки, splash screen и др.)
- **LaunchScreen.storyboard
**Экран запуска (Splash Screen) приложения.
- **Entitlements.plist
**Используется для разрешений, таких как Push-уведомления или iCloud.
## **4\. Проект SolutionName.UWP (опционально)**
Только если требуется запуск на Windows 10/11. Включается вручную при необходимости.
### **Основные файлы:**
- **MainPage.xaml / MainPage.xaml.cs
**Контейнер для запуска Xamarin.Forms приложения на UWP.
- **Package.appxmanifest
**Манифест с описанием разрешений, версий, логотипов и т. д.
- **Assets/
**Папка с ресурсами UWP-приложения.
## **5\. Подключение платформенного кода**
Каждая платформа может подключать:
- **Custom Renderers** — нативная реализация или модификация UI.
- **DependencyService реализации** — реализация интерфейсов, зарегистрированных через \[Dependency\].
- **Платформенные API** — камеры, Bluetooth, GPS и т. д.
- **Файлы настроек, ключи, сертификаты** — например, google-services.json (Android) или GoogleService-Info.plist (iOS).
## **Пример структуры в Visual Studio**
```python
MyApp.sln
│
├── MyApp/ (Общий код)
│ ├── App.xaml
│ ├── Views/
│ ├── ViewModels/
│ ├── Models/
│ └── Services/
│
├── MyApp.Android/ (Android)
│ ├── MainActivity.cs
│ └── Resources/
│
├── MyApp.iOS/ (iOS)
│ ├── AppDelegate.cs
│ └── Assets.xcassets/
│
└── MyApp.UWP/ (опционально) (Windows)
Взаимодействие между проектами
-
Общий проект подключается как зависимость в Android/iOS/UWP проектах.
-
App создается в общем проекте, а каждая платформа вызывает LoadApplication(new App()) в своей точке входа.
-
Вся логика навигации и UI находится в общем проекте.
-
Платформенный код доступен через DependencyService, Custom Renderer, Effects, Dependency Injection.
Расширенные папки (по архитектуре проекта)
-
Controls/ — кастомные элементы UI
-
Renderers/ — Custom Renderers
-
Interfaces/ — интерфейсы для DI и DependencyService
-
Localization/ — ресурсы перевода (RESX)
-
Constants/ — строковые и числовые константы
-
Themes/ — стили, палитры
Секреты безопасности
-
Секреты и API-ключи должны храниться в платформенных проектах, а не в общем.
-
Используйте SecureStorage или платформенный Keychain/Keystore.
Структура проекта Xamarin.Forms помогает разделить платформенный и общий код, обеспечивая хорошую архитектуру, читаемость и поддержку, а также облегчающую масштабирование приложения с добавлением новых функций и поддержкой дополнительных платформ.