Андрей Басков «Разработка кросс-платформенных...

Preview:

DESCRIPTION

http://mmeetup.ruhttp://touchin.ru

Citation preview

Разработка кроссплатформенных мобильных приложений на C#

Андрей БасковTouch Instinct

Кроссплатформенный миф

• С + POSIX• Java• HTML + CSS + JS

Особенности мобильных приложений

• Контент «на кончиках пальцев»• Короткие сессии• Плохой интернет• Медленные устройства

Нативный UI

• Привычен пользователю платформы• Работает быстро• Дает богатые возможности• На каждой платформе свой

Всеплатформенный UI

• Везде выглядит одинаково• Одинаково непривычен для всех

пользователей• Зачастую работает медленно• Не используются уникальные особенности

платформы

Текущие решения

• Appcelerator (ex Titanium) (Javascript)• PhoneGap (HTML5 + Javascript)• Unity (C#)• Flex (Dead)• Monotouch и Monodroid (С#)

Monotouch и Monodroid

• Построен на основе Mono• Язык C#• Есть Garbage Collector• Используются родные контроллы для

каждой платформы• Приложение компилируется в бинарный

код• Быстро работает

Почему мы любим C#

• Строгая типизация• Garbage Collector• Properties• Delegates, Events и лямбда-выражения• LINQ• Extension methods• Runtime Generics• Постоянно развивается

C# codevar context = CIContext.FromOptions (new CIContextOptions () { UseSoftwareRenderer = true});var ciImage = new CIImage (cgImage);var hueAdjustFilter = new CIHueAdjust { InputAngle = 3.0f * Math.PI, Image = ciImage,}; var colorControlsFilter = new CIColorControls { InputSaturation = 1.3f, InputBrightness = 0.3f, Image = hueAdjustFilter.OutputImage}; ciImage = colorControlsFilter.OutputImage;context.CreateImage (ciImage, ciImage.Extent);

Objective-C codeCIContext *context = [CIContext contextWithOptions: [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] forKey:kCIContextUseSoftwareRenderer]];CIImage *ciImage = [CIImage initWithCGImage:cgImage]; CIFilter *hueAdjustFilter = [CIFilter filterWithName:@"CIHueAdjust"];CIFilter *colorControlsFilter = [CIFilter filterWithName:@"CIColorControls"]; [hueAdjustFilter setValue:[NSNumber numberWithDouble:3.0 * M_PI] forKey:@"inputAngle"]; [colorControlsFilter setDefaults];[colorControlsFilter setValue:[NSNumber numberWithDouble:1.3] forKey:@"inputSaturation"];[colorControlsFilter setValue:[NSNumber numberWithDouble:0.3] forKey:@"inputBrightness"]; [hueAdjustFilter setValue:ciImage forKey:@"inputImage"];[colorControlsFilter setValue:[hueAdjustFilter valueForKey:@"outputImage"] forKey:@"inputImage"];ciImage = [colorControlsFilter valueForKey:@"outputImage"]; [context [createCGImage: ciImage fromExtent:[ciImage extent]]];

Основные подходы по созданию кроссплатформенных приложений

• Четкое разделение бизнес логики и UI• Отдельный проект под каждую платформу,

но ссылки на одни и те же файлы• #ifdef’ы для использования схожего

функционала, но с разной реализацией не каждой платформе

• Xamarin.Mobile

О взаимодействии с сервером

• SOAP (XML) – Must DIE!• JSON – лучше, но все равно есть оверхед• Наш выбор – бинарные протоколы

сериализации, с tcp или udp транспортом– BinarySerializer– Protobuf– Thrift

• Данные должны влезать в один MTU пакет(!)

Фигачим

• Простой чат работающий на iPhone, Android, (WP7) и в консоли

• Сервер на C#• Протокол общения – Thrift (Бинарная

сериализация + TCP)

Код!

Что сделали

• Формат данных для общения с сервером• Общий набор файлов с бизнес логикой• Реализацию сервера• UI для каждой из платформ использующий

общую бизнес логику

Что еще можно добавить

• Один набор Unit тестов для бизнес логики• Геолокацию• Адаптацию thrift под WP7

Windows Phone 7 vs MonoX

• В основе WP7 – Silverlight с урезанной BCL• В основе Monotouch и Monodroid – Mono с

полноценной BCL• Про это надо помнить

Как оно устроено

• В финальный package входит код приложения + те части BCL, которые вы используете + Runtime c GC

• В симуляторе обычная JIT компиляция• На девайсе AOT компиляция – на выходе

машинный код под armv6/armv7• Нельзя пользоваться Emit’ом, но можно

Reflection’ом

Недостатки

• Размер приложения • Сложно интегрировать стороние нативные

библиотеки (но можно)• Мало примеров, все равно нужно знать

родные языки• Для реально качественной разработки

нужно знать больше чем нативный девелопер

Coin Keeper

• Customer: i-Free • 1st Top Finance (Russia)• 2nd Top Paid (Russia)• 3rd Top Grossing (Russia)• 5th Top Finance US!• Average 4.5 stars• Still growing!• People love it

Promo Telephony Radio Trading

Finance Games

Спасибо за внимание!

Андрей БасковTouch Instinct

ab@touchinstinct.com@AndreyBaskov+7 906 278 60 87

Recommended