4. Instant Platform API access
Third party libraries
Great user experience
Pros:
Cons:
TWO DIFFERENT APPLICATIONS
TWO DIFFERENT TEAMS
TWICE NUMBER OF BUGS
6. Portability
It is just JavaScript, HTML5, CSS3
Re-use the codebase from WebApplication
WebView
Usually poor performance
Bad user experience
7. Requires C#
Runs on Mono VM
Stable with good community
Supported by Microsoft
Xamarin 2.0 was released in February 2013
8. Dart language
Reactive framework
Supported by Google
Flutter
Still beta
43. • Get the configuration from server
• Through the bridge pass this configuration to
Native Module
• Once library is initialized emit events like new
incoming call
PjSIP binding for React Native
44. Call Native code from JavaScript
import {NativeModules} from 'react-native';
NativeModules.PjSipModule.methodName(configuration, (successful, data) => {
// …
});
59. • Removed since 0.44.3
• Pure JS implementation
• Lack of native look and feel
• Poor performance between screen
change
Navigator
60. Native implementation
Different React roots for each Screen
Great UX and cool features
Non-trivial installation and further RN
upgrades
Still doesn’t cover all props and APIs
that platform has
wix/react-native-navigation
Работал в компании где мне удалось поучаствовать в главной роли разработчиком на React Native
Поделится опытом разработки приложения на React Native
Было готовое приложение под веб и десктопы
Мобильное приложение похожее на скайп или другой мессенджер где упор идет на интерграцию с телефонной системой компании и CRM системами
Рассмотреть Native Approach
Для Android’a используется Java для iOS – Swift
Вы можете использовать очень большую базу уже готовых компонентов которые работают ефективно в соответствии с гайдлайнами платформы
Если разобраться не важно как ты скажешь платформе какие компоненты создавать
Для Андройда - XML файл, но так же ты можешь не использовать LayoutInflater и в java коде создать новый екземпляр компонента, тоже самое для iOS
Если java может сказать платформе как создать компонент то это может сделать любой язык программирования ведь практически все они быстрые
В java есть JIT, но так же и в JavaScript есть JIT компилятор
И если ваш код будет написан на одном языке но для каждой платформы будут создаватся разные компоненты то вы получите большое преимущество в обьеме кода для вашей бизнес логики
Так же Вам не придется разбираться в деталях языка программирования для платформы
На данный момент лидируют четыре технологии – и в каждой есть свои плюшки и ньюансы
UX остается бытсрым потому что по факту он остается нативным
Преимущество сразу видно, ты можешь сделать один интерфейс и при помощи CSS стилей изменить отображение для iOS / Android
Но UX чюжеродный - пользователь заходит в приложение и сразу замечает что что то не так
Честная крос—платформенная разработка
Это знакомые всем технологии – не нужно разбираться в чем то новом
Можно даже использовать код из веб приложения
Написать hello world занимает 15 минут
Когда начинал делать приложение скоуп доступных фреймворков ограничивался WebView или Native реализацией
Раньше участвовал в разработке мобильного приложения под Android и гибридного приложения на WebView
Преимущество сразу видно, ты можешь сделать один интерфейс и при помощи CSS стилей изменить отображение для iOS / Android
Первая проблема это перформанс, кнопки не реагируют так же быстро как в других приложениях, жесты так работают по другому
Если на проблемы с отзывчивастью не являются настолько важными, то в следующее во что вы упретесь – верстка веб компонентов что бы они удоретворяли гайдлайны к дизайну этой платформы
It's worth noting that we're not chasing “write once, run anywhere.” Different platforms have different looks, feels, and capabilities, and as such, we should still be developing discrete apps for each platform, but the same set of engineers should be able to build applications for whatever platform they choose, without needing to learn a fundamentally different set of technologies for each.
Мы ведь все знаем как строить веб-приложения, и не обязательно они проще чем тоже приложение на мобильном устройстве
Но нету возможности переиспользовать эфективно этот накопленный опыт – все отличается, Checkbox > Swipe
Вкратце что такое React Native
React – декларативный UI в мобильном приложении!
Flexbox – хорошо себя зарекомендовал в вебе, и если посмотреть на устройство лейаутов Android / iOS то они абсолютно разные, “а кто хочет заниматься изучением еще одного велосипеда”
JavaScript VM сам по себе не знает как работать с сетью которая нужна для полноценной работы бизнес логики
Что бы сделать Hello Worlds приложение на реакт натив достаточно написать следующий код
Подход для декларации компонентов один
В веб приложении что бы наш абстрактные компоненты VirtualDOM отобразить на странице нужен react-dom
Библиотека которая из VDOM сделает уже валидный HTML
В react-native для разных платформ используется платформо зависимый код который создаст нужный компонент именно в этой платформе
React-dom как и react-native является библиотекой которая из VirtualDOM уже создает UI компоненты которые показывается на экране
Рендереров на самом деле много и проблема ручных мутаций компонентов касаются не только веб приложений
Что бы начать разрабатывать нужна всего одна команда для генерации проекта
Не нужно заморачиваться с веб паком
Сгенерирует код для Android & iOS
Небольшой скрин из платформо независимых компонентов на разных платформах создает разные компоненты, с механикой и стилями этой платформы
Разные шрифты
Разный стиль кнопки
То что ожидает пользователь
- Запуск в через Xcode в режиме отладки покажет что RN создал нативные компоненты
Что происходит когда пользователь запускает приложение на телефоне
Что бы отобразить контент приложению нужно запустить ваш JS в виртуальной машине
Главный поток (entrypoint) стартует отдельный поток с виртуальной машиной и ждет пока не будет комманд какие компоненты показать на екране
Для оптимизиции поцизионирования есть отдельный прериотизированный тред для расчета позиций компонентов и другой математики
JS thread не тормозит UI thread – они работают паралельно
Код JavaScript запускается на JSCore поскольку эта VM уже есть в iOS из коробки
Код на JavaScript не имеет доступа к памяти основного приложения, и наоборот
Все общение между JS и Native сделано через мост, который сериализует/парсит в JS/Native обьекты
Узкое место для скорости работы приложения, сериализация и передача данных занимает CPU
Во время работы реакта будут проходить сообщения через мост к модулю из Native и параметрами компонента, тип / стили / дети
Во время рендеринга / изменений VirtualDOM через мост отправляются сообщение на создание компонента, установки иерархии компонентов setChildren
UIManager вызывает менеджер для типа компонента и создает новый екземпляр
Для каждого Native компонента есть свой менеджер, и создавать новые менеджеры очень легко
Все базовые компоненты уже доступны из коробки
Select > Picker, Checkbox > Switch
Есть так же компоненты которые не имеют аналогов на другой платформе
Рекомендую сразу изучить какие компоненты есть из коробки и как их можно стилизировать / адаптировать для вашего дизайна
Кроме компонентов RN предоставляет доступ к API платформы
Добавляет полифилы для работы с сетью
- Можно перенести код из веб приложения не меняя его
– Сохраняется компатибилити
В целом знаний достаточно что бы сделать такой скрин
Но в View нету возможности указать градиент для фона
Установка работает как обычный пакет NPM
Если в нем есть Native код то нужно сделать react-native link
Внутри используется CAGradientLayer и android.graphics.LinearGradient
Что бы подключить компонент который имеет Native реализацию нужно добавить его в билд конфигурацию что бы скомпилить
Зарегестрировать новый модуль что бы RN мог увидит новый функционал
Для мобильных приложений очень важны анимации, когда пользователь нажимает на завершение разговора
Нет ксс анимации и трансижинов, по крайней мере из коробки, но есть свой кроссплатформеный Animation API
Работает паралельно render’y
Использует requestAnimatinoFrame
Использует requestAnimationFrame & setNativeProps минуя reconsilation
Но каждый фрейм будет передаваться сообщение из JSThread в Native thread
Очень часто не обязательно использовать Animated.View – можно использовать нативные компоненты для достижения результата
Andriod – ViewPagerAndroid который внутри себя уже реализовывает функционал свайпа между разными вьюшками
iOS я использовал ScrollView и когда пользователь завершил свайп менял offsetScroll’a который плавно через Animated API завершал перетаскивание
Почти все скрины будут содержать платформо зависимые компоненты
MetroBundler который собирает ваш JS под конкретную платформу, будет подключать файлы с постфиксом этой платформы в приоритете
Так же используя API платформы можно определить на каком устройстве работает приложение
В RN понятное дело нету функционала из коробки для аудио / видео звонков через SIP
Мне нужно было написать модуль для поддержки, причем реализация в зависимости от платформы отличается
Эта интеграция должна работать следующим образом
Сначала JS код загружает данные сервера для SIP авторизации
Передает эту информацию нативному модулю и ждет событий о новом звонке
- Вызов метода из JS делается через NativeModules который имеет обьект с модулем и методами которые експортируются из Native кода
В RN писать нативной код и интегрировать его с JS очень просто
Предоставляет макросы для iOS кода и аннотации для JS где вызов метода из JS будет автоматом проксироватся через Bridge в натив код
Просто расширить функционал благодаря двусторонней сериализации
Все вызовы через RN Bridge асинхронны вы можете использовать callback’и с результатом
Базовый знаний хватит для того что бы написать эту интеграцию
Что бы тригерить события из натив кода есть DeviceEventEmmiter где указывается уникальное название события
В JS очень просто подписатся на него, в параметрах будет уже десириализированный обьект
Таким образом я добавил нужный мне API для аудио звонков
Что бы тригерить события из натив кода есть DeviceEventEmmiter где указывается уникальное название события
В JS очень просто подписатся на него, в параметрах будет уже десириализированный обьект
Таким образом я добавил нужный мне API для аудио звонков
Что бы сделать видео
Библиотека PjSIP так же предоставляет платформо зависимый API для видео окна
Мне нужно было сделать компонент который я смогу исопльзовать из JavaScript’a
- around ~150 packages for navigation
Приложение все равно остается приложением для платформы, и собственно с точки зрения упаковки придется разбираться что такое xcode ^ grandle
Потратил кучу времени на баги с Xcode когда он чета кеширует не правильно и линкер не может найти одну из уже скоплированных библиотек