Привет, Хабр! Сегодня расскажем вам о том, что пользователям нравится в Xamarin, нашем инструменте для кросс-платформенной разработки мобильных приложений. Кроме того, затронем и недостатки платформы. Кстати, под катом вы найдете много кода и показательные примеры, а не только текст с перечислением. Присоединяйтесь!

Статья подготовлена нашими партнерами, ребятами из EGO.
Xamarin — удобный набор инструментов для разработки кросс-платформенных мобильных приложений на C# с использованием .NET. Он поддерживает iOS, Android и Windows Phone.
Для разработки приложения на основе Xamarin вам не потребуется досконально знать специфические языки отдельных платформ. Кроме того, при работе с какой-либо платформой у вас будет полный доступ к возможностям ее пакета SDK и встроенным механизмам создания пользовательских интерфейсов.
Таким образом, Xamarin позволяет создавать приложения, которые почти не отличаются от нативных аналогов, а значит, вполне подходят для распространения через официальные магазины (например, Google Play и App Store).
Кроме того, по словам разработчиков Xamarin, готовое решение не будет существенно уступать и в плане производительности.
Рассмотрим составные части Xamarin.
В этой статье подробно описаны семь существенных причин использовать Xamarin для кросс-платформенной разработки.

Дополнительные материалы: сравнение Xamarin и PhoneGap.
На что в первую очередь следует обращать внимание при выборе платформы? Конечно, на сложность ее освоения. Вряд ли найдется много желающих тратить время на освоение особенностей синтакси��а (например, для достаточно уверенного владения Angular требуется изучать эту платформу как минимум несколько месяцев). Поэтому если создание качественного кода требует чрезвычайно серьезной подготовки, то многим новичкам попросту не удается в полной мере овладеть средой разработки. А вот начать работу с Xamarin совсем просто: вам не придется учить язык Xamarin или что-нибудь в таком духе.
Достаточно знать язык C# с его императивным стилем написания программ, свободно чувствовать себя в среде .NET и изучить несколько классов, связанных с конкретными платформами.
Источник.
Для создания полностью «родного» приложения для той или иной платформы вам потребуется в достаточной мере владеть языком Java (в случае Android) или Objective-C/Swift (для iOS). В некоторых случаях это может стать серьезным препятствием. Давайте посмотрим, как одна и та же задача, подразумевающая создание строки атрибутов, решается в Objective-C и в C#.
В Objective-C:
В C#:
Если вы не используете возможности кросс-платформенной разработки Xamarin, то для создания коммерческого проекта, который обладал бы достаточной производительностью на обеих платформах, может потребоваться применять сразу два разных подхода. А значит, и затраты практически удваиваются.
Исходя из описанных выше преимуществ можно отметить, что кросс-платформенная разработка с использованием Xamarin требует примерно в 1,5 раза меньше времени (и денег), чем создание отдельного специализированного проекта под каждую платформу.
Конечно, некоторые фрагменты кода (например, служебные компоненты) будут одинаковыми в обеих версиях, а часть других (в частности, бизнес-логика, не использующая специализированные функции пользовательского устройства) потребует лишь незначительных изменений. Однако общая ситуация немного сложнее. Некоторые компоненты вашего приложения неизбежно придется писать с нуля для каждой ОС. При создании и развертывании двух приложений для двух платформ практически всегда необходимо нанимать две команды разработчиков. При использовании Xamarin все гораздо проще:
благодаря не зависящим от платформы интерфейсам API прим��рно 70% кода будет написано в универсальном формате.
В этом примере класс MainPage использует интерфейс ITextToSpeech для выбора нужной функции на конкретной платформе:
Одна из основных причин, по которым разработчики избегают инструментов кросс-платформенной разработки, заключается в том, что такие средства не позволяют пользоваться всем спектром возможностей конкретных сред. В первую очередь это относится к дизайну (Flat Design в iOS, Material Design в Android) и к интеллектуальным возможностям пользовательских устройств (доступ приложения к контактам, камере, данным GPS и т. п.).
Конечное кросс-платформенное решение не будет обладать высокой производительностью (этот недостаток присущ практически все�� приложениям, созданным с помощью кросс-платформенных веб-инструментов) и не сможет пользоваться преимуществами конкретных платформ (а это значит, что некоторые возможности, изначально запланированные создателем проекта, могут быть реализованы не полностью).
Однако все иначе при использовании инструментов Xamarin для кросс-платформенной разработки «родных» приложений. В этом случае вы не столкнетесь с вышеописанными проблемами. Разработчикам доступны не только стандартные классы .NET: они могут с легкостью подключить и классы, поддерживаемые конкретной мобильной платформой (они содержатся в библиотеках C# для Xamarin.Android и Xamarin.iOS соответственно). Это значит, что при использовании Xamarin для разработки приложений под iOS и Android в вашем распоряжении будет весь набор возможностей этих платформ. При этом не потребуется использовать сторонние (и обычно платные) инструменты.
Тестирование продукта, который готовится к выпуску, — задача нетривиальная, особенно когда речь идет о платформе Android. Форматы экранов пользовательских устройств iOS четко определены и известны заранее, а вот устройства Android бывают самыми разными. Если приложение не было протестировано на определенном устройстве, его интерфейс в некоторых случаях может «разъехаться». Создатели Xamarin предложили решение для этой проблемы.
В частности, для пользователей платформы также доступна среда Test Cloud, позволяющая эмулировать более 2000 устройств. Это решение не бесплатно, но затраты на него будут оправданы.

Дополнительные материалы: девять лучших инструментов тестирования мобильных приложений для iOS и Android.
Если вы хотите, чтобы ваше приложение получало данные о местоположении пользователя, показания гироскопа, акселерометра или других встроенных датчиков, то Xamarin станет отличным выбором.
Эта среда разработки полностью совместима с устройствами IoT (например, с Estimote), позволяющими получать данные о местоположении, а значит, вам не придется настраивать интеграцию со сторонними решениями (тем более что такой возможности не будет в принципе).
Для Xamarin доступна отлично организованная документация с практическими примерами, фрагментами кода и пошаговыми инструкциями.
Разумеется, на некоторые вопросы найти ответ в ней не получится. В этом случае вам поможет онлайн-сообщество. Существует два официальных сообщества Xamarin: на официальном сайте платформы и на портале StackOverflow.
Если и здесь вам не удалось получить интересующую информацию (некоторые разработчики жалуются, что эксперты сообществ не очень активны), вы можете обратиться в частную службу технической поддержки, доступную для обладателей бизнес-лицензий Xamarin. Специалисты ответят вам уже через несколько часов и предложат не просто набор стандартных процедур, которые редко помогают полностью устранить проблему, а подробные пошаговые инструкции по решению именно вашей задачи.
Практически в каждой ИТ-компании есть развитая инфраструктура используемого ПО на платформе Windows.
Для всех редакций Visual Studio (для Mac OS и Windows) с весны 2016 года в рамках подписки предоставляется и Xamarin. Если вы уже используете Visual Studio для разработки, вносить дополнительную оплату не потребуется.
Мы постарались подробно рассказать о сильных сторонах Xamarin и рассмотрели ряд его очевидных преимуществ. Однако нам бы хотелось сделать этот обзор более объективным, так что обратимся к слабым сторонам решения. На самом деле внимания заслуживает лишь один недостаток: размер приложений, написанных с помощью Xamarin, обычно немного превышает объем нативных аналогов. Тем не менее оптимизация никогда не бывает лишней.
Xamarin обладает рядом преимуществ и отлично подходит для масштабных проектов по разработке сложных с точки зрения архитектуры кросс-платформенных приложений, аналогичных нативным решениям.

Статья подготовлена нашими партнерами, ребятами из EGO.
Xamarin — удобный набор инструментов для разработки кросс-платформенных мобильных приложений на C# с использованием .NET. Он поддерживает iOS, Android и Windows Phone.
Для разработки приложения на основе Xamarin вам не потребуется досконально знать специфические языки отдельных платформ. Кроме того, при работе с какой-либо платформой у вас будет полный доступ к возможностям ее пакета SDK и встроенным механизмам создания пользовательских интерфейсов.
Таким образом, Xamarin позволяет создавать приложения, которые почти не отличаются от нативных аналогов, а значит, вполне подходят для распространения через официальные магазины (например, Google Play и App Store).
Кроме того, по словам разработчиков Xamarin, готовое решение не будет существенно уступать и в плане производительности.
Рассмотрим составные части Xamarin.
- Xamarin.IOS — библиотека классов C#, предоставляющая разработчикам доступ к пакету SDK для iOS.
- Xamarin.Android — библиотека классов C#, предоставляющая разработчикам доступ к пакету SDK для Android.
- Компилятор C#.
- .NET Framework.
- Инструменты IDE (встроены в Visual Studio для Mac OS и Windows).
В этой статье подробно описаны семь существенных причин использовать Xamarin для кросс-платформенной разработки.

Дополнительные материалы: сравнение Xamarin и PhoneGap.
1. Простота освоения
На что в первую очередь следует обращать внимание при выборе платформы? Конечно, на сложность ее освоения. Вряд ли найдется много желающих тратить время на освоение особенностей синтакси��а (например, для достаточно уверенного владения Angular требуется изучать эту платформу как минимум несколько месяцев). Поэтому если создание качественного кода требует чрезвычайно серьезной подготовки, то многим новичкам попросту не удается в полной мере овладеть средой разработки. А вот начать работу с Xamarin совсем просто: вам не придется учить язык Xamarin или что-нибудь в таком духе.
using Xamarin.Forms;
RootPage.Children.Add(new ContentPage
{
Content = new Label
{
Text = "Sketches in Forms",
BackgroundColor = Color.Yellow,
TextColor = Color.Blue,
Font = Font.SystemFontOfSize(NamedSize.Large),
VerticalOptions = LayoutOptions.CenterAndExpand,
HorizontalOptions = LayoutOptions.CenterAndExpand,
}
});Достаточно знать язык C# с его императивным стилем написания программ, свободно чувствовать себя в среде .NET и изучить несколько классов, связанных с конкретными платформами.
using System.Diagnostics;
using Foundation;
using UIKit;
namespace NeonPlayerConcept.iOS
{
[Register("AppDelegate")]
public class AppDelegate : UIApplicationDelegate
{
public override UIWindow Window { get; set; }
public static void Main(string[] args)
{
UIApplication.Main(args, null, "AppDelegate");
}
}
}Источник.
Для создания полностью «родного» приложения для той или иной платформы вам потребуется в достаточной мере владеть языком Java (в случае Android) или Objective-C/Swift (для iOS). В некоторых случаях это может стать серьезным препятствием. Давайте посмотрим, как одна и та же задача, подразумевающая создание строки атрибутов, решается в Objective-C и в C#.
В Objective-C:
CFStringRef stringKeys[] *
{
kCTFontAttributeName,
kCTForegroundColorAttributeName
};
CFTypeRef stringValues[] *
{
myListFontRef,
COColorGetConstantColor(kCOColorWhite)
};
attr = CFDictionaryCreate (kCGAllocatorDefault,
(const void **) &stringKeys,
(const void **) &stringValues,
sizeof(stringKeys) / sizeof(stringKeys[0]),
&kCFTypeDictionaryKeyCallbacks,
&kCFTypeDictionaryValueCallbacks);
astr = CFAttributedStringCreate(kCFAllocatorDefault, CFSTR(“Hello from ego team!”), attr);В C#:
var stringAttributes = new CFStringAttributes
{
Font = myFont,
ForegroundColor = UIColor.White.CGColor
};
var myString = new NSAttributedString (“Hello from EGO team!”, attrs);Если вы не используете возможности кросс-платформенной разработки Xamarin, то для создания коммерческого проекта, который обладал бы достаточной производительностью на обеих платформах, может потребоваться применять сразу два разных подхода. А значит, и затраты практически удваиваются.
2. Снижение расходов на проект
Исходя из описанных выше преимуществ можно отметить, что кросс-платформенная разработка с использованием Xamarin требует примерно в 1,5 раза меньше времени (и денег), чем создание отдельного специализированного проекта под каждую платформу.
Конечно, некоторые фрагменты кода (например, служебные компоненты) будут одинаковыми в обеих версиях, а часть других (в частности, бизнес-логика, не использующая специализированные функции пользовательского устройства) потребует лишь незначительных изменений. Однако общая ситуация немного сложнее. Некоторые компоненты вашего приложения неизбежно придется писать с нуля для каждой ОС. При создании и развертывании двух приложений для двух платформ практически всегда необходимо нанимать две команды разработчиков. При использовании Xamarin все гораздо проще:
благодаря не зависящим от платформы интерфейсам API прим��рно 70% кода будет написано в универсальном формате.
В этом примере класс MainPage использует интерфейс ITextToSpeech для выбора нужной функции на конкретной платформе:
ITextToSpeech.cs:
public interface ITextToSpeech
{
void Speak (string text);
}
TextToSpeech_Android.cs:
[assembly: Dependency (typeof (TextToSpeech_Android))]
namespace UsingDependencyService.Android
{
public class TextToSpeech_Android : Java.Lang.Object, ITextToSpeech
{
TextToSpeech speaker;
string toSpeak;
public TextToSpeech_Android () {}
public void Speak (string text)
{
\\Android-specific code
}
}
}
TextToSpeech_iOS.cs:
[assembly: Dependency (typeof (TextToSpeech_iOS))]
namespace UsingDependencyService.iOS
{
public class TextToSpeech_iOS : ITextToSpeech
{
TextToSpeech speaker;
string toSpeak;
public TextToSpeech_Android () {}
public void Speak (string text)
{
… \\iOS-specific code
}
}
}
MainPage.cs:
public class MainPage : ContentPage
{
public MainPage []
{
var speak = new Button
{
Text = “Hello, world!”,
VerticalOptions = LayoutOptions.CenterAndExpand,
HorizontalOptions = LayoutOptions.CenterAndExpand,
};
speak.Clicked += (sender, e) =>
{
DependencyService.Get<ITextToSpeech>().Speak("Hello from Xamarin Forms");
};
Content = speak;
}
}3. Возможность создавать пользовательские интерфейсы, подобные «родным»
Одна из основных причин, по которым разработчики избегают инструментов кросс-платформенной разработки, заключается в том, что такие средства не позволяют пользоваться всем спектром возможностей конкретных сред. В первую очередь это относится к дизайну (Flat Design в iOS, Material Design в Android) и к интеллектуальным возможностям пользовательских устройств (доступ приложения к контактам, камере, данным GPS и т. п.).
Конечное кросс-платформенное решение не будет обладать высокой производительностью (этот недостаток присущ практически все�� приложениям, созданным с помощью кросс-платформенных веб-инструментов) и не сможет пользоваться преимуществами конкретных платформ (а это значит, что некоторые возможности, изначально запланированные создателем проекта, могут быть реализованы не полностью).
Однако все иначе при использовании инструментов Xamarin для кросс-платформенной разработки «родных» приложений. В этом случае вы не столкнетесь с вышеописанными проблемами. Разработчикам доступны не только стандартные классы .NET: они могут с легкостью подключить и классы, поддерживаемые конкретной мобильной платформой (они содержатся в библиотеках C# для Xamarin.Android и Xamarin.iOS соответственно). Это значит, что при использовании Xamarin для разработки приложений под iOS и Android в вашем распоряжении будет весь набор возможностей этих платформ. При этом не потребуется использовать сторонние (и обычно платные) инструменты.
4. Оптимальные условия для тестирования
Тестирование продукта, который готовится к выпуску, — задача нетривиальная, особенно когда речь идет о платформе Android. Форматы экранов пользовательских устройств iOS четко определены и известны заранее, а вот устройства Android бывают самыми разными. Если приложение не было протестировано на определенном устройстве, его интерфейс в некоторых случаях может «разъехаться». Создатели Xamarin предложили решение для этой проблемы.
В частности, для пользователей платформы также доступна среда Test Cloud, позволяющая эмулировать более 2000 устройств. Это решение не бесплатно, но затраты на него будут оправданы.

Дополнительные материалы: девять лучших инструментов тестирования мобильных приложений для iOS и Android.
5. Идеальная совместимость с устройствами «Интернета вещей»
Если вы хотите, чтобы ваше приложение получало данные о местоположении пользователя, показания гироскопа, акселерометра или других встроенных датчиков, то Xamarin станет отличным выбором.
private void Instance_Ranged(object sender,
System.Collections.Generic.IEnumerable<IBeacon> e)
{
Try
{
var data = string.Empty;
foreach (var beacon in e)
{
data = $@”region id: {beacon}
}
_labelContent.Text = data;
LogStatus(@”Ranged”);
}
catch (Exception exception)
{
LogStatus(exception.ToString());
}
}Эта среда разработки полностью совместима с устройствами IoT (например, с Estimote), позволяющими получать данные о местоположении, а значит, вам не придется настраивать интеграцию со сторонними решениями (тем более что такой возможности не будет в принципе).
6. Качественная документация и большое сообщество
Для Xamarin доступна отлично организованная документация с практическими примерами, фрагментами кода и пошаговыми инструкциями.
Разумеется, на некоторые вопросы найти ответ в ней не получится. В этом случае вам поможет онлайн-сообщество. Существует два официальных сообщества Xamarin: на официальном сайте платформы и на портале StackOverflow.
Если и здесь вам не удалось получить интересующую информацию (некоторые разработчики жалуются, что эксперты сообществ не очень активны), вы можете обратиться в частную службу технической поддержки, доступную для обладателей бизнес-лицензий Xamarin. Специалисты ответят вам уже через несколько часов и предложат не просто набор стандартных процедур, которые редко помогают полностью устранить проблему, а подробные пошаговые инструкции по решению именно вашей задачи.
7. Безупречная интеграция с Microsoft Windows
Практически в каждой ИТ-компании есть развитая инфраструктура используемого ПО на платформе Windows.
Для всех редакций Visual Studio (для Mac OS и Windows) с весны 2016 года в рамках подписки предоставляется и Xamarin. Если вы уже используете Visual Studio для разработки, вносить дополнительную оплату не потребуется.
Недостатки Xamarin
Мы постарались подробно рассказать о сильных сторонах Xamarin и рассмотрели ряд его очевидных преимуществ. Однако нам бы хотелось сделать этот обзор более объективным, так что обратимся к слабым сторонам решения. На самом деле внимания заслуживает лишь один недостаток: размер приложений, написанных с помощью Xamarin, обычно немного превышает объем нативных аналогов. Тем не менее оптимизация никогда не бывает лишней.
Итак, насколько эффективен Xamarin?
Xamarin обладает рядом преимуществ и отлично подходит для масштабных проектов по разработке сложных с точки зрения архитектуры кросс-платформенных приложений, аналогичных нативным решениям.
