вторник, 26 августа 2014 г.

Мысли о Xamarin


В большинстве случаев, когда клиент просит создать мобильное приложение он подразумевает что приложение должно работать на различных мобильных платформах. В случае серверной части – тут не никаких сложностей: сервисный слой построенный на принципах REST и oAuth2 для обработки авторизации. В публикации речь пойдет о том как создавать клиентскую часть – код который будет выполнятся на конечном телефоне или планшете.
Если не вдаваться в детали есть два пути решения данного вопроса. Первый вариант – это реализовать клиентской приложение на нативном языке: - одно для iOS, одно для Andriod и одно для Windows Phone.Если у вас есть ресурсы (деньги + люди + знания) – это хороший вариант – но цена его реализации и последующей поддержки высока. Как клиент вы должны быть уверены, что у вас есть средства не только для того что бы нанять людей для разработки на разных языках, но так же вы должны быть уверены что эти люди будут доступны для вас на этапе поддержки приложения, когда оно будет эксплуатироваться. Это хороший вариант, но для большинства компаний оно сопряжено с дополнительными затратами, на которые они порой не готовы.
Поэтому, появились так называемые гибридные приложения, которые существуют в различных вариантах. Идея заключается в том что бы найти способ использовать один код на различных платформах, таким образом стоимость создания и поддержки приложения становится значительно меньше.
Одним из вариантов может быть использование PhoneGap/Gordova. Инструмент позволяет использовать HTML/JS/CSS для создания приложения, которое позже можно использовать на различных мобильных платформах. В результате приложение будет содержать WebView, которое и будет отображать ваш HTML и использоваться в качестве “моста” для доступа к нативному API платформы.

То есть, в результате будет не совсем нативное приложение: а приложение которое работает в встроенном WebView. Но это все равно вариант, который при прочих равных условиях может быть эффективным.
Другим вариантом создания гибридного приложения может быть использование Xamarin. Данный инструмент позволяет исползовать C# для написание клиентского кода ииспользовать платформозависимый фреймворк для создания UI с помощью C#. В отличие от приложений PhoneGap, приложение созданное с помощью Xamarin является нативным для целевой платформы, но также и требует некоторых дополнительных знаний для разработки: вам необходимо будет познакомится с платформозависимым языком UI.
Я пробовал использовать Xamarin в прошлом году, но, честно говоря, я не был сильно впечатлен. Возможно, это было специфично для моего конкретного случая, но среда разработки в то время была слишком глючная для того, чтобы использовать ее для реальных проектов.
Но времена меняются. Недавно разработчики Xamarin представили версию 3, в которой появилось кое-что дейтствительно интересное: Xamarin.Forms. Это новая возможность создавать нативные приложения с использованием C# и встроенных графических элементов, вам теперь не придется беспокоится больше о UI: когда вы используете какой-то элемент, он автоматически преобразуется в свой нативный эквивалент для своей платформы, и скриншот представленный ниже демонстрирует это:


(Просто для информации: я не получаю за эту публикацию денег;-) Это просто мои мысли после использования Xamarin.Forms в течение нескольких дней. Но если кто то захочет купить мне пива, я с радостью приму такой подарок;-) )
Что же, это интересно, верно? Для некоторых приложений – безусловно. Но как все мы знаем: большое количество приложений используют специфические UI элементы, и для большинства из них, набор элементов доступный в Xamarin.Forms будет недостаточным. Поэтому, нам нужно некоторая возможность расширить этот набор, и создать свои собственные UI елементы, соответствующие нашим потребностям.
Используя Xamarin есть два варианта: первый комбинировать элементы Forms с элементами специфичными для Andriod/iOS/WinPhone. Это возвращает нас к ситуации которую мы описывали ранее – нам требуется знать язык UI специфичный для конкретной платформы – конечно затраты на работу с UI в данном случае будут меньше, но так или иначе нам необходимо будет участие разработчиков хорошо знакомых с целевой платформой.

Второй вариант? Использовать XAML для создания UI. Для всех платформ. И это именно то, что *действительно* привлекло мое внимание: значит ли это что сейчас мы можем создавать кросс-платформенные приложения не используя больше ничего кроме XAML+С#? Давайте попробуем разобраться.

Когда мы создаем новый файл XAML для Xamarain.Forms, первая вещь на которую вы вероятно обратите внимание это то, что пространство имен по умолчанию не такое как используется в приложениях WinPhone/WPF/…:

То есть, мы можем сказать, что процессор XAML который обрабатывает разметку и преобразует ее в объектную модель не тот, который используется для WinPhone. Отличия есть и далее. Если мы посмотрим как объявляется текстовая метка:


То увидим, что свойства элемента не выглядят чем то знакомым. Таким образом, это отдельный диалект XAML  - и  это имеет смысл.

Замечание: Нет, вы не сможете скопировать существующий XAML код. Точно также как вы не можете – или не должны – подобным образом копировать HTML используемый на вашей странице в приложение Cordova/Phoneapp или приложение Windows Store – по сути, как было уже сказано, есть небольшие отличие в синтаксисе диалекта XAML который поддерживается обработчиком разметки в Xamarin.Forms от синтаксиса обычного XAML.И это хорошо.
Это, пожалуй, одно из главных нареканий на то как языки и платформы позиционируются на рынке разными организациями – и это относится по сути ко всем компаниям. Они говорят -“Используйте код, который вы знаете”. Они говорят “Будет просто”. Но почему все не так? Мы не можем копировать код оптимизированный для некоторого языка одной платформы на другую. Мы даже не должны и *думать* об этом.
Итак, это не тот XAML о котором большинство из вас знает немало по предыдущим проектам. Но тем не менее, я могу сказать что я все равно весьма впечатлен. Несмотря на измененный синтаксис, написание кросс-платформенной XAML разметки остается достаточно интуитивной для людей знакомых с XAML. Имеется поддержка привязки (байндинга) данных, и я даже могу использовать мой любимый MVVM фреймворк MVVM Light.
Итак: что же МОЖНО использовать из ваших существующих знаний. Много чего. Я бы даже сказал что в итоге у вас получится приложение лучше, чем если бы вы использовали PhoneGap: приложения созданные Xamarin являются нативными приложениями, в то время как PhoneGap позволяет содавать приложения которые выполнятются внутри контейнера WebView.
Использовал бы я Xamarin для создания кросс-платформенных приложений в данный момент? Трудный вопрос. Это очевидно первая версия продукта, и многое еще не реализовано – например было бы весьма кстати иметь графический дизайнер, или поддержку Blend, что еще лучше. Но мне нравится направление, в котором развивается продукт. Поэтому я бы наверняка попробовал.
По сути, если вы разработчик Microsoft, то вы уже сейчас имеете возможность создавать кросс-платформенные нативные приложения с использованием XAML & C# для различных платформ.
И это очень большое дело.