SlideShare a Scribd company logo
1 of 22
Разработка кроссплатформенных
 мобильных приложений на 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# code
var 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 code
CIContext *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

More Related Content

More from touchin

[Rifvrn] продажа бытовой техники через iPhone
[Rifvrn] продажа бытовой техники через iPhone[Rifvrn] продажа бытовой техники через iPhone
[Rifvrn] продажа бытовой техники через iPhone
touchin
 
[Design track] iPhone и бытовая техника
[Design track] iPhone и бытовая техника[Design track] iPhone и бытовая техника
[Design track] iPhone и бытовая техника
touchin
 
[Cstb13] ios android новые каналы дистрибуции видео контента
[Cstb13] ios android новые каналы дистрибуции видео контента[Cstb13] ios android новые каналы дистрибуции видео контента
[Cstb13] ios android новые каналы дистрибуции видео контента
touchin
 
[Oborot e-comerce] как продавать одежду через i phone
[Oborot e-comerce] как продавать одежду через i phone[Oborot e-comerce] как продавать одежду через i phone
[Oborot e-comerce] как продавать одежду через i phone
touchin
 
[Levelapp] как мы разрабатываем приложения
[Levelapp] как мы разрабатываем приложения[Levelapp] как мы разрабатываем приложения
[Levelapp] как мы разрабатываем приложения
touchin
 
мастер-класс продвижение мобильных приложений
мастер-класс продвижение мобильных приложениймастер-класс продвижение мобильных приложений
мастер-класс продвижение мобильных приложений
touchin
 
Владимир Макеевв «Проектирование интерфейса Android приложений»
Владимир Макеевв «Проектирование интерфейса Android приложений»Владимир Макеевв «Проектирование интерфейса Android приложений»
Владимир Макеевв «Проектирование интерфейса Android приложений»
touchin
 

More from touchin (7)

[Rifvrn] продажа бытовой техники через iPhone
[Rifvrn] продажа бытовой техники через iPhone[Rifvrn] продажа бытовой техники через iPhone
[Rifvrn] продажа бытовой техники через iPhone
 
[Design track] iPhone и бытовая техника
[Design track] iPhone и бытовая техника[Design track] iPhone и бытовая техника
[Design track] iPhone и бытовая техника
 
[Cstb13] ios android новые каналы дистрибуции видео контента
[Cstb13] ios android новые каналы дистрибуции видео контента[Cstb13] ios android новые каналы дистрибуции видео контента
[Cstb13] ios android новые каналы дистрибуции видео контента
 
[Oborot e-comerce] как продавать одежду через i phone
[Oborot e-comerce] как продавать одежду через i phone[Oborot e-comerce] как продавать одежду через i phone
[Oborot e-comerce] как продавать одежду через i phone
 
[Levelapp] как мы разрабатываем приложения
[Levelapp] как мы разрабатываем приложения[Levelapp] как мы разрабатываем приложения
[Levelapp] как мы разрабатываем приложения
 
мастер-класс продвижение мобильных приложений
мастер-класс продвижение мобильных приложениймастер-класс продвижение мобильных приложений
мастер-класс продвижение мобильных приложений
 
Владимир Макеевв «Проектирование интерфейса Android приложений»
Владимир Макеевв «Проектирование интерфейса Android приложений»Владимир Макеевв «Проектирование интерфейса Android приложений»
Владимир Макеевв «Проектирование интерфейса Android приложений»
 

Андрей Басков «Разработка кросс-платформенных мобильных приложений на C#»

  • 1. Разработка кроссплатформенных мобильных приложений на C# Андрей Басков Touch Instinct
  • 2. Кроссплатформенный миф • С + POSIX • Java • HTML + CSS + JS
  • 3. Особенности мобильных приложений • Контент «на кончиках пальцев» • Короткие сессии • Плохой интернет • Медленные устройства
  • 4. Нативный UI • Привычен пользователю платформы • Работает быстро • Дает богатые возможности • На каждой платформе свой 
  • 5. Всеплатформенный UI • Везде выглядит одинаково • Одинаково непривычен для всех пользователей • Зачастую работает медленно • Не используются уникальные особенности платформы
  • 6. Текущие решения • Appcelerator (ex Titanium) (Javascript) • PhoneGap (HTML5 + Javascript) • Unity (C#) • Flex (Dead) • Monotouch и Monodroid (С#)
  • 7. Monotouch и Monodroid • Построен на основе Mono • Язык C# • Есть Garbage Collector • Используются родные контроллы для каждой платформы • Приложение компилируется в бинарный код • Быстро работает
  • 8. Почему мы любим C# • Строгая типизация • Garbage Collector • Properties • Delegates, Events и лямбда-выражения • LINQ • Extension methods • Runtime Generics • Постоянно развивается
  • 9. C# code var 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);
  • 10. Objective-C code CIContext *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]]];
  • 11. Основные подходы по созданию кроссплатформенных приложений • Четкое разделение бизнес логики и UI • Отдельный проект под каждую платформу, но ссылки на одни и те же файлы • #ifdef’ы для использования схожего функционала, но с разной реализацией не каждой платформе • Xamarin.Mobile
  • 12. О взаимодействии с сервером • SOAP (XML) – Must DIE! • JSON – лучше, но все равно есть оверхед • Наш выбор – бинарные протоколы сериализации, с tcp или udp транспортом – BinarySerializer – Protobuf – Thrift • Данные должны влезать в один MTU пакет(!)
  • 13. Фигачим • Простой чат работающий на iPhone, Android, (WP7) и в консоли • Сервер на C# • Протокол общения – Thrift (Бинарная сериализация + TCP)
  • 15. Что сделали • Формат данных для общения с сервером • Общий набор файлов с бизнес логикой • Реализацию сервера • UI для каждой из платформ использующий общую бизнес логику
  • 16. Что еще можно добавить • Один набор Unit тестов для бизнес логики • Геолокацию • Адаптацию thrift под WP7
  • 17. Windows Phone 7 vs MonoX • В основе WP7 – Silverlight с урезанной BCL • В основе Monotouch и Monodroid – Mono с полноценной BCL • Про это надо помнить
  • 18. Как оно устроено • В финальный package входит код приложения + те части BCL, которые вы используете + Runtime c GC • В симуляторе обычная JIT компиляция • На девайсе AOT компиляция – на выходе машинный код под armv6/armv7 • Нельзя пользоваться Emit’ом, но можно Reflection’ом
  • 19. Недостатки • Размер приложения  • Сложно интегрировать стороние нативные библиотеки (но можно) • Мало примеров, все равно нужно знать родные языки • Для реально качественной разработки нужно знать больше чем нативный девелопер
  • 20. 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 
  • 21. Promo Telephony Radio Trading Finance Games
  • 22. Спасибо за внимание! Андрей Басков Touch Instinct ab@touchinstinct.com @AndreyBaskov +7 906 278 60 87