Что такое Xamarin

Описание Xamarin

Xamarin — это современный кроссплатформенный фреймворк разработки мобильных приложений на языке C# для устройств на iOS, Android и Windows.

Американская компания Xamarin основана в 2011 году. Ее разработчики адаптировали платформу .NET Framework, изначально рассчитанную на работу с Microsoft Windows, под другие мобильные платформы. В 2016 году компанию купил Microsoft и инструментарий стал бесплатным.

Он ориентирован на разработчиков, которые:

  • хотят переиспользовать код, тесты и бизнес-логики на различных платформах;
  • пишут кроссплатформенные приложения на C#.

Преимущества фреймворка:

  1. Это инструмент .NET, поэтому он подходит тем, кто специализируется именно на .NET разработке. Например, DD Planet: мы работаем на этой платформе уже 17 лет и стали использовать Xamarin одними из первых на российском рынке.
  2. Позволяет использовать большое количество .NET библиотек. У .NET огромный репозиторий библиотек. Разработчику там трудно чего-то не найти.
  3. В разработке используется язык C#, он позволяет строить объектно-ориентированную модель и изолировать уровни. Это значит, что можно выстраивать архитектуру с упором на переиспользование кода.
  4. UI настраивается для каждой платформы по отдельности нативными инструментами.
  5. В целом на базе Xamarin можно выстроить любое архитектурное решение. Игры на нем особо не попишешь, но некоторые делают и это.

Основное преимущество Xamarin для бизнеса состоит в том, что он позволяет существенно (почти в 2 раза) сократить сроки и затраты на разработку при сохранении всего необходимого функционала и качества. То есть на выходе получается такое же приложение, как с помощью разработки на нативных языках программирования, только дешевле и быстрее.

Выпускать приложения для лишь одной мобильной платформы – не актуально и нужно заботиться о разработке сразу двух версий, для iOS и Android. И здесь можно выбрать два пути: работать на «нативных» языках программирования для каждой операционной системы или использовать кроссплатформенные фреймворки.

Для начала рассмотрим, какие подходы используются, когда нужно получить сразу два приложения: под iOS и Android.

Первый подход к разработке приложений

Первый – самый затратный, как по времени, так и по ресурсам: разработка отдельного приложения для каждой из платформ. Сложность этого подхода заключается в том, что каждая из операционных систем требует своего подхода: это выражается как в языке, на котором ведется разработка (для Android – Java или Kotlin, для iOS – Objective-C или Swift), так и способах описания UI части приложения (xaml и xib или storyboard файлы соответственно).

Уже этот факт подводит нас к тому, что для такого подхода необходимо формирование двух команд разработчиков. Помимо этого придется дублировать логику для каждой из платформ: взаимодействие с api и бизнес-логику.


А что если количество используемых API будет расти?



Второй подход к разработке приложений

Из этого возникает вопрос: как уменьшить необходимое количество человеческих ресурсов? Избавиться от необходимости дублировать код для каждой платформы. Существует достаточное количество фреймворков и технологий решающих эту задачу.

Использование кроссплатформенного фреймворка (Xamarin.Forms, например) дает возможность писать код на одном языке программирования и описать логику данных и логику UI один раз, в одном месте. Поэтому необходимость использовать две команды разработчиков отпадает. А по итогу компиляции проекта на выходе получаем два нативных приложения. И это – второй подход.


Многие, думаю, знают, что такое Xamarin, или хотя бы слышали о нем, но как это работает? Xamarin основан на open-source реализации платформы .NET — Mono. Mono включает в себя собственный компилятор C#, среду выполнения, а также ряд библиотек, включая реализацию WinForms и ASP.Net.

Цель проекта — позволить запускать программы, написанные на C#, на операционных системах, отличных от Windows — Unix-системах, Mac OS и других. Сам же фреймворк Xamarin, по сути своей – библиотека классов, предоставляющей разработчику доступ к SDK платформы и компиляторы для этих них. Xamarin.Forms, в свою очередь, позволяет не только писать под обе платформы на одном языке, но проектировать дизайн экранов с использованием XAML разметки, привычной тем, кто уже имел опыт работы с WPF приложениями. В итоге сборки проекта получаем практически идентичный вид на всех платформах, так как на этапе компиляции все XF контролы преобразовываются в нативные для каждой платформы.

Писать код для каждой платформы разработчик вынужден только в том случае, если нужен доступ к каким-либо платформенным фичам (например, дактилоскопический сканер или уровень заряда батареи) или же необходимо более тонко настроить поведение контрола. В некоторых случаях при разработке приложения может потребоваться написание платформозависимого кода, но даже в этом случае никто не запрещает вынести платформенные функции в интерфейс и взаимодействовать в дальнейшем с ним из общего проекта.

Один язык программирования, мало кода и так далее. Все это звучит красиво но, Xamarin.Forms – не серебряная пуля, и вся его красота разбивается о камни реальности. Как только возникает ситуация, когда встроенные в XF-контролы уже не отвечают предъявленным к ним требованием, структура экранов и контролов становится всё сложнее и сложнее. Для обеспечения комфортной работы с экранами из общего проекта приходится писать все больше и больше кастомных рендеров.

Третий подход к разработке приложений

Мы уже выяснили, что использование Xamarin Forms может осложнить работу, а не упростить ее. Поэтому для реализации архитектурно сложных экранов, дизайнерских элементов и контролов, кардинально отличающихся от нативных, нашелся компромисс и возможность объединения первого и второго подхода.

Имеем все те же три проекта: общий PCL проект, но уже без Xamarin Forms, и два проекта Xamarin Android и Xamarin iOS. По-прежнему имеется возможность писать всё на одном языке, общая логику между двумя проектами, но нет ограничений единой XAML разметки. UI-составляющая контролируется каждой из платформ и использует нативные средства, на Android – нативный XAML, на iOS – XIB-файлы. Каждая платформа имеет возможность соблюдать свои гайдлайны, так как связь между Core и платформенными проектами организовывается только на уровне данных.

Для организации такой связи можно использовать паттерн проектирования MVVM и достаточно популярную его реализацию для Xamarin – MVVMCross. Его использование позволяет держать общую ViewModel для каждого экрана, где описана вся “бизнес-логика” работы, а его отрисовку доверить платформе. Так же это позволяет двум разработчикам работать с одним и тем же экраном (один с логикой - другой с UI) и не мешать друг другу. Кроме реализации паттерна, получаем достаточное количество инструментов для работы: реализация DI и IoC. Для подъема взаимодействия с платформой на уровень общего кода разработчику достаточно объявить интерфейс и реализовать его на платформе. Для типовых вещей MvvmCross уже предоставляет набор собственных плагинов. В команде мы используем плагин мессенджера для обмена сообщениями между платформой и общим кодом и плагин для работы с файлами (выбор изображений из галереи и др.).

Материалы по теме