Зачем кросс-платформенность?
Везде используем универсальный инструмент
How does it work?
Performance
Вопросы?

Кросс-платформенная мобильная разработка

1.

/ DP Labs

2.

Артур
Дробинский
Ведущий архитектор
команды DP Labs
arturdr.ru
[email protected]

3. Зачем кросс-платформенность?

Зачем кроссплатформенность?

4. Везде используем универсальный инструмент

5.

Повторное использование кода
iOS
Core
Android

6.

iOS
Core
Android
Повторное использование кода

7.

Windows
Android
iOS
Core

8.

Проще поддержка – исправляем баги один
раз

9.

Дешевле!

10.

Кросс-платформенные решения

11.

12. How does it work?

13.

Cross-platform code

14.

Native .apk / .ipa / .exe (application package)
Cross-platform code

15.

Native .apk / .ipa / .exe (application package)
UI, Native controls
Native API
Cross-platform code

16.

Native .apk / .ipa / .exe (application package)
UI, Native controls
Native API
API Bridge
Cross-platform code

17.

18.

PhoneGap

19.

PhoneGap
Native .apk / .ipa / .exe (application package)
WebView
Native API
UI: HTML
Limited API Bridge
Code: JS

20.

Qt

21.

Qt/Unity
Native .apk / .ipa / .exe (application package)
View (Canvas)
Native API
UI: QML/Game Engine
Limited API Bridge
Code: C++/C#

22.

Xamarin
Native .apk / .ipa / .exe (application package)
Native Controls
Native API
API Bridge
Code: C#

23.

React Native
Native .apk / .ipa / .exe (application package)
Native Controls
Native API
API Bridge
JSX
Limited API Bridge
Code: V8, JS

24. Performance

25.

Математические вычисления
Android
iOS
94,151
100
100
67,291
10
10
4,342
5,014
4,258
1
4,349
1
Java
Cordova
Xamarin
Objective-C
Cordova
Xamarin

26.

SQLite: чтение данных
Android
1,2
iOS
1,6
1,117
1,494
1,4
1
1,2
0,8
1
0,601
0,6
0,8
0,551
0,792
0,735
0,6
0,4
0,4
0,2
0,2
0
0
Java
Cordova
Xamarin
Objective-C
Cordova
Xamarin

27.

Запуск приложения
Android
iOS
4,5
7
4,068
6,21
4
6
3,5
3,032
5
3
4
2,5
2
3
1,689
1,5
1,928
2
1,044
1
1,204
1,14
1
0,5
0
0
Java
Cordova
Xamarin
Xamarin.Forms
Objective-C
Cordova
Xamarin
Xamarin.Forms

28.

Размер приложения
Android
iOS
5000
4700
4500
18000
16900
16000
4000
14000
3500
12100
3500
12000
3000
10000
2500
8000
2000
6000
1500
4000
1000
500
2700
433
2000
644
166
0
0
Java
Cordova
Xamarin
Xamarin.Forms
Objective-C
Cordova
Xamarin
Xamarin.Forms

29.

Xamarin React Native Phonegap

30.

Xamarin React Native Phonegap

31.

32.

DEMO

33.

React Native

34.

Плюсы
Hype
Hot reloading + простое обновление приложений
Javascript
Встраивание в нативные приложения

35.

Минусы?
Breaking Changes
Second class android support
Javascript & TypeSafety
Animations are slow (bridge)
Неполная поддержка нативных контролов, ненативная
разметка

36.

Xamarin
Xamarin Forms
React Native

37.

Xamarin
Мифы или реальность?

38.

Утечки памяти
и особенности Garbage Collection

39.

Использование open-source контролов
UIKit.UIButton
(peer object)
API Bridge
UIButton
(native object)
Необходимо написание собственных API Bridge

40.

На Xamarin нет приложений

41.

easyJet
Slack
Credit Agricole

42.

React Native

43.

https://www.xamarin.com/customers/

44.

Минусы Xamarin (и ReactNative)
Размер приложения (6MB+)
Большее время запуска приложения
Использование open-sourced controls требует
поиска/написания обёртки

45.

Xamarin vs Native

46.

Xamarin
Native
Сложные Enterprise
приложения
Дублирование бизнес-логики
– не проблема (её мало)
Существующая команда
C# разработчиков
Бэкенд на .NET
Похожие экраны/workflow
на разных устройствах
Команда с опытом на Obj-C и
Java
Бэкенд на Java
Workflow на Android/iOS
радикально различный

47.

Xamarin vs React Native

48.

Xamarin
React Native
Сложная бизнес логика
UI-heavy apps
C#-команда
JS-команда
Использование всех
нативных возможностей
Компиляция,
производительность
Встраивание в нативные
приложения
Быстрое обновление
(AppStore, Google Play)
UWP + Mac (+ Web)
Задержка с новыми
фичами на платформах
(+ Web)
XAML + Native rendering +
Flexbox
Flexbox (but only flexbox)

49. Вопросы?

http://arturdr.ru
[email protected]

50.

<ListView ItemsSource="{Binding MonkeysGrouped}"
ItemTapped="Handle_ItemTapped" ItemSelected="Handle_ItemSelected"
HasUnevenRows="true" GroupShortNameBinding = "{Binding Key}"
IsGroupingEnabled = "true" GroupDisplayBinding = "{Binding Key}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Grid Padding="10" RowSpacing="10" ColumnSpacing="10">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<controls:CircleImage BorderColor="Aqua" BorderThickness="3"
HeightRequest="66"
HorizontalOptions="CenterAndExpand" Vertical`Options="CenterAndExpand"
Aspect="AspectFill" WidthRequest="66" Grid.RowSpan="2" Source="{Binding Image}"/>
<Label Grid.Column="1" Text="{Binding Name}"
VerticalOptions="End"/>
<Label Grid.Column="1"
Grid.Row="1"
VerticalOptions="Start"
Text="{Binding Location}"/>
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>

51.

<View style={[styles.container, {backgroundColor:
this.props.backgroundColor}]}>
<View style={styles.labelContainer}>
<Text style={labelStyles}> {this.state.maxValue} </Text>
</View>
<View style={styles.itemsContainer}>
<View style={[styles.polygonContainer, {borderColor:
this.props.borderColor}]}>
{this.renderBars()}
</View>
<View style={styles.itemsLabelContainer}>
{this.renderLabels()}
</View>
</View>
</View>

52.

=
Xamarin.Forms

53.

=
Xamarin.Forms
<
English     Русский Правила