Привет, Хабр! Сегодня расскажем вам о том, что пользователям нравится в 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 обладает рядом преимуществ и отлично подходит для масштабных проектов по разработке сложных с точки зрения архитектуры кросс-платформенных приложений, аналогичных нативным решениям.