Xamarin je soubor technologií, které umožňují využít jednotný .NET kód, a ten nativně  kompilovat pro platformy Android, iOS a Windows. Představíme vám jej formou případové studie společnosti Riganti, která takto vytvořila aplikaci Invetoroid.


Vývoj multiplatformních mobilních aplikací v .NETu pomocí Xamarinu

V poslední době jsme v RIGANTI pro naše zákazníky napsali několik mobilních aplikací. Základním požadavkem byla podpora všech tří hlavních mobilních platforem, tedy Android, iOS a Windows Phone. U aplikace Inventoroid, kterou jsme dělali naposledy, jsme stáli před rozhodnutím, jakou cestou se vydat, protože psát tuto aplikaci zvlášť pro každou platformu a udržovat tři codebase nám nepřišlo příliš efektivní.

Jednou z možností, kterou jsme zvažovali, bylo použití PhoneGapu, nebo technologie na podobné bázi např. Telerik AppBuilder (dříve Icenium). Aplikace se v takovém případě píší v HTML, CSS a Javascriptu, a PhoneGap jen vytvoří nativní aplikaci, v níž jsou dodané HTML a Javascript soubory hostovány. Pomocí různých javascriptových knihoven je možné docílit vzhledu, který se velmi podobá nativnímu uživatelskému rozhraní na dané platformě, a můžete provádět i základní interakce s hardwarem telefonu, např. GPS nebo fotoaparátem atd. Tato cesta je výhodná v případě aplikací, které obsahují různé formuláře, tabulky, reporty atd., jelikož takové věci se v HTML dělají poměrně snadno. Problém nastane ve chvíli, kdy potřebujete pracovat s hardwarem a kdy vám nestačí základní funkce, které daná platforma umožňuje. Většinou je možné požadované funkce doimplementovat nativně pro každou platformu zvlášť a pomocí Javascriptu k nim přistupovat, ale v takovém případě už často ztrácíme výhodu oproti vývoji nativní aplikace pro každou platformu zvlášť.

Pokud je vám sympatičtější C# namísto HTML a Javascriptu, případně pokud by se aplikace v HTML dělala obtížně, lze použít Xamarin, což jsme udělali i my. Naše aplikace měla poměrně jednoduché uživatelské rozhraní, zato potřebovala pracovat s fotoaparátem a nestačil jí běžný scénář „spusť aplikaci Fotoaparát a až uživatel udělá fotku, předej ji zpět do naší aplikace“. Potřebovali jsme skenovat a rozpoznávat čárové kódy, zobrazovat v naší aplikaci v reálném čase, co fotoaparát vidí, a aby práce s aplikací byla pohodlná, museli jsme ještě nastavovat různé parametry fotoaparátu, například nastavit manuální ostření na určitou vzdálenost. Proto jsme použili Xamarin.

Xamarin je nástroj, který umožňuje C# kód překládat pro Android a pro iOS. Jedná se o placený produkt, každopádně při vývoji větší aplikace nebo dvou malých se tato investice ve většině případů vrátí. Jedním z lidí, kteří za Xamarinem stojí, je i Miguel de Icaza, duchovní otec Mona, a celý tento produkt má poměrně dobře našlápnuto.

clip_image002

V praxi vývoj v Xamarinu vypadá tak, že si nainstalujete doplněk do Visual Studia, který umožňuje vytvořit projekt pro Android a pro iOS. K vývoji pro Android je ještě nutné nainstalovat Android SDK, NDK, Javu a další závislosti. Vzhledem k tomu, že překlad .NET kódu pro iOS je poměrně komplikovaná záležitost a nedá se celá udělat na Windows, potřebujete k tomu ještě počítač s nainstalovaným Mac OS, na němž běží tzv. Build Host. Visual Studio se k němu připojí a kompilaci provádí na něm. Pokud potřebujete aplikaci ladit na iPhonu, připojíte ho k počítači s Mac OS a z Visual Studia můžete aplikaci do telefonu nasadit.

Xamarin umožňuje psát kód v C#, zároveň ale neodbourává specifika jednotlivých platforem. Mnoho věcí tedy není úplně sjednoceno a rozhodně nečekejte něco jako šablonu Universal App ve Visual Studiu – typicky budete mít pro každou platformu jeden projekt a sdílený kód bude v projektu typu Portable Library.

clip_image004

UI se aktuálně také píše pro každou platformu zvlášť, tj. pro Windows Phone klasicky v XAMLu, pro Android v XML a na iOS se uživatelské rozhraní staví z C# kódu. Xamarin obsahuje designer jak pro Android, tak pro iOS, ale v praxi pravděpodobně zjistíte, že je lepší si UI napsat ručně, stejně jako se to běžně dělá ve světě HTML či XAMLu.

Před několika dny byla uvedena nová verze Xamarinu, která obsahuje součást Xamarin Forms, jež by měla tyto rozdíly odbourávat a UI se konečně bude dát psát jednotně, přičemž Xamarin jej přeloží pro každou platformu tak, aby vypadalo podobně jako UI nativní. Měla by zde být kompletní podpora MVVM, což by značně usnadnilo práci, ovšem zatím jsme neměli příležitost to vyzkoušet. MVVM se dá využít i nyní pomocí projektu MVVM Cross, takže v jednodušších situacích jdou sdílet i viewmodely, nicméně vestavěné řešení bude pravděpodobně lepší.

Komunikace s hardwarem a další platformově specifické funkce se v Xamarinu řeší pomocí knihoven, které jsou interně naimplementovány pro každou platformu zvlášť. Dnes již existuje poměrně dost knihoven, takže v případě naší aplikace Inventoroid, která skenuje čárové kódy, nebyl problém najít knihovnu, která takovou věc řešila.

clip_image006

Už dnes se dají v Xamarinu aplikace vyvíjet poměrně pohodlně, během práce na Inventoroidu jsme našli několik bugů, nicméně všechny se daly nějak vyřešit či obejít. Do stavu, kdy napíšete jednu aplikaci a budete ji moci pustit na všech platformách, to má pochopitelně ještě velmi daleko, ale i tak vám Xamarin umožní velkou část kódu, jež obsahuje aplikační logiku, sdílet napříč všemi platformami, a zvlášť řešit jen to, co jinak nejde. K návrhu UI pro všechny platformy najednou jsem stejně trochu skeptický, jelikož každá platforma má své konvence a zvyklosti a i mezi Windows Store a Windows Phone aplikacemi najdeme mnoho rozdílů, navíc různé velikosti displeje vyžadují různé přístupy, takže je otázkou, jestli se s tímto Xamarin Forms poperou.

Každopádně u nás se Xamarin osvědčil a při příštím mobilním projektu jej určitě použijeme znovu.

clip_image008 clip_image010Ivtrd

Tomáš Herceg, Adam Lysák

RIGANTI s.r.o.


netcollegeV případě, že chcete Xamarin využít a potřebujete poradit, vyškolit programátory nebo konzultovat problémy v češtině, pak hledejte na www.dotnetcollege.cz
rigantiJestli chcete napsat na zakázku nějakou multiplatformní aplikaci, která bude běhat na Androidu, iOS i v prostředí Windows, kontaktujte Tomáše Hercega na www.riganti.cz.
dotnetportalPokud se chcete dozvědět více o .NET technologií v češtině, pak komunitní dotNETportal www.dotnetportal.cz je to správné místo, kde se můžete neformálně setkat dalšími vývojáři z ČR.

Buri