Как устроен проект 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 помогает разделить платформенный и общий код, обеспечивая хорошую архитектуру, читаемость и поддержку, а также облегчающую масштабирование приложения с добавлением новых функций и поддержкой дополнительных платформ.