йсь контейнер, який для користувача виглядає як нативне додаток. Мінуси цих фреймворків:
Чи не маєте доступу до нативним елементам UI. Тобто навіть якщо ви хочете використовувати стандартну кнопку «Назад» для iPhone, ви повинні її намалювати і зверстати.
Урізаний і узагальнений API для роботи з платформою.
Такий додаток фізично запускається всередині браузера телефону (точніше всередині контролю WebView). (низька продуктивність) .основан на open-source реалізації платформи .NET -Mono. Ця реалізація включає в себе власний компілятор C #, середовище виконання, а так само основні .NET бібліотеки. Мета проекту - дозволити запускати програми, написані на C #, на операційних системах, відмінних від Windows-Unix-системах, Mac OS та інших. Важливо, що розробкою Xamarin займаються ті ж люди, що і розробкою Mono. (рис 8)
Рис. 8Xamarin
З погляду виконання додатків між iOS і Android є одне ключове відмінність - спосіб їх попередньої компіляції. Як відомо, для виконання додатків в Android використовується віртуальна Java-машина Dalvik. Нативні додатки, які пишуться на Java, компілюються в якийсь проміжний байт-код, який інтерпретується Dalvik`ом в команди процесора в момент виконання програми (т.е. Аналогічно тому, як працює CLRв .NET). Це так звана Just-in-time компіляція (компіляція на льоту). У iOS використовується інша модель компіляції -Ahead-of-Time (компіляція перед виконанням). Xamarin враховує це розходження, надаючи окремі компілятори для кожної з цих платформ, які дозволяють на виході отримувати справжні, нативні додатки, які виконуються поза контекстом браузера і можуть використовувати всі апаратні і програмні ресурси платформи. (ріс9)
Рис. 9 Компіляція
Для iOS ситуація проста - ніякої віртуальної машини немає і програмний код повинен бути просто заздалегідь скомпільований в машинний. Для цієї мети використовується AOT компілятор Mono.
Для Android цікавіше. При компіляції додатка відбувається переклад коду на C # в проміжний байт-код, зрозумілий віртуальній машині Mono і сама ця віртуальна машина також додається в упаковане додаток. І Mono і Dalvik написані на Сі і працюють поверх ядра Linux. При запуску програми на Android обидві віртуальні машини починають працювати пліч-о-пліч і обмінюються даними через спеціальний механізм wrapper`.
Про бібліотеки на прикладі Xamarin.iOS (Monotouch).
Бібліотека класів Monotouch.dll надає доступ до всіх можливостей iOS SDK. Для розробника - це просто набір C # -класів з хорошою анотацією. Усередині ці класи використовують розроблені інженерами Xamarin механізми Біндінга на нативні класи та методи. Важливо, що цей же механізм можна використовувати для Біндінга будь-яких бібліотек, написаних на objective-c. Більшість класів і методів називаються так само, як в оригінальному iOS SDK, хоча бувають винятки (в цьому випадку доводиться використовувати пошук в документації Xamarin за оригінальною назвою, тому що воно фігурує в атрибутах Біндінга). У класах активно використовується механізм C # event`ов, що дозволяє писати красивий і компактний код обробників з використанням лямбда-виразів:
button.TouchUpInside +=(s, o)= gt; {.Text= Laquo; Hello! Raquo ;;
};
Та й у цілому код, написаний, на C # виглядає набагато читабельності і приємніше. Подивіться різницю на прикладі коду, що створює рядок з атрибутами:
Для асинхронної розробки Xamarin надає можливість використовувати як класи з простору імен System.Threading.Thread і System.Threading.ThreadPool, так і повний спектр можливостей, що надаються TaskParallelLibrary.
Обмеження
Обмеження в Xamarin.iOS пов'язані в основному з тим, що в iOS, як було сказано вище, на відміну від .NET і Mono немає віртуальної машини. Тому виникають труднощі з підтримкою Generic. Причина ясна - на компілятор лягає завдання проаналізувати код і визначити всі можливі конкретизації в тому чи іншому класі і методі. Звідси виникають такі обмеження:
Не рекомендується використовувати VirtualGeneric методи, т.к компілятор не всесильний і може не врахувати всі можливі варіанти використання;
Не можна створювати Generic-спадкоємців від класу NSObject, який є базовим в ієрархії Objective-C. Досить серйозне обмеження, яке може деяким чином зіпсувати вашу струнку і красиву архітектуру.
Інші обмеження, наприклад, відсутність підтримки динамічної генерації коду.
Розробка UI
Для кожної платформи Xamarin надає можливість використовувати...