Xamarin – один из наиболее популярных инструментов кроссплатформенной разработки приложений для iOS, Android, tvOS, watchOS, macOS и Microsoft (UWP-приложения) с использованием С# и .NET. В 2019-2020 годах он стабильно занимал место среди пяти самых используемых разработчиками фреймворков.
На него в своей разработке полагались такие известные компании как Bosch, Siemens, Slack, Pinterest, UPS, Outback Steakhouse, Aggreko и другие. В этой статье мы поделимся нашим опытом разработки приложения с помощью Xamarin, расскажем, почему стоит его использовать и чем в нашем случае он был полезен.

Кейс: старое приложение на новой платформе
Вопросы миграции устаревших приложений неоднократно рассматривались в нашем блоге (например, тут или тут). В случаях, когда обновление или внедрение новых функций такого приложения обходится дорого и трудозатратно, если отсутствует документация или эксперты, знающие код, правильным решением будет миграция старого приложения на новый стек технологий. По сути, это сводится к написанию приложения с нуля с применением логики уже существующего приложения.
Приложение заказчика было написано на LabView и к моменту старта нашего совместного проекта существовало уже более 10 лет. За это время документация по проекту устарела, не осталось специалистов поддержки, а главное, приложение было невыгодно портировать на новые операционные системы. Встал вопрос о миграции интерфейсов и бизнес-логики на новую кодовую базу.
Основными требованиями для разработки нового приложения стали:
- поддержка iOS и Windows с полным воспроизведением интерфейса старого приложения;
- сжатые сроки разработки;
- простота поддержки и масштабируемость.
Хорошим решением поставленных задач стал Xamarin и далее я расскажу, почему.
Причина 1: Нативная мультиплатформенность
Xamarin предоставляет полный доступ к нативным API и инструментам, используемым на платформах Android, iOS и Windows. Следовательно, он может обеспечить практически нативный дизайн и производительность для каждого приложения. Этот факт позволяет отдать предпочтение решениям на основе Xamarin, а не его гибридным конкурентам.
Причина 2. Сжатые сроки разработки
Задача миграции приложения всегда идет рука об руку с требованием о сжатых сроках, и Xamarin полностью отвечает этому требованию. Основные его преимущества:
- использование одной кодовой базы на обе операционные системы (iOS и Windows) сокращает срок разработки;
- использование C# и .NET, которые просты в изучении и использовании, увеличивает скорость разработки;
- для начала работы достаточно установки Visual Studio.
Согласно опросам, четверть разработчиков пользуется именно этим IDE для отладки и работы с кодом.
Xamarin – мощный и удобный инструмент разработки. Создать в нем прототип приложения можно буквально за один день, а тестирование производить без реальных устройств, в Visual Studio, используя симуляцию. Это значительно экономит время.
Причина 3. Простота поддержки и быстрое обучение инженерной команды
Руководств по использования Xamarin написано уже немало. В них приводятся лучшие практики, что позволяет быстро обучить новых инженеров и легко ввести их в проект. Также есть Xamarin University – специализированный портал удаленного обучения для тех, кто только знакомится с пакетом. Он создан для инженеров со знанием C#, а также для всех, кто имеет не слишком большой опыт программирования. Ресурс предоставляет все необходимые знания инженерам, использующим продукты на основе Xamarin.
Помимо этого, Xamarin упрощает обслуживание приложений: достаточно внести изменения или сделать обновления в исходном файле, и они будут применены к приложениям iOS, Android и Windows автоматически. Однако, следует учитывать, что это работает только для приложений, использующих Xamarin.Forms.
Причина 4. Возможность выбора приоритетов
В Xamarin есть два подхода к разработке – Forms и Native.

По рисунку 2 можно определить важные критерии для разработки приложения в каждом конкретном случае.
Для нашего приложения производительность не играет важной роли, поэтому, руководствуясь остальными критериями, мы выбрали подход Xamarin.Forms.
Итак, Xamarin.Forms лучше всего выбрать для:
- MVP (Minimum Viable Product) приложений
- Простых приложений с небольшим функционалом
Xamarin.Native будет полезен при разработке:
- Высоконагруженных систем
- Приложений, которые интегрированы с другими сервисами
Приложений, в которых пользовательский интерфейс более важен, чем переиспользование кода.
Причина 5. Простота внедрения кроссплатформенности
Кроссплатформенность действительно легко и удобно достигается средствами Xamarin. Вы пишете общий код для iOS, Android и Windows, а Xamarin сам разбирается, как связать ваш код с нативным для каждой платформы API. Кроме того, есть возможность писать не только общий, но и платформозависимый код, и Xamarin тоже поймет, что и где вызывать. Одним из главных механизмов достижения кроссплатформенности является наличие «умных» сервисов, способных осуществлять кросс-зависимые вызовы, то есть обращаться к той или иной реализации определенного функционала в зависимости от платформы. Платформозависимый код можно писать не только на C#, но и добавлять его в xml-разметку. В нашем случае iOS-версия была урезанной и часть графического интерфейса нужно было скрыть, размеры некоторых элементов также зависели от платформы.
Для большей наглядности приведем небольшой пример. В нашем проекте мы использовали библиотеку классов, предоставленную заказчиком, которая была написана на C++. Назовем ее MedicalLib. MedicalLib собиралась в две разные сборки в зависимости от платформы (статическая MedicalLib.a для iOS и динамическая MedicalLib.dll для Windows). Кроме того, она имела различные wrapper-классы (классы-переходники) для вызова неуправляемого кода. Основной проект (общая кодовая база) содержал описание API MedicalLib (интерфейс), а платформозависимые проекты для iOS и Windows – конкретные реализации этого интерфейса и ссылки на сборки MedicalLib.a и MedicalLib.dll соответственно. Из основного кода мы вызывали те или иные функции абстракции, не задумываясь, как именно они реализованы. Механизмы Xamarin.Forms, понимая, на какой платформе запущено приложение, вызывали необходимую реализацию и подгружали конкретную сборку.
Примерно так это можно изобразить схематично:

Недостатки Xamarin
Необходимо также кратко упомянуть и недостатки Xamarin, которые мы принимали во внимание, делая выбор в пользу этого инструмента.
Во-первых, больший размер написанного приложения влияет на скорость загрузки и количество дискового пространства, которое оно занимает на устройстве. В нашем случае это было не критично, так как приложение было сделано для внутреннего использования и не было предназначено для широкого использования.
Во-вторых, небольшие задержки обновлений для последних версий Android и iOS. Для нашего приложения были прописаны поддерживаемые версии операционных систем, а конечные пользователи не могли скачивать и устанавливать обновления без разрешения администратора организации, что давало нам время на проверку и исправление дефектов в новой версии ОС.
В-третьих, сообщество разработчиков Xamarin является довольно молодым и несмотря на наличие Xamarin University, найти разработчика с реальным опытом Xamarin может быть непросто.
Наконец, поскольку код пользовательского интерфейса является платформозависимым, Xamarin будет нецелесообразно использовать для создания комплексной анимации, разработки богатых кастомных пользовательских интерфейсов и при создании игр.
В заключение
Большинство лиц, принимающих решения, выбирают для разработки кроссплатформенных приложений платформу Xamarin, так как она сокращает время вывода на рынок продукта и затраты на разработку за счет переиспользования кода и использования одного технологического стека. Опыт нашей команды показывает, что Xamarin дает возможность быстро получить MVP при минимальных инженерных издержках и проверить приложение на жизнеспособность.
В случае приложений со сложным пользовательским интерфейсом и сильной зависимостью от системы объем общего кода резко уменьшается. Таким образом, кроссплатформенная разработка Xamarin теряет свои основные преимущества и может быть равна по времени и стоимости нативным решениям. Однако за счет использования мощного IDE все равно оставляет за собой ряд преимуществ.