Слайд 2C#? Доклад проплачен?
Да! (на самом деле нет ☹)
Лямбда-выражения, делегаты, евенты
LINQ
Properties
Generics
Структуры
dynamic
В С# 5
async/await (ммм как сладко)
Слайд 3Асинхронный код раньше
MyApi.OnSomeMethod += () => {
InvokeOnMainThread( (result) => {
textView.Text = result;
});
}
MyApi.SomeMethodAsync();
Слайд 4async/await
textView.Text = await MyApi.GetUrlAsync(
“http://touchin.ru”);
Слайд 5С# vs Objective-C
Objective-C:
// …
[button addTarget:self action:@selector(touchHandler:) forControlEvents:UIControlEventTouchUpInside];
// …
-(void) touchHandler:(id)sender {
textView.text = @"some
text";
}
Слайд 6С# vs Objective-C
C#:
btn.TouchUpInside += (sender, e) => {
textView.Text = "Clicked!";
} ;
Слайд 7C# vs Java
Java:
button.setOnClickListener(
new View.OnClickListener() {
public void onClick(View v) {
textView.setText(“Clicked”);
}
}
);
Слайд 8C# vs Java
C#:
button.Click += (sender, e) {
textView.Text = “Clicked!”;
} ;
Слайд 9C# vs {0}
Проще
Чище
Развивается очень быстро
Меньше скобочек (но еще не Ruby/Python)
Из Java песок
сыплется
[[[[После Objective-C] мир: квадратный] как:очень] ивесь: вдвоеточиях];
Слайд 11Mono
Свободная реализация стандарта ECMA-334 (C#) и ECMA-335 (CLI)
Развивается с 2004 года
Основатель –
Miguel de Icaza (GNOME, Ximian, Midnight Commander, WINE)
Исходники, комьюнити, все как у людей
На данный момент поддерживается C# 4.0 и большая часть BCL
Слайд 12Xamarin
Ximian -> Novell -> Attachmate -> Xamarin
Продает и саппортит Monotouch + Mono
for Android
Цены от 399$ за лицензию
На сайте отличные туториалы, документация, исходники типичных приложений
Выпущено 4 книги
https://github.com/xamarin/monotouch-samples
Слайд 13Ах, да, представиться ☺
1.5 года опыта разработки с Monotouch
Своя компания разрабатывающая мобильные
приложения для iOS, Android, WP7
Активно используем Monotouch, Mono for Android, Mono
Наши приложения попадают в топы AppStore и Google Play
Шарим код, пишем правильные архитектуры
Нам уже год, 17 человек, Kinect, бинбегги, массажистки, блекджек
Слайд 14Что же такое Monotouch
Mono framework с AOT компиляцией для ARM процессоров и
Bindings к родным API
Код пишется на C#
UI используется родной, через C# обертки
C#-зированный API (евенты, проперти, енумы)
Среда разработки Monodevelop + XCode
Слайд 15Процесс компиляции
Компилируется ваш код, библиотеки, BCL, обертки над нативными методами в IL
Теоретически
можно юзать любой язык (F#, IronPython, IronRuby, Nemerle, VB для особенных)
IL преобразуется в машинный код с использованием AOT компиляции
К коду приложения добавляется Mono Runtime с Garbage Collector’ом и всем остальным
Слайд 16AOT vs JIT
Обычно в .Net и Mono машинный код генерируется в момент
запуска – Just In Time компиляция
В iOS нельзя компилировать код на лету, только статическая линковка
Но мы заранее знаем архитектуру (ARM) поэтому можно компилировать код заранее – Ahead Of Time компиляция
Слайд 17Ограничения AOT
Нету Emit, но Reflection остается
Некоторые специфичные конструкции работать не будут, т.к.
компилируются на лету
Generic Virtual Methods
P/Invokes in Generic Types
Некоторые LINQ expressions
Слайд 18Linking
В момент компиляции в IL из BCL берется только тот код, который
реально используется
Таким же образом можно вырезать неиспользуемый код в своих либах
Нужно для уменьшения размеров приложения
Слайд 19C#-изация API
Подписка на евенты
Установка свойств
Привычные названия
var btn = new UIButton(new RectangleF(0, 0,
200, 80));
btn.Enabled = true;
btn.SetTitleColor(UIColor.FromRGB(255, 255, 0), UIControlState.Selected);
btn.TouchUpInside += delegate {
// your code
} ;
window.Add(btn);
Слайд 20Обертки над нативными методами
Monotouch:
Все сводится к P/Invoke метода objc_msgSend c нужными
параметрами
См код Monotouch.ObjcRuntime.Messaging
Mono for Android:
Используется JNI (Java Native Interface)
Слайд 21Обертки над нативными методами
public virtual bool Enabled
{
[Export("isEnabled")]
get
{
// …
return Messaging.bool_objc_msgSend(base.Handle, UIControl.selIsEnabled);
}
[Export("setEnabled:")]
set
{
// …
Messaging.void_objc_msgSend_bool(base.Handle, UIControl.selSetEnabled_,
value);
}
}
Слайд 22Структура приложения
Практически соответствует такой же у нативного приложения
AppDelegate, UIWindows, ViewControllers
Для описания UI
также используются nib файлы
Слайд 23Дебаг
Вместе с дебаг сборкой идет вся отладочная инфа + механизм удаленного дебага
Раньше
был по Wi-Fi сейчас по USB (быстрее)
Дебаг полноценный с breakpoint’ами watch’ами итд
Слайд 24Garbage Collector
Работает ☺
Агрессивен – может часто вызываться
Не забывайте – локальная переменная, значит
обязательно соберется сборщиком
Говорят что в играх, если много объектов может подтормаживать (актуально для Unity скорее)
Слайд 27Интеграция со сторонними либами
P/Invoke для С кода
btouch для Objective-C Bindings
В первый раз
сложно, а потом халява
Есть готовые обертки для популярных либ: Google Analytics, Flurry и др.
Слайд 28Минусы
Размер (минимум 2-3Мб)
Рантайм идет с каждым приложением
Производительность (но не критично)
Все равно придется
учить UIKit/Android UI
Слайд 29Плюсики
Код шаринг (но не забываем про ограниченный WP7)
Не надо учить Objective-C (на
самом деле нет)
Проще разрабатывать (на самом деле быстрее)
Слайд 30А что на практике
А на практике вполне себе хорошо
CoinKeeper (iOS + Android
+ сервер) - удобная архитектура, сокращение кода, багов, времени разработки
Наш супер [SecretProject] - тоже все пучком
Omlet.ru – 2 недели на аппы под iPad и Android, код шаринг на уровне АПИ, быстро реагировали на изменение АПИ
Слайд 31Mono for Android
Почти тоже самое, за исключением:
JIT комплиция, можно EMIT (на андройде
вообще все можно, порно, смс вирусы, убиение младенцев)
Одновременно живут две машины Mono VM и Dalvik VM
GREFs
Начиная с Android 1.6
Свой редактор UI в Monodevelop (alpha)
Слайд 32Кроссплатформенность
Шаринг в районе 30-60 процентов кода
В основном работа c АПИ, с локальной
базой, внутренняя бизнес логика
UI все равно переписывается
Xamarin.Mobile объединяющий основной мобильный функционал (фото, геолокация)
Есть различные MVC фреймворки
Слайд 33Делайте хорошую архитектуру!
Четкое разеделение кода логики и UI
Unit test’ы (на девайсе тоже
– TouchUnit)
Выносим все что можно, делаем общие методя для стандартных операций (Alert, InvokeOnMainThread итд)
Слайд 34Xobot OS
Android переписанный на С#
Быстрее обычного андройда из-за особенностей C#
Просто концепт
Слайд 36Конкуренты
Appcelerator
PhoneGap
Unity (тоже на Mono работает)