Как создать приложение на xamarin

Обновлено: 17.05.2024

Инсталлятор Xamarin устанавливает плагин к Visual Studio, который позволяет разрабатывать приложения для популярных мобильных платформ в привычном разработчику окружении. Также устанавливается отдельная среда разработки Xamarin Studio, которая, судя по всему, является модифицированной версией MonoDevelop. Мне привычнее работать в Visual Studio поэтому примеры в этой статье будут показаны с использованием именно этой среды разработки.

После установки в Visual Studio добавляются шаблоны проектов для мобильных приложений под Android и iOS (поддерживается создание как специализированных приложений для iPad и iPhone, так и универсальных приложений, а также приложений, использующих OpenGL). Для создания приложений для iOS в Visual Studio прийдется, правда, заплатить. Этот функционал доступен либо в режиме trial, либо в business-версии инструментария, а это стоит $999 в год.

Разработка для Android

После создания Android-проекта мы получаем набор файлов, в котором есть класс главного окна и набор ресурсных файлов. После длительной работы в Eclipse немного раздражает название папок в PascalCase, но к этому можно довольно быстро привыкнуть. Также есть отличия в работе с файлами ресурсов. Для того, чтобы встроенный дизайнер окон понимал файлы ресурсов с лайаутами, у них расширение изменено на .AXML вместо привычного .XML в Eclipse. Это довольно сильно раздражает, особенно если рисовать лайауты в Eclipse, а потом переносить в Visual Studio в случае если Eclipse’овский дизайнер окон больше нравится.

Встроенный дизайнер окон мне лично показался неудобным. Медленный, часто валит всю IDE, я так и не понял, как в нем по-простому переключиться между XML-видом и UI. Здесь уж точно можно сказать что писано чужими для хищников. Я для себя решил, что в Eclipse мне удобнее, привычнее, да и на экран ноутбука в Eclipse помещается больше полезной информации. Может кому-то дизайнер Visual Studio и понравится больше, на вкус и цвет фломастеры разные.

Activities
  • Для регистрации activity не надо ничего прописывать в манифесте. Для этого используется аннотация [Activity]
  • Для того, чтобы сделать activity стартовой, необходимо для аннотации [Activity] указать параметр MainLauncher. Это будет равносильно заданию action = android.intent.action.MAIN и category = android.intent.category.LAUNCHER в манифесте
  • Основные методы жизненного цикла activity (да и вобще все методы) имеют названия в PascalCase.
Элементы управления и обработка событий

Не со всеми обработчиками событий в виде делегатов дела обстоят радужно. В одном из проектов обнаружилась проблема с событием View.ViewTreeObserver.GlobalLayout , у которого при использовании оператора -= не отключались делегаты-обработчики. Да вообще никак не отключались. Пришлось использовать IOnGlobalLayoutListener .

  • Создать проект Java Binding Library в решении.
  • В папку Jars положить нужный JAR-файл (в JAR-библиотеке не должно быть AndroidManifest.xml, ибо наличие этого файла может повлечь ряд неприятных последствий. Подробнее об этом можно узнать здесь).
  • Указать Build Action для JAR-файла как EmbeddedJar.
  • В проекте Android-приложения добавить в References проект созданной Java Binding Library.
Работа с базами данных

Для работы с базами данных в Mono for Android предусмотрены используются классы пространства имен Mono.Data.Sqlite (используются для доступа к базам данных SQLite) и System.Data.SqlClient (для доступа к Microsoft SQL Server). Классы пространства имен System.Data.SqlClient доступны только в Business-редакции инструментов разработки. Можно также использовать классы-обертки над родным Java API для Android и сторонние разработки, например sqlite-net, в котором доступен асинхронный вариант API.
Пользоваться доступным API довольно просто. Все очень схоже с разработкой для настольных ПК:

Разработка для iOS

Элементы управления и обработчики событий

Создание элементов управления в коде ничем не отличается от аналогичной работы в Objective-C. Обработчики событий можно навешивать также как и в Android – с помощью делегатов. Также можно добавлять обработчики как в Objective-C через селекторы.

Использование нативных библиотек

В Xamarin iOS, также как и для Android, доступна возможность использования нативных библиотек. Для этих целей есть специальный тип проекта – iOS Binding Project, в который можно добавлять статические библиотеки, после чего они будут слинкованы вместе с основным проектом.

Работа с базами данных

Для работы с базами данных в iOS используются те же пространства имен, что и в Android. API, соответственно, такой же. Небольшая разница может быть в мелочах. Например, для получения пути к файлу базы данных SQLite в Android есть специальный API-вызов:

Удаленная отладка iOS приложений из Visual Studio

В Xamarin 2.0 есть возможность отладки мобильных приложений для iOS прямо из Visual Studio. Для того, чтобы это стало возможно, необходимо иметь в локальной сети Mac с установленным XCode, iOS SDK и Xamarin Studio. Никаких дополнительных настроек производить не надо, достаточно при открытии iOS проекта в Visual Studio выбрать нужный build-сервер из списка доступных.

К сожалению данный подход не заработал с виртуальной машиной, запущенной на том же компьютере что и Visual Studio. Хотя с обычным Mac’ом в локальной сети все замечательно работает. Причин или объяснений этому пока найти не удалось, пытаюсь общаться с разработчиками по этому поводу.

Также не очень понятно, как организовывать UI-тестирование и проверку работоспособности приложения из Visual Studio. Симулятор запускается на Mac’е, похоже, что без VNC здесь не обойтись.

Кроссплатформенные библиотеки классов (Portable Class Libraries)

Xamarin предоставляют возможность создания библиотек, которые могут быть использованы (в виде кода или готовых сборок) сразу для нескольких платформ. Такие библиотеки называются Portable Class Library (PCL).

iOS файл VSMonoTouch,Version=v1.0+.xml

После создания этих двух файлов и перезапуска Visual Studio можно будет указывать Android и iOS в качестве поддерживаемых платформ для новых PCL-проектов или добавить эти платформы в существующие проекты через Properties -> Library -> Target Framework.
Но это еще не все нюансы.

Если вы хотите поддержку Android и iOS в PCL-проекте, то придётся отказаться от поддержки Xbox 360 и Windows Phone 7 (зато можно поддерживать Windows Phone 7.5+). Для Xbox придётся создавать еще один проект и в нем добавлять файлы из существующего PCL-проекта в виде ссылок. Или, как вариант, в одном PCL-проекте оставить все платформы от Microsoft (включая Xbox 360), а в другом оставить только iOS и Android.

Дополнительные компоненты и библиотеки

Xamarin помимо, собственно, продажи инструментария для разработки ПО, открыли магазин по продаже сторонних компонент, многие из которых действительно очень упрощают жизнь разработчику. В магазине доступны как платные, так и бесплатные библиотеки и темы оформления. Полезность, например, бесплатных Xamarin.Auth, Xamarin.Social и Xamarin.Mobile трудно переоценить. Есть возможность публиковать собственные компоненты в этом магазине.

Неприятные моменты

  • Жуткие тормоза при отладке Android-приложений, когда на довольно мощной машине с Core i7 и 8 GB RAM при останове на брейкпоинте Visual Studio зависает на 10-15 секунд. Подобное может повторяться на каждом шаге отладчика.
  • Отсутствие в списке устройств, доступных для отладки приложений, некоторых устройств, подключенных к компьютеру (которые, тем не менее, видны через adb devices и на которых Eclipse отлично запускает приложения)
  • Произвольные отпадания отладчика и необходимость перезапуска приложения в связи с этим.
  • Отсутствие статей и учебных материалов (да, есть какие-то материалы на официальном сайте, но они покрывают не все популярные задачи)
  • Наличие багов, о которых узнаешь ВНЕЗАПНО! после общения на форуме. Хотя на том же официальном форуме разработчики довольно бодро отвечают на вопросы и вообще молодцы.
  • Цена на Business-редакцию очень кусается. К тому же лицензия на год, а не навсегда (немного скрашивает ситуацию наличие скидок при покупке лицензии сразу для нескольких платформ).

Приятные моменты

  • При покупке лицензии сразу для нескольких платформ или сразу для нескольких рабочих мест, предусмотрена скидка.
  • С выходом новой версии, в которой будет поддержка async\await разработка действительно станет проще и будет возможность использовать кучу полезных библиотек, не меняя их код.

Выводы

Инструментарий от Xamarin таки да, действительно работает и если вы планируете разрабатывать несколько приложений в год или же планируемая прибыль от разрабатываемого приложения больше чем $2k, то Xamarin SDK явно может облегчить вам жизнь и избавить от двойной работы над кодом для каждой платформы.

С другой же стороны, для Indy-разработчика цена в $1k для каждой платформы мне, например, кажется чрезмерной т.к. есть много нюансов, которые необходимо знать и\или прочувствовать на себе перед началом разработки, есть баги, которые неизвестно в каком режиме будут исправляться и неизвестно насколько их наличие может замедлить разработку конкретно вашего проекта.

Немного клёвых ссылочек!

UPD: Уточнение от northicewind по поводу стоимости лицензии:

Выберите Файл > Создать > Проект. или нажмите кнопку Создать проект. :

Создание проекта

Выполните поиск по слову "Xamarin" или выберите Мобильный в меню Тип проекта. Выберите тип проекта Мобильное приложение (Xamarin.Forms) :

Фильтр для проектов Xamarin

Выберите имя проекта – в примере используется "AwesomeApp":

Выбор имени проекта

Щелкните тип проекта Пустой и убедитесь, что выбраны параметры Android и iOS:

Android и iOS с .NET Standard

Новые установки Visual Studio 2019 не содержат настроенный эмулятор Android. Щелкните стрелку раскрывающегося списка на кнопке Отладка и выберите Создать Android Emulator, чтобы открыть экран создания эмулятора:

Раскрывающийся список "Создать Android Emulator"

На экране создания эмулятора используйте параметры по умолчанию и нажмите кнопку Создать:

Экран создания эмулятора Android

Эмулятор Android в диспетчере устройств

Теперь система Visual Studio 2019 должна выводить имя нового эмулятора на кнопке Отладка:

Имя эмулятора Android на кнопке "Отладка"

Эмулятор Android, в котором отображается приложение

Настройка приложения

Приложение можно настроить для добавления интерактивных функций. Чтобы добавить взаимодействие с пользователем в приложение, выполните следующие действия:

Измените MainPage.xaml, добавив этот XAML до конца </StackLayout> :

Измените MainPage.xaml, добавив этот код до конца класса:

Отладка приложения на Android:

Приложение Android

Пример приложения включает дополнительные интерактивные функции, которые не рассматриваются в этом видео.

Создание приложения iOS в Visual Studio 2019

Можно создавать и отлаживать приложения iOS из Visual Studio с помощью компьютера Mac, подключенного к сети. Дополнительные сведения см. в инструкциях по установке.

В этом видео рассматривается процесс сборки и тестирования приложения iOS с помощью Visual Studio 2019 в Windows:

Пошаговые инструкции для Windows

Выполните следующие действия, как показано в видео.

Мобильное приложение (Xamarin.Forms)

Android и iOS с .NET Standard

Запустите эмулятор Android, нажав кнопку отладки (или пункт меню Отладка > Начать отладку).

Измените MainPage.xaml, добавив этот XAML до конца </StackLayout> :

Измените MainPage.xaml, добавив этот код до конца класса:

Отладка приложения на Android:

Снимок экрана, на котором показан Android Emulator.

Можно создавать и отлаживать приложения iOS из Visual Studio с компьютером Mac, подключенным к сети. Дополнительные сведения см. в инструкциях по установке.

Пошаговые инструкции для Mac

Выполните следующие действия, как показано в видео.

Выберите Файл > Создать решение. или нажмите кнопку Создать проект. и выберите Многоплатформенность > Приложение > Приложение с пустыми формами:

Приложение с пустыми формами

Android и iOS с .NET Standard

Восстановите пакеты NuGet, щелкнув правой кнопкой решение:

Снимок экрана с выделенным пунктом "Восстановить пакеты NuGet" в контекстном меню решения.

Запустите эмулятор Android, нажав кнопку отладки (или Запуск > Начать отладку).

Измените MainPage.xaml, добавив этот XAML до конца </StackLayout> :

Измените MainPage.xaml, добавив этот код до конца класса:

Отладка приложения на Android:

Снимок экрана, на котором показан Android Emulator.

Щелкните правой кнопкой мыши, чтобы настроить iOS на Запускаемый проект:

Отладка приложения в iOS:

Приложение iOS

Загрузите полный код из коллекции примеров или просмотрите его на GitHub.

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

Пример итогового приложения

Пример итогового приложения

И так, условимся, что мы начинаем новый проект в Visual Studio с Xamarin.Forms под названием Phoneword:

1). Сначала запускаем Visual Studio. На картинке начальное окно программы:

Начальное окно программы Visual Studio

Начальное окно программы Visual Studio

Нажимаем на кнопку создания нового проекта

Нажимаем на кнопку создания нового проекта

3). В диалоге New Project, жмем Cross-Platform, выбираем шаблон Mobile App (Xamarin.Forms), задаем имя Phoneword, выбираем расположение проекта и жмем кнопку OK:

Диалог создания проекта

Диалог создания проекта

Диалог выбора платформ и стратегии развития проекта

Диалог выбора платформ и стратегии развития проекта

5). В разделе Solution Explorer, проекта Phoneword, делаем двойной щелчок на MainPage.xaml для открытия этого файла в редакторе:

Открытый файл MainPage.xaml в редакторе

Открытый файл MainPage.xaml в редакторе

6). В MainPage.xaml, удаляем весь код шаблона и заменяем кодом, который ниже. Этот код декларативно определяет интерфейс пользователя для страницы:

Сохраняем изменения в MainPage.xaml , нажав комбинацию CTRL+S, и закрываем файл.

7). В разделе Solution Explorer, распускаем MainPage.xaml и двойным щелчком открываем файл кода страницы MainPage.xaml.cs:

Файл кода страницы MainPage.xaml.cs

Файл кода страницы MainPage.xaml.cs

8). В коде MainPage.xaml.cs, удаляем весь код шаблона и заменяем его на следующий код. Методы OnTranslate и OnCall должны быть выполнены в ответ на нажатие кнопок Translate и Call со стороны пользовательского интерфейса соответственно:

Сохраняем изменения в файле MainPage.xaml.cs нажатием комбинации CTRL+S, закрываем файл.

Добавляем новый элемент в проект

Добавляем новый элемент в проект

Диалог добавления нового класса

Диалог добавления нового класса

11). В файле PhoneTranslator.cs, удаляем весь шаблон кода и заменяем на ниже указанный. Этот код транслирует буквы в телефонный номер:

Сохраняем файл PhoneTranslator.cs , нажатием CTRL+S, и закрываем файл.

Добавляем новый элемент в проект

Добавляем новый элемент в проект

Добавление нового интерфейса

Добавление нового интерфейса

14). В файле IDialer.cs, удаляем шаблон кода по умолчанию и заменяем его кодом, указанным ниже. В этом коде определен метод Dial , который должен быть реализована каждой платформе для набора переведенного номера телефона:

Сохраняем изменения IDialer.cs нажатием CTRL+S, закрываем файл.

Замечание. Общий код для приложения сейчас закончен. На уровне определенной платформы код набора номера теперь будет реализован как DependencyService.

Добавляем элемент к проекту Phoneword.iOS

Добавляем элемент к проекту Phoneword.iOS

16). В разделе диалога Add New Item, выбираемApple > Code > Class, вводим имя PhoneDialer, и жмем на кнопку Add:

Добавляем новый класс к проекту iOS

Добавляем новый класс к проекту iOS

17). В файле PhoneDialer.cs, удаляем весь шаблон кода и заменяем его на ниже приведенный. Этот код содержит метод Dial который должен быть использован платформой iOS для набора транслированного телефонного номера:

Сохраняем файл PhoneDialer.cs , нажатием CTRL+S, и закрываем файл.

Добавляем элемент к проекту Phoneword.Android

Добавляем элемент к проекту Phoneword.Android

19). В разделе диалога Add New Item, выбираем Android > Code > Class, вводим имя PhoneDialer, и жмем на кнопку Add:

Добавляем новый класс к проекту Android

Добавляем новый класс к проекту Android

20). В файле PhoneDialer.cs, удаляем весь шаблон кода и заменяем его на ниже приведенный. Этот код содержит метод Dial который должен быть использован платформой Android для набора транслированного телефонного номера:

Сохраняем файл PhoneDialer.cs , нажатием CTRL+S, и закрываем файл.

Замечание. Обратите внимание, что этот код предполагает, что вы используете новейший Android API.

21). Во вкладке Solution Explorer, в проекте Phoneword.Android, двумя щелчками открываем файл MainActivity.cs , удаляем весь шаблон кода и заменяем на следующий код:

Сохраняем файл MainActivity.cs , нажатием CTRL+S, и закрываем файл.

23). В секции Required permissions , разрешаем телефону выполнять звонок CALL_PHONE:

Разрешаем телефону звонить

Разрешаем телефону звонить

Сохраняем файл манифеста, нажатием CTRL+S, и закрываем файл.

Добавляем элемент к проекту Phoneword.UWP

Добавляем элемент к проекту Phoneword.UWP

Добавляем новый класс к проекту UWP

Добавляем новый класс к проекту UWP

26). В файле PhoneDialer.cs, удаляем весь шаблон кода и заменяем его на ниже приведенный. Этот код содержит метод Dial который должен быть использован платформой Universal Windows Platform для набора транслированного телефонного номера:

Сохраняем файл PphoneDialer.cs , нажатием CTRL+S, и закрываем файл.

Добавляем новую ссылку к проекту UWP

Добавляем новую ссылку к проекту UWP

28). В диалоге Reference Manager , выбираем Universal Windows > Extensions > Windows Mobile Extensions for UWP, и жмем на кнопку OK:

Диалог менеджера ссылок

Диалог менеджера ссылок

Замечание. В v10.0.16299.0 Windows Mobile Extensions для UWP должен быть выбран класс PhoneLine .

29). Во вкладке Solution Explorer, в проекте Phoneword.UWP, делаем двойной щелчок и открываем файл Package.appxmanifest:

Настройка файла Package.appxmanifest

Настройка файла Package.appxmanifest

30). На странице Capabilities , разрешаем возможность звонить Phone Call:

Сохраняем изменения в файле нажатием CTRL+S, и закрываем файл.

32). Во вкладке Solution Explorer, кликаем правую кнопку на проекте Phoneword.UWP и выбираем Set as StartUp Project:

Устанавливаем проект по умолчанию

Устанавливаем проект по умолчанию

33). В панели инструментов Visual Studio, жмем кнопку Start (треугольная кнопка, которая имитирует кнопку проигрывания) для запуска приложения:

Запущенное приложение UWP

Запущенное приложение UWP

34). Во вкладке Solution Explorer, жмем правой кнопкой на проект Phoneword.Android выбираем пункт Set as StartUp Project.

35). На панели инструментов Visual Studio, жмем на кнопку Start (треугольная кнопка, которая имитирует кнопку проигрывания) для запуска приложения Android в эмуляторе:

Александр Алексеев

В течение нескольких праздничных дней я разработал приложение Scoreboard, предназначенное для отслеживания результатов спортивных мероприятий и настольных игр, которое сейчас доступно для iOS и Android!

Я не ожидал того, что мне удастся с нуля написать приложение для iOS и Android за эти праздники, но я это сделал. Все началось с того, что мы с Хизер играли в нереально веселую настольную игру Qwirkle (Квёркл), где частью игрового процесса является составление последовательностей блоков. Мы только начали изучать руководство по игре, как тут же выяснилось, что нам понадобятся ручка и бумага для подсчета игровых очков. Мы обыскали все вокруг и нашли лист бумаги, а в ящике с мусором отыскалась и ручка. Приблизительно на 20-й минуте, как я начал вести счет игре, он уже пошел на сотни. В этот момент меня осенило, что нужно создать приложение для подсчета игровых очков, как это сделано, например, в игре Sushi Go, в которую мы постоянно играем. В этот момент и родилась идея создания Scoreboard!

Прежде чем осуществить мой план по разработке приложения в кратчайший срок, то есть выполнить так называемый Holiday Hack, я обсудил этот вопрос на Merge Conflict несколько недель назад.

Впрочем я знал, что мог бы попытаться еще раз разработать приложение в течение одной недели, что я уже как-то раз провернул с проектом Meetup Manager в один из прошедших новогодних праздников. Здесь я опишу, каким был мой недельный путь по разработке приложения и последующей его дистрибуции.

Функции

Я понимал, что мне предстоит определить четкий набор функций приложения, чтобы не перегружать его лишними возможностями. Кроме того, я решил не искать какие-либо другие проекты в магазине приложений, которые могли бы обладать схожим набором функций. Мне требовалось приложение, строго соответствующие обозначенным требованиям, и вот каковыми они были:

  • 2-4 игрока
  • Возможность приостановления/возобновления текущей игры
  • Хранение всех игровых данных в локальной базе SQLite
  • Хранение данных игр и имен игроков (с возможностью редактирования)
  • Показ истории прошлых игр

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

Фреймворк приложения и плагины

Изначально было понятно, что для моих целей идеально подходит Xamarin.Forms. Поскольку пользовательский интерфейс был не слишком сложным, ему следовало быть практически одинаковым и на iOS и на Android. Чтобы также позволить в будущем выпустить приложение и для Windows. Кроме того, я работал с замечательным сообществом разработчиков, развивая проект Xamarin.Forms Community Toolkit, так что у меня была возможность использовать пререлизные пакеты в настоящем приложении. Честно говоря, у меня, вообще, не было проблем с использованием последней версии Xamarin.Forms, что само по себе просто отлично. Я повторно использовал имеющиеся у меня преобразователи и несколько пользовательских элементов управления из других приложений и через некоторое время уже запускал приложение. Мне также понравились новые шаблоны, предлагаемые по умолчанию для Android в альфа-канале. В случае с iOS я просто выбрал аналогичную цветовую гамму для подсветки.

Более всего в работе мне помогали плагины для Xamarin, и именно благодаря им я сумел создать свое приложение в столь сжатый срок. В течение последних двух лет я был много наслышан о плагинах, а теперь смог на практике оценить их преимущества, поскольку они дали мне все то, что требовалось для разработки приложения. И вот их перечень:

    : Это мой оригинальный плагин, который фактически контролирует каждый аспект этого приложения. Я сохраняю полное состояние игры в настройках, включая настоящие имена, очки, раунды, а также текущего игрока. Таким образом, я могу постоянно держать информацию наготове, даже если пользователь закроет, и затем повторно откроет приложение. : Кому, вообще, могут не нравиться кроссплатформенные пользовательские диалоги? — Вопрос риторический. Они могут выглядеть и восприниматься по-разному, но они наверняка пригодятся для ввода текста, загрузки диалоговых окон, а также просто для оповещений. : Этот плагин используется нечасто, и, кроме того, мне постоянно хочется открыть настраиваемую вкладку в Chrome или SFSafariViewController вместо браузера. : Начиная с 2015 года этот плагин стал для меня самым удобным решением, поскольку здесь есть все необходимое для MVVM, и эта возможность лучше ObservableCollections. : Мой хороший друг Франк вернулся и привнес замечательно оптимизированную и легкую библиотеку ORM SQLite-net. Мое приложение кэширует данные только локально и сохраняет всего несколько таблиц, поэтому данный плагин подошел просто идеально.

Между Xamarin.Forms и этими библиотеками приложение в iOS и Android совместно использует около 95% кода. И это просто великолепно.

Аналитика и отчетность об аварийном завершении

Эти две категории находятся в очень интересной для разработчиков Xamarin области. С Xamarin Insights, объединенном с Hockey App, и с вышедшим на первый план Mobile Center многим разработчикам сложно определиться с тем, что интегрировать в мобильные приложения. Raygun недавно спонсировал мероприятие Merge Conflict, и несколько недель тому назад я принял решение испытать его в каждом моем приложении, что мне очень понравилось! Raygun способен на очень многое в части мониторинга приложений в режиме реального времени и отчетности об аварийном завершении. При помощи всего лишь одной строки кода можно получить отчет о сбое, а благодаря нескольким — о выбранном экране, сетевых вызовах и даже пойманных исключениях. Таким образом у меня сейчас стандартизирована отчетность на всех приложениях:

Raygun позволяет получить исчерпывающую информацию об использовании приложения и сбоях в нем. Однако, это не вся возможная аналитика приложения. Наряду с Raygun для всех моих приложений я использовал аналитику и события Mobile Center. Честно говоря, это одна из моих любимых частей Mobile Center, и ее очень легко интегрировать:

Непрерывная интеграция и внедрение приложения

С того момента, как я нажал File->New Project мне стало ясно, что я бы совершенно точно не желал разрабатывать это приложение с нуля. Ведь я хочу, чтобы все было подписано, выровнено и готово к отправке в момент уведомления. Естественный выбор здесь — мое любимое решение CI/CD — Bitrise. И сама компания и их программный продукт просто великолепны. Спустя 20 минут мое приложение было полностью собрано, отмечено версиями, подписано, отправлено посредством dSYM в Raygun и готово к установке с фиксированием изменений и передачей на GitHub.

Интеграция рекламы

Поскольку я пока что не настроен возиться с реализацией функции «покупок в приложении», я начал интегрировать рекламные объявления Google AdMob во все мои бесплатные приложения. Это приложение является максимально простым, включающим всего лишь несколько страниц. Но на главной странице подсчета очков, где пользователи будут проводить большую часть времени, располагается большой, хороший рекламный баннер. Он не слишком навязчивый, но зато остается на экране все время, когда кто-либо пользуется приложением. Кроме того, поскольку состояние игры сохраняется автоматически, если кто-то нажимает на очки, приложение позволяет легко возобновить прерванную игру.

Иконка приложения и графическое оформление

Если не выполнить данный пункт должным образом, то потом его исправление может занять много времени и запросто задержать выпуск приложения. Apple и Google предписывают строгие требования к размеру иконки и графическому оформлению приложения. Это касается приложения самого по себе, а также его представления в соответствующем магазине. Как только у меня имеется готовое название, цветовое решение и скриншот приложения я сразу же отправляюсь на Fiverr — портал фриланса, где можно заказать иконку для приложения у какого-нибудь дизайнера, однако, имейте в виду, что за уникальность придется переплатить. Это стоит около 40 $, но итог меня вполне устроил:

Я немного изменил цвета и шрифт в центре, чтобы иконка стала такой, как мне хотелось. На все про все ушло около трех дней, последние из которых я в действительности потратил на то, чтобы добавить в приложение некоторые новые функции и осуществить дополнительные тесты 🙂

Тестирование

Поскольку мое время было ограничено, мне следовало выбрать такую форму тестирования приложения, которая позволила бы сделать это максимально быстро. Мы с Хизер играли во множество настольных игр в свободное время, что идеально подошло для тестирования. Поскольку логика приложения была достаточно простой, я до того особо его и не тестировал. Разумеется, это не значит, что я, вообще, ничего не сделал по части автоматических тестов. Я запустил крайне простой тестовый прогон приложения в Xamarin Test Cloud, чтобы сделать скриншот на каждой платформе, как я это обычно делаю, и создать несколько простых тестов для оценки работы программы. Мне хотелось также испытать другие механизмы автоматического тестирования, которые Google разрабатывает совместно с Firebase. Их Test Lab действительно аккуратный программный продукт, использующий Espresso и ряд других тестирующих фреймворков. Кроме того, у них также есть Robo-тест, который предназначен для автоматического исследования приложений. Я решил дать ему шанс, хотя когда Test Cloud обладали данной функцией она показывала неудовлетворительные результаты. Как и следовало ожидать, этот тест мало что сделал, помимо исследования страницы настроек.

При этом Вы получаете действительно крутой график, скриншоты и даже, по существу, бесплатное видео, так что сердиться здесь не на что. Зато теперь я понимаю, почему Test Cloud удалили эти функциональные возможности — они на самом деле не очень-то полезные, но все-таки крутые 🙂

И в заключение

Я всегда стараюсь предоставлять пользователям возможность сообщать о проблемах в приложении и получать обратную связь. Я создал максимально простой экран в приложении «настройки/сведения о приложении», где подсвечены: фреймворк, который я использовал, авторские права и ссылки на форум поддержки. Я не хотел организовывать собственный форум поддержки, так что я просто создал сообщество G+. Таким образом, любой пользователь сможет написать обратную связь, а разработчик получить об этом уведомление, если он того желает. Я использовал этот способ для нескольких приложений и он показал себя просто отлично.

Я надеюсь, что Вам будет небезынтересно ознакомиться с приложением Scoreboard, ведь сейчас оно доступно бесплатно:

Xamarin development Noveo

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

Xamarin

В нашем блоге уже была статья о кроссплатформенной разработке, в которой обзорно описывались различные фреймворки, в том числе и Xamarin. Здесь мы попытаемся рассказать о нем более подробно. Вдаваться в самые мелкие детали мы, конечно, не будем, т.к. существует достаточно много хороших и подробных статей, но дать общее представление необходимо для основной части статьи.

Многие до сих пор полагают, что кроссплатформенная разработка должна подчиняться фразе “write once, run everywhere”, что подразумевает, что один код должен работать на нескольких платформах без изменений. Однако такой подход обычно приводит к приложениям с ограниченной функциональностью (многие фичи, присущие той или иной платформе, недоступны) и универсальным UI, который не вписывается ни в одну из мобильных платформ.

Xamarin, в свою очередь, нельзя отнести к категории “write once, run everywhere”, хотя бы потому, что одна из его важнейших функций – возможность реализовать нативный UI для каждой платформы отдельно. При этом большая часть кода, которая включает в себя бизнес-логику, слой данных, доступ к ним и др., остаётся общей для всех платформ.

Как это работает?

Результатом скомпилированного Xamarin-приложения являются .app-файл для iOS, .apk для Android и .appxbundle для UWP. Эти файлы неотличимы от пакетов приложений, созданных стандартными для платформ IDE, и развертываются точно таким же образом.

Xamarin.Forms

Первый же вопрос, который мы себе задали, – зачем для нашего приложения нужен Xamarin? Ведь по большому счету все, что должно уметь приложение, – это отобразить данные, которые приходят с сервера. По предварительным оценкам, только 25-30% приложения общие для всех платформ, а всё остальное – UI, который нужно реализовывать отдельно для каждой платформы.

Хотя целью Company Staff первоначально было обучение новой технологии, чтобы максимально проникнуться платформой и в дальнейшем заниматься серьёзными коммерческими проектами, мы решили отнестись к “тренингу” как к продукту. Тем более, что он действительно имел практическое применение в реалиях нашей компании. И поэтому нужно было сначала ответить на вопрос целесообразности применения Xamarin.

К счастью, разработчики Xamarin позаботились о нас и предоставили Xamarin Forms API.

Первые шаги

Итак, мы определились с технологией, почитали статьи/отзывы/туториалы и приступили к разработке приложения.

Для Xamarin Forms есть 3 архитектурных подхода для общего кросс-платформенного кода:

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

Верхняя структура проекта проста, определилась сразу и почти не изменилась до релиза проекта:

Xamarin development Noveo

Xamarin development Noveo

1) Рендереры – классы, отвечающие за отображение визуальных компонент. Они содержат ссылки на PCL-объекты и выставляют свои свойства согласно этим объектам. В дальнейшем рендереры разворачиваются в нативные контролы.

Рассмотрим кастомизацию контролов на примере простого поля ввода, у которого нужно отключить нативные клавиатурные подсказки.

Для начала нужно создать класс в PCL, унаследованный от Entry.

Затем просто добавляем новый контрол в код пользовательского интерфейса (в нашем случае интерфейс описан в XAML):

Это все, что нужно в PCL для нашего простого примера. Переходим к реализации рендереров. Для этого необходимо всего три вещи:

  • Создать унаследованный от EntryRenderer класс, который отвечает за отображение нативного элемента.
  • Переопределить метод OnElementChanged, в котором необходимо описать логику кастомизации контрола. Этот метод вызывается при создании соответствующего контрола Forms.
  • Добавить атрибут ExportRenderer на класс рендерера, чтобы “зарегистрировать” наш класс в Xamarin.Forms для рендеринга определенного контрола.

Вот так выглядит код рендереров для нашего поля ввода:

2) Реализация DependencyService’ов – реализация функционала, не связанного с UI, позволяющая работать с данным функционалом из PCL на уровне абстракций.

Одной из важных функций в CS является возможность добавления контактов сотрудника в телефонную книгу устройства. Поскольку реализация данного функционала сильно “платформо-зависима”, а доступ к нему нам необходим из PCL кода, то наиболее удобный способ – использование DependencyService’ов.

Для начала нужен интерфейс в PCL для операций добавления контактов. В нашем приложении он выглядит так:

Далее из PCL кода достаточно вызвать фабричный метод Get<T>() у статического класса DependencyService для выполнения описанных операций:

В CS с помощью DependencyService’ов реализована работа с контактами, ориентацией девайса, социальными сетями, локализацией, защищенным хранилищем данных и др.

Затем нужно было выбрать фреймворк, который упростит работу с MVVM и легко встроится в описанную выше архитектуру. От данного фреймворка нам требовался следующий функционал:

  • базовые классы для работы с MVVM (ViewModelBase, Commands, Events);
  • Dependency Injection, в первую очередь для внедрения сервисов во вью-модели;
  • реализация межстраничной навигации.

На первый взгляд ничего особенного – все можно реализовать и самим. Но по нашему опыту такие фреймворки значительно ускоряют работу и предоставляют множество приятных плюшек, помимо описанных выше.

Существует несколько наиболее популярных фреймворков для данных целей:

  • MVVMLight;
  • Caliburn.Micro;
  • MVVMCross;
  • Prism.

Каждый из этих фреймворков портирован для Xamarin.Forms. Со всеми, кроме последнего, мы имели опыт работы раньше на других платформах – UWP, WindowsPhone, WPF.

MVVMCross и Prism – большие и мощные фреймворки с большой поддержкой коммьюнити. Поскольку и Xamarin, и Xamarin.Forms быстро развиваются, количество форков и звездочек на github’e на данный момент и в дальнейшем стало определяющим фактором при выборе сторонних инструментов.

В итоге – мы остались довольны выбором Prism, в первую очередь – благодаря удобной реализации навигации MVVM-путём, хоть и пришлось повозиться с навигацией на уровне Xamarin.Forms.

О том, как мы преодолели трудности, связанные с навигацией и не только, читайте во второй части!

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Читайте также: