Русский
Русский
English
Статистика
Реклама

React native

Flutter для ReactReact Native разработчика

03.11.2020 22:13:52 | Автор: admin
Статья просвещена тем, кто пишет на стеке React/React Native и хочет освоить новую для себя технологию Flutter. И нет, мы не будем тут писать приложение на этом фреймворке! Если вы ждете какой-нибудь очередной Todo List этот материал не для вас.

image

Скорее это очередная история о том, как я перешел на новый фремйворк)

Материал не предполагает собой истину в последней инстанции. Тут описаны лишь те решения, которые я выбрал для себя, и которые мне, имея огромный бэкграунд в React & React Native разработке, было легче всего применить на реальном проекте.

Контекст


Для начала опишу, так сказать, контекст. Появился заказ написать небольшое (около 15 экранов) кроссплатформенное мобильное приложение. Естественно, начал по привычке делать на React Native. За две недели приложение было реализовано где-то на 80%.

На выходных прочитал на хабре очередную статью от Surf с результатами опроса. И пришла мысль, а почему бы не попробовать? Смогу ли я то что уже написано повторить на новом для себя фреймворке? Решено было потратить выходные на эту попытку. В результате, за следующую неделю были переписаны не только те 80% что были до этого, но и остальные 20. Т.е. срок разработки сократился более чем в два раза!

Плюсы


В первую очередь, плюсом является, скорость верстки. Экраны клепаются ОЧЕНЬ быстро. Линейные градиенты, svg, gif почти все из коробки. Перекрывающие друг друга компоненты (position: absolute) вообще никаких проблем. Все то, что вызывало боль в React Native, тут делается по щелчку пальцев. Анимации это вообще сказка! На один и тот же экран с постоянно анимированными компонентами потрачено в разы меньше времени с Flutter.

Минусы


Ощутимых минусов два. Первый документация. На русском очень мало. Официальная английская не очень хорошо структурирована, да, она дает много полезных примеров кода, но по общей архитектуре приложения там сложно что-то толковое понять.

Второй минус пакеты. До сих пор там полный бардак. Выбрать действительно хороший пакет для нужного тебе не тривиальная задача. Где-то одна фича не работает, где-то другая. Времени на подбор тратится много. Как вариант дописывать что-то самому, но это когда уже немного освоюсь)

Опыт: хуки


Мое знакомство с React началось еще во времена, когда в нем только-только появились нормальные классы. Сейчас я не представляю его себе без хуков и уже забыл про классы. Для flutter есть замечательная библиотека flutter_hooks, позволяющая привнести привычные хуки в свой проект. Для меня она полностью заменила StatefulWidget. Хуков много, можно писать свои, но чаще всего используются у меня в коде именно useEffect, useState и useMemoized. Для анимаций useAnimationController.

Может быть это не лучшее решение (готов почитать в комментариях о минусах), но позволяет использовать бэкграунд из React в новом для себя фреймворке. Даже не вижу смысла приводить примеры с кодом всем React разработчикам это знакомо как отче наш!

Опыт: state management


В свое время приходилось работать и с redux, и с mobx, и даже, с экзотикой, типа storeon. Вроде бы оно (redux/mobx) есть и под Flutter, но, честно говоря, не осилил). На мой взгляд там все слишком усложнено по сравнению с тем, что было в React. Можно, конечно, потратить побольше времени и разобраться, но зачем, когда я нашел решение лучше: riverpod.

Библиотека от Remi Rousselet, автора flutter_hooks естественно, что они обе прекрасно сочетаемы). По сути, она представляет собой доработанный Provider. Просто добавляем в свой runApp(ProviderScope()) оберткой над всем остальным и получаем глобальный scope во всем приложении, доступный из любого виджета. Достаточно написать useProvider(providerName) в build методе HookWidget и у нас доступные данные из указанного провайдера.

В библиотеке много вариантов провайдеров, но самые основные это ChangeNotifyProvider и StateNotifyProvider. Всю бизнес логику можно смело выносить из виджетов и переносить в эти провайдеры. Тем более они отлично комбинируются друг с другом и не составит труда получить из одного доступ к методам и данным другого.

Паттерн в применении очень похож на redux ducks подход, который, лично мне, стал ближе всего в мире React. Только утки более мелкие получаются. Тут главное помнить, что лучше много маленьких провайдеров которые будет использоваться в разных виджетах, чем один большой для них, потому что перерисовываться будут те виджеты, которые реально были изменены.

Разочарование: web


После ошеломительного (для себя самого) успеха с разработкой мобильного приложения, я, как любой уважающий себя фуллстек, решил пощупать и Flutter for web. Опять же переписав одно из реально работающих корпоративных приложений.

Конечно, flutter web еще в бетте, и все нижеописанное относится именно к бетта версии. Очень надеюсь, что с релизом многое изменится в лучшую сторону. Но тем не менее, тут меня Flutter разочаровал.

Первое что надо знать Flutter Web это не про сайты, а именно про приложения! Т.е. надо писать точно также, как и под мобильный. Все виджеты такие же. Использовать сторонний JS в коде нельзя. Только обращаться к нему через dart:js. Доступ к html тоже через dart:html. Это разом отсекает почти все что уже сделано в мире web. Хочешь крутую анимацию, которая уже где-то реализована на css+js нефиг, пиши сам аналог на flutter или используй dart:js что не всегда просто. Безболезненно заюзать готовую JS/css библиотеку не получится.

Второй минус опять пакеты! Хоть на pub.dev большая часть и отмечена как поддерживающая и web, и android, и ios, но по факту обычно работает либо то, либо другое. Т.е. создать полностью кроссплатформенный код не получится.

Пакеты для web обычно представляют собой обертку над js аналогами. Но почти всегда не успевают за версией того пакета, который оборачивают.

Пример:


Задача сделать авторизацию через MS и получение данных пользователя.

На старом-добром JS все просто: берем msal и microsoft/microsoft-graph-client и наслаждаемся результатом.

Во Flutter находим msal_flutter, подключаем и выясняется что web пакет не поддерживает. Ладно, находим msal_js это обертка над обычным msal, значит надо его подключить в index.html через старый-добрый тег script. Но если msal уже обновился до 1.4.2 то этот пакет поддерживает максимум 1.3.0!

Ну хорошо, токен мы с горем пополам получили, как быть с данными пользователя? Есть пакет microsoft_graph документации по нему никакой. Чтобы найти нужный метод надо лезть в код пакета и ковырять там. И выяснить в итоге что там реализовано всего пара для работы с задачами! Находим еще msgraph так тот вообще единственный метод поддерживает!

Благо что сам протокол там не очень сложный и можно побыстрому написать что-то свое, когда надо работать а не библиотеки писать)

Окружение


Третий и самый огромный минус невозможность настройки окружения. Flutter web запускается либо в браузере либо в виде веб сервера. Задать порт, на котором оно будет крутиться еще можно через параметры командной строки (что тоже не очень удобно, где конфиг?!) Но как мне запустить его как https с самоподписанным сертификатом? Чтобы при этом и хотрелоад работал и дебаг и прочие фишки которые обычно работают? Алло! Ребята, 2к20 заканчивается, а у вас до сих пор http? Серьезно?!

Вывод


Однозначно, Flutter как фреймворк для кроссплатформенной мобильной разработки, рвет React Native в клочья по всем фронтам. Я доволен, заказчик тоже в восторге что еще надо?

А вот как инструмент для написания web приложений, он пока сыроват и слишком трудоемок. Готовьтесь что там, где вы за пару секунд подключали сторонний js пакет, тут вы будете пару дней писать обертку для него или вообще собственный аналог на Flutter.

ПС


Еще раз повторю для тех, кто забыл из начала статьи. Описанные мной применяемые решения и выводы это выводы человека с 1 неделей бэкграунда во Flutter и трехлетним бэкграундом в React. Так что не стоит принимать их за истину в последней инстанции. Готов обсудить в комментариях с гуру что я сделал не так)
Подробнее..
Категории: React , Reactjs , Flutter , React native

Почему я ушел с React Native и перешёл во Flutter Часть 1

17.07.2020 12:12:50 | Автор: admin
Всем привет. Меня зовут Дмитрий Андриянов. Два года писал на React Native, сейчас я разработчик в Surf и уже полтора года пишу на Flutter. Когда я только решил серьёзно взяться за Flutter, я бы очень хотел найти статью от разработчика, который перешёл с React Native на Flutter и узнать его мнение. Теперь этот разработчик я.

Скорее-всего вы видели такие отзывы о React Native и как компании отказываются от него. Я поделюсь своим личным мнением со стороны одного разработчика, а не компании.

Эта статья для тех, кто


  • Не знаком с кросс-платформой и хочет понять основную разницу между технологиями.
  • Пишет на React Native и хочет узнать, что он выиграет при переходе на Flutter.
  • Не писал на React Native, а только на Flutter.

Ниже расскажу почему в своё время я выбрал React Native, поделюсь причинами ухода во Flutter и приведу основные различия между React Native и Flutter, которые, на мой взгляд, наиболее важны. Со времени ухода с React Native прошло много времени что-то изменилось и исправлено. Я постарался это учесть, но что-то мог упустить из виду.



Почему я выбрал React Native


В React Native я пришёл из Web-разработки на React.js в 2017 году. Компании нужен был именно React / React Native разработчик.

Причины:

  • Тот же язык JavaScript.
  • Те же правила построения UI и компонентная система.
  • Кросс-платформа.

Почему ушёл во Flutter


React Native хорош до тех пор, пока не начнёшь делать что-то весомое, с множеством экранов и нарастающей логикой приложение начнёт работать всё тяжелее. Пробовал различные способы повышения производительности: shouldComponentUpdate, PureComponent, использование ключей, мемоизация, оптимизация циклов и т.д, начал задумываться о замене JSCore (Hermes на тот момент ещё не было). В итоге наткнулся на совет попробовать Flutter.

Во Flutter более богатый инструментарий, выше производительность и нет проблем React Native. Конечно, я не отрицаю, что мой код на RN мог быть не самым идеальным.

Плюсы React Native, из-за которых я начал с ним работать


1. В React Native используется удобная компонентная структура React.js.

React.js:

function App() {    return (        <div className="App">            <header className="App-header">                <Image                    logo={logo}                />                <p>                    Edit <code>src/App.js</code> and save to reload.                </p>                <AppLink>                    Learn React                </AppLink>            </header>        </div>    );}function Image({logo}) {    return <img src={logo} className="App-logo" alt="logo" />}function AppLink({children}) {    return (        <a            className="App-link"            href="http://personeltest.ru/aways/reactjs.org"            target="_blank"            rel="noopener noreferrer"        >            {children}        </a>    );}export default App;



React Native:

function App() {    return (        <>            <StatusBar barStyle="dark-content" />            <SafeAreaView>            <ScrollView                contentInsetAdjustmentBehavior="automatic"                style={styles.scrollView}            >            <Header />            </ScrollView>            </SafeAreaView>        </>    );}function Header() {    return (        <View>            <Text>head</Text>        </View>    );}const styles = StyleSheet.create({    scrollView: {        backgroundColor: Colors.lighter,    },});export default App;



2. Нет WebView и HTML используются родные (OEM) виджеты платформы. Общение между JS и нативной частью происходит через мост.

Года два назад писал приложения с частью UI на стороне WebView. В итоге самой большой проблемой было привести его в нативный вид, особенно отклик компонентов и прокрутку. И использование OEM виджетов автоматически избавляет от этих проблем.

3. CodePush. Позволяет практически сразу изменить код приложения у пользователей без обновления версии из магазина.

4. За время существования для React Native появилось очень много библиотек.
Один из сборников библиотек.

На моём первом React Native проекте, использовалась библиотека react-native-fcm для Push-уведомлений, требовались только уведомления и ничего больше. В другом проекте уже использовали react-native-firebase, т.к. помимо уведомлений нужна была аналитика.

Плюсы Flutter


1. Релиз.

Стабильная и надёжная версия. Одновременные релизы Dart и Flutter гарантируют, что новая версия Flutter использует самые последние наработки Dart. Так как они разрабатываются одной компанией Google.

2. Производительность UI.

UI отрисовывается на собственном движке Skia. Во Flutter имеется свой собственный набор Material и Cupertino виджетов, которые являются копией OEM компонентов платформы. Это позволяет одновременно использовать их на обеих платформах. Больше информации о работе виджетов в статье Flutter под капотом.

Пример запуска iOS виджета на обеих платформах:



Нет OEM компонентов и затрат на взаимодействие с ними. Хоть они и являются преимуществом React Native перед технологиями, использующими WebView, но проигрывают по гибкости и производительности виджетам Flutter. Недавно работал над приложением, использующим для Android и iOS используются в основном Material виджеты, но платформозависимые DatePicker.

Пример UI на обеих платформах:



3. Hot Reload внедрение обновленных файлов исходного кода в работающую виртуальную машину Dart. После этого Flutter перестраивает дерево виджетов, сразу отображая изменений без перезапуска приложения. Это сильно экономит время при верстке UI и написании логики.

4. Компиляция Flutter.

В React Native только JIT-компиляция. Flutter использует JIT только в режиме разработки это обеспечивает работу Hot Reload. В релизной сборке Flutter используется AOT-компиляция в нативные файлы платформы, что более безопасно и производительнее чем React Native, где можно в релизе получить доступ к JavaScript коду. Релизная сборка Flutter намного быстрее релизной React Native.

Сравнение производительности Native vs Flutter vs React Native.

5. Изоляты.

Во Flutter и React Native 1 процесс с 1 асинхронным потоком и тяжелые задачи заблокируют UI.

Выход из ситуации:

  • Разбивать на асинхронные операции. Они не блокируют UI, но исполняются в том же потоке.
  • Выносить в изолят это независимый процесс со своим потоком, что позволяет не волноваться этой блокировке основного потока.

У Flutter Dev Podcast есть отличный выпуск про изоляты и библиотеки для работы с ними.

6. Всё является виджетом.

Благодаря этому виджеты можно вкладывать друг в друга как требуется разработчикам, без особых ограничений.

Пример: кнопка содержащая AppBar с title в виде Switch.

RaisedButton(  padding: const EdgeInsets.all(10),  child: AppBar(    title: Row(      children: <Widget>[        Switch(          value: false,        ),        Text('text'),      ],    ),  ),),



Написать свой виджет можно:

  • Комбинацией виджетов.
  • Используя Canvas, для более сложной геометрии.
  • Используя слой рендера, когда нужно специфическое поведение.

Недавно писал функциональность, которую было проще всего сделать, используя не слой виджетов, а слой рендера с использованием RenderObject. Но об это расскажу в одной из следующих статей, где опишу проблему и её решение.

Статья про слои рендера.

Минусы React Native


1. Все ещё не 1.0.0.

Обычно в проекте оставались на определённой версии RN. Обновление часто влекло за собой поломки библиотек или внутреннего устройства RN. Инструменты автоматического обновления версии не справлялись. Быстрее было заново создать проект на новой версии, так как в аутсорсе заказчики не платят за время потраченное на обновление.

Обновлялись только когда этого требовала необходимая библиотека или в новой версии был исправлен критический для нас баг. В этом случае был риск, что старые библиотеки могли быть несовместимы с новой версией React Native. Но уже прошло полтора года, проверим как с этим сейчас. Попробуем обновить React Native за пару минут, ведь нам важно время заказчика.

Создаём проект React Native на v0.61.5 (предпоследняя на данный момент).
react-native init test_version --version 0.61

Запускаем:



Всё в порядке.

Инициализируем репозиторий, так как upgrade работает поверх Git и без него будет ошибка:



Запускаем npx react-native upgrade:



Чистый проект при обновлении выдаёт ошибку.

Пройдём по ссылке предлагаемой в треминале. Список файлов, которые нужно будет обновить вручную:

  • package.json
  • .gitattributes
  • .flowconfig
  • App.js
  • app.js/android/app/build.gradle
  • android/app/src/debug/java/com/rndiffapp/ReactNativeFlipper.java
  • android/app/src/main/AndroidManifest.xml
  • android/app/src/main/java/com/rndiffapp/MainApplication.java
  • android/build.gradle
  • android/gradle.properties
  • android/gradle/wrapper/gradle-wrapper.properties
  • android/gradlew
  • ios/Podfile
  • ios/RnDiffApp.xcodeproj/xcshareddata/xcschemes/RnDiffApp-tvOS.xcscheme
  • ios/RnDiffApp.xcodeproj/xcshareddata/xcschemes/RnDiffApp.xcscheme
  • ios/RnDiffApp/AppDelegate.m

Обновив файлы, запускаю upgrade:



Запускаем npm install. Готово. Проект обновился.

Главный критерий время. Оно тратится на обновление и исправление проблем, либо на пересоздание проекта с нуля. На Flutter же пишем в консоле flutter upgrade и готово. Flutter обновится для всех проектов сразу. Могут быть ломающие изменения, но обычно их пара штук на весь проект и они очень просто чинятся.

2. Производительность.

Её оказалось недостаточно. Всё ещё не так быстро, как хотелось бы. Тестировщики постоянно ставили в баги низкую не нативную производительность. Не всегда спасали оптимизации. С ростом приложения больше данных сериализуется для моста и тем меньше отзывчивость.

3. Так как используются нативные компоненты, то на Android и iOS они выглядят по-разному.
Чтобы достичь единообразия придётся писать аналог компонента для одной из платформ или с нуля для обеих. Либо проектировать дизайн с учетом этих особенностей и различий.

Один и тот же UI. Слева iOS, справа Android.



Дополнительно


JavaScriptCore


В React Native долгое время был старый JS Core для Android. С появлением Hermes ситуация улучшилась, но судя по отзывам знакомых разработчиков и тестам всё не так однозначно.

Сравнение JS движков.

Expo


Его сложно отнести к плюсам и минусам. Он предоставляет из коробки важные библиотеки и функциональность, но у него есть свои проблемы, нивелирующие его плюсы. Если нужна какая-то отсутствующая в Expo функциональность на уровне платформы или внешняя библиотека, использующая нативный код, то придется выталкивать проект и плюсы Expo либо исчезают, либо превращаются в его минусы. React Native init vs Expo.

Минусы Flutter


Несправедливо было бы их не отметить. Всё же, это не серебряная пуля.

1. Меньше специалистов и вакансий.
Меньше разработчиков и компаний, разрабатывающих на Flutter, в сравнении с React Native. Когда я в мае 2019 года искал работу на Flutter, мне попалось всего 3 компании.

2. Количество библиотек меньше, чем в React Native.
Из-за того, что Flutter более молодая технология, то и библиотек для неё куда меньше, но их количество активно растет. Но за год с лишним работы это не доставило мне особых проблем, так как есть все нужные библиотеки.

3. Не подходит для:
  • Игр.
  • Приложений, завязанных на работе с железом.
  • Приложения с дополненная реальностью. Так как нужно реализовывать логику отдельно для каждой платформы.


Но если много общего UI, возможно, подойдет вариант использования каналов платформы для взаимодействия с нативным кодом или интегрировать Flutter в нативное приложение.

Документация


В React Native достаточно хорошая документация, которая отвечает на многие возникающие вопросы. Она постепенно улучшается (раньше можно было наткнуться на пустые страницы: заголовок есть, а контента нет) и материал становится лучше.
Во Flutter же документация шикарна. Примеры, объяснения, рецепты с примерами, видео. Если есть проблема с использованием чего-либо документация способна её решить.

Порог вхождения


В обоих случаях порог вхождения довольно низкий.

  • React Native нужно знать JS, React и можно начинать.
  • Flutter если вы знаете JS / Java / Kotlin / Swift / C (а если JS и любой из остальных это вообще идеальный вариант), Dart дастся очень легко.
    А если есть ещё и опыт на React Native, то декларативная верстка Flutter не вызовет сложностей.


Итог


React Native


  • Больше библиотек.
  • Больше разработчиков.
  • Проблемы с производительностью.
  • Не безопасен.
  • Низкий порог вхождения.

Flutter


  • Библиотек меньше, но их число растёт. А необходимые есть.
  • Разработчиков меньше, но переучиться несложно.
  • Производительность.
  • Безопасен.
  • Низкий порог вхождения.

Пользователю неважно, что вы используете для сетевых запросов Http или Dio.
Искали вы JS-разработчика день или Flutter-разработчика месяц. Главное, чтобы приложение выполняло требуемые задачи и было производительным. Flutter позволяет отвечать этим требованиям гораздо эффективнее.

Разбор решения одних и тех же задач используя Flutter и React Native будет во второй части статьи.
Подробнее..

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

04.03.2021 12:16:30 | Автор: admin

Когда речь заходит о разработке сразу для Android и iOS, начинаются холивары и гадания на кофейной гуще. Что перспективнее, Flutter или Kotlin Multiplatform? За этими технологиями будущее, или завтра их обе забудут?

Уверенно делать прогнозы по принципу я так вижу занятие весёлое, но бессмысленное. Как подойти конструктивнее? Как известно, кто забывает об истории, обречён на её повторение. Поэтому я решил вспомнить, какими были предыдущие решения Android+iOS, и посмотреть, что с ними стало. Тогда вместо голых спекуляций будут суровые факты. И эти факты из прошлого полезны для понимания будущего: они показывают, где разложены грабли.

Я не использовал лично большинство старых технологий, но благодаря общению со спикерами нашей конференции Mobius узнал многое об их опыте, и текст во многом основан на этом. Если вы работали с чем-то из перечисленного, смело дополняйте в комментариях, будет интересно и полезно.

Оглавление


Web / PWA

В 2007-м, представляя разработчикам первый iPhone, Стив Джобс объяснял, что нативные приложения не нужны: В iPhone есть полный движок Safari. Так что можете писать потрясающие Web 2.0 и Ajax-приложения, которые выглядят и действуют на iPhone именно как приложения.

Android на тот момент ещё даже не был анонсирован. Но получается, что исторически первым единым решением для iOS и Android стал веб.

Вот только разработчики тогда не разделили энтузиазма Джобса (неудивительно, учитывая тогдашнее состояние мобильного интернета). И годом позже всё-таки появился App Store для нативных приложений. А его комиссия в 30% стала новым денежным потоком для компании. В итоге её позиция сменилась на противоположную: теперь Apple считает, что правильный подход это натив (и предпочитает не вспоминать, что там её лидер говорил в 2007-м, Океания всегда воевала с Остазией).

Однако идея веб-приложений не исчезла, а продолжила развиваться. И в 2015-м новое поколение таких приложений назвали Progressive Web Apps. Они могут хранить данные локально, работать в офлайне, а ещё их можно установить на домашний экран смартфона. Чем это тогда не настоящие мобильные приложения? Что ещё для счастья надо?

Ну, например, для счастья нужны push-уведомления. По состоянию на 2021-й iOS не поддерживает их у PWA, и это мощнейший стопор для распространения подхода. Получается, компания, которая первой хвалила веб-приложения, позже сама поставила главное препятствие на их пути. На change.org есть даже петиция, обращённая к Apple: мы всё понимаем, вы дорожите своими 30%, но эта ситуация должна измениться.

Что в итоге: подход жив, но не стал общепринятым во многом из-за ограничений Apple. В будущем что-то может измениться, стоит следить.


PhoneGap/Apache Cordova

Это решение тоже связано с вебом, но подход другой так называемый гибридный. Тут предложили использовать знакомую троицу HTML/CSS/JS, но результат не публиковать в виде сайта, а упаковать в контейнер нативного приложения. В таком случае не сталкиваешься с ограничениями веба и можешь реализовать те же push-уведомления.

PhoneGap появился в 2009-м благодаря компании Nitobi, а в 2011-м Adobe купила её и создала также опенсорсный вариант Apache Cordova. У проекта модульная архитектура, позволяющая подключать плагины. И в сочетании с опенсорсностью это означает, что если Cordova не умеет чего-то нужного (например, взаимодействовать с акселерометром смартфона), сообщество может научить. Вроде как прекрасно, да?

На практике что-то не очень. В своё время некоторая популярность у проекта была, те же плагины появлялись, но масштабного захвата рынка не произошло. А затем всё и вовсе пошло на спад.

Почему так? Среди главных причин называют UX, уступающий нативным приложениям. Всё хуже и с производительностью, и с плавностью. Но основное отличие даже не измерить числами: пользователю попросту заметна разница между гибридным приложением и нативным, они производят разное впечатление. Для людей через WebView ощущения не те.

А с годами сказалось ещё и развитие веба. Чем лучше становились веб-приложения и чем быстрее становился мобильный интернет, тем меньше преимуществ можно было получить от гибридного подхода.

Интересно, что авторы проекта сами предвидели такое развитие событий и ещё в 2012-м написали, что итоговая цель PhoneGap прекратить своё существование. И недавно эта цель была достигнута: в 2020-м Adobe заявили о прекращении разработки, ссылаясь на то, что нишу закрыли PWA.

Что в итоге: разработка прекращена.


Qt

Проект Qt помогал людям заниматься кроссплатформенной разработкой ещё с 90-х, когда речь шла о десктопных ОС, а не мобильных. При этом он завязан на C++, который для Android и iOS не совсем чужой: даже нативные разработчики на этих платформах могут обращаться к плюсам. Так что, казалось бы, поддержка iOS/Android со стороны Qt просто напрашивалась.

Но поначалу дело осложнялось тем, что в 2008-м проект купила Nokia. Компания тогда делала ставку на Symbian и не горела желанием помогать конкурентам. В 2010-м возможностью запускать Qt-приложения на Android занимались энтузиасты, и на Хабре об этом писали:

В 2011-м Nokia отказалась от Symbian в пользу Windows Phone, а часть проекта Qt продала компании Digia. И тогда началась работа над поддержкой одновременно Windows 8, Android и iOS. Ну вот теперь-то счастье? Спустя 10 лет ясно, что тоже нет.

Вакансии по мобильной разработке на Qt сейчас единичные. Хабрапосты о ней появляются очень редко и не свидетельствуют об успехе: в одном причиной использования Qt стала ОС Аврора (экс-Sailfish), в другом попросту у меня уже был большой опыт с ним.

Что помешало? Я встречал жалобы на то, что недостаточно было использовать сам Qt и писать на С++/QML. Потому что средствами Qt многое было не реализовать, и приходилось-таки иметь дело с конкретной платформой (например, на Android работать с Java, увязывая это с плюсовой частью через JNI). Всё это очень неудобно и подрывает исходную идею бодренько запилим два приложения по цене одного.

При этом здесь пользователь тоже ощущает не-нативность. А к IDE Qt Creator есть нарекания, рантайм Qt увеличивает размер приложения, бесплатный вариант Qt подходит не всегда и может понадобиться недешёвый коммерческий. Кроме того, мне лично кажется, что ещё сказался язык. Кроссплатформенной разработке желательно быть такой, чтобы нативным разработчикам было попроще перекатиться туда, а с языком C++ слово попроще не ассоциируется.

И хотя случаи использования Qt встречаются до сих пор, это скорее исключения из правил, у которых могут быть какие-то особые исходные условия: например, хотим перетащить на телефоны с десктопа уже имеющуюся кодовую базу на C++.

Что в итоге: крайне нишевое решение, которое не умерло полностью, но используется очень узкой прослойкой.


Xamarin

Мигель де Икаса ещё в проекте Mono занимался тем, что притаскивал .NET на несвойственные ему платформы (начав с Linux). А когда в 2011-м он вместе со всей командой Mono попал под сокращение, основал новую компанию Xamarin, собрал прежних коллег там, и сосредоточился на мобильных платформах: мол, давайте писать мобильные приложения для них на C#, вот инструмент для этого.

Надо понимать контекст того времени. Годом ранее компания Microsoft выпустила Windows Phone и стремилась стать третьим большим игроком на мобильном рынке. И даже большая Windows лезла на мобильный рынок: готовилась к выходу Windows 8, оптимизированная для планшетов.

В таком контексте идея писать под все смартфоны на языке от Microsoft выглядит логично. Ведь если для кроссплатформы применяется родной язык одной из главных платформ, то он уже знаком части мобильных разработчиков, и они могут переиспользовать что-то из существующих кодовых баз. В общем, будет проще наводить мосты.

Но теперь задним числом мы знаем, что мобильные амбиции Microsoft заглохли. И это оставило Xamarin в странном положении: на рынке две живых платформы, а тут предлагают писать для обеих на языке умершей третьей. Ни айосеров, ни андроидоводов такое сильно не привлекает.

Ещё порой вызывали недовольство и то, что после появления новых фич в Android/iOS приходилось ждать их поддержки в Xamarin, и стоимость лицензии, и общее состояние экосистемы (документация, поддержка, библиотеки).

А тем временем компания Microsoft возлюбила опенсорс и сторонние платформы вроде Linux, так что идеи де Икасы оказались ей близки, и в итоге она купила Xamarin. Теперь его наработки вошли в .NET 5, и в прошлом году представили .NET MAUI (Multi-platform App UI) развитие тулкита Xamarin.Forms. В общем, не забросили купленное.

Что в итоге: пока всё остаётся в странноватом статусе, когда и масштабного взлёта не получилось, и полностью не прекращено.


React Native

Наконец, самое свежее. В 2013-м в Facebook выпустил React, ставший очень успешным во фронтенде, а в 2015-м за ним последовал React Native, приносящий подход в мобильную разработку.

Писать предлагается на JavaScript, поэтому кому-то может показаться, что это реинкарнация PhoneGap и его HTML-подхода, но нет. Когда-то Facebook действительно полагался для мобильных устройств на HTML, но ещё в 2012-м Цукерберг назвал это ошибкой. И у React Native идея не в том, чтобы с помощью HTML/CSS городить что хочешь, а в том, чтобы с помощью JSX использовать нативные элементы UI так что пользователь ощущал себя прямо как с нативным приложением.

Насколько это получилось? Шероховатости и срезанные углы существуют с ними сталкиваются и разработчики, и пользователи. Для кого-то они оказываются критичными: особенно нашумел пост Airbnb, где после React Native решили вернуться к нативной разработке. Но какие-то другие компании (вроде самой Facebook) эти ограничения не остановили, использование в индустрии есть.

Поскольку нативной отполированности не достичь, это решение часто рекомендуют для случаев, где она и не требуется. Если пользователь залипает в приложении часами (как в соцсетях), то любая неаккуратная мелочь будет бросаться ему в глаза но вот если юзкейс приложения такой, что его включают на минуту в неделю, то эти мелочи просто никто не заметит.

Если зайти на HeadHunter и сравнить число вакансий по React Native с нативной разработкой, то их немного. Но вот если сравнивать с Qt/Xamarin/PhoneGap то вакансий окажется больше, чем у них всех, вместе взятых, это наиболее успешный вариант.

Что в итоге: React Native не стал так успешен, как его фронтендовый старший брат, но определённую нишу занял.


Выводы

Обычно в холиварах занимают крайние позиции: эта крутая штука всех победит или все эти глупости скоро отомрут. А у меня по итогам всех вариантов позиция получается сдержанной:

  • Победит и умрёт не единственные варианты. Есть ситуации, когда технология занимает небольшой сегмент рынка и не претендует на мировое господство, но приносит кому-то пользу.

  • Кроссплатформа это всегда компромисс. Выдержать планку качества, заданную нативом, не получалось нигде. Везде что-то вытарчивает и пользователи могут заметить разницу, и разработчикам приходится возиться со сложностями. И далеко не для всего кроссплатформа годится одинаково хорошо: если бизнес-логика между платформами шарится хорошо, то с UI всё сложнее.

  • Но качество ниже нативного не означает, что кроссплатформа плоха и не нужна. Кому-то на этот компромисс вполне стоит идти (например, стартапу, где вся жизнь один сплошной компромисс). В каждом проекте надо взвешивать свои за и против, и результаты в разных случаях будут различаться.

И всё это приводит меня к такому выводу про Flutter: вместо обсуждений выиграет он или проиграет надо обсуждать в каких конкретно юзкейсах он выигрывает. По-моему, он хорош для определённой ниши, поэтому вряд ли угрожает будущему всей нативной разработки, но закрепиться в этой нише вполне может. Вопрос в том, каковы её размеры и попадает ли в неё ваш проект.

А вот про Kotlin Multiplatform сделать выводы по прошлому у меня не получилось, потому что у него нетипичная ситуация, отличающаяся от предшественников. Во-первых, идея кроссплатформа годится не для всего тут заложена прямо в фундамент: а мы и не предлагаем объединять всё, реализуйте общую бизнес-логику, а остальное на Android и iOS делайте раздельно. А во-вторых, тут играет на руку родной для Android язык: он уже знаком половине мобильных разработчиков, и такого в кроссплатформе раньше не возникало. Так что опыт предыдущих технологий тут непоказателен остаётся смотреть, что покажет время.

На последнем Mobius было сразу несколько кроссплатформенных докладов (три про Flutter, один про Kotlin Multiplatform) мы уже выложили все видеозаписи конференции на YouTube, так что можете сами их посмотреть. А мы тем временем вовсю работаем над следующим Mobius: он пройдёт 13-16 апреля в онлайне, и там без освещения кроссплатформы тоже не обойдётся. Так что, если вас заинтересовал этот пост, то вам будет интересно и там.

Подробнее..

Локализуем приложение на React Native

11.09.2020 02:18:44 | Автор: admin
В ходе разработки одного из наших приложений нам понадобилось сделать поддержку мультиязычности. Задача была дать пользователю возможность менять язык(русский и английский) интерфейса приложения. При этом текста и контент должны переводиться на лету.

Для этого нам нужно было решить 2 задачи:
1. Определить текущий язык приложения.
2. Использование глобального состояния для перевода на лету.

В этой статья попробую подробно расписать как мы решили данные задачи. И так поехали.

Определяем текущий язык устройства


Для определения текущего языка можно, конечно, воспользоваться библиотекой react-native-i18n, но мы решили обойтись без него, так как для решения этой задачи можно и без сторонних библиотек. Для этого пишем следующее:

import {NativeModules, Platform} from 'react-native';let deviceLanguage = (Platform.OS === 'ios'        ? NativeModules.SettingsManager.settings.AppleLocale ||          NativeModules.SettingsManager.settings.AppleLanguages[0] // iOS 13        : NativeModules.I18nManager.localeIdentifier

Для ios мы извлекаем язык приложения через SettingsManager, а для android через нативный I18nManager.

Теперь когда мы получили текущий язык устройства, мы можем сохранить его в AsyncStorage и приступить ко второй задаче.

Переводим на лету


Для управления глобальным состоянием мы используем MobX, но вы можете использовать другое решение.

И так мы должны создать класс(мне нравится называть модель), который будет отвечать за глобальное состояния текущей локализации. Создаем:

// ключ локального хранилища, в котором будем записывать текущий langconst STORE = '@lang-store';// список русскоязычных стран const RU_LANGS = [  'ru',  'az',  'am',  'by',  'ge',  'kz',  'kg',  'md',  'tj',  'tm',  'uz',  'ua',];class LangModel {  @observable  lang = 'ru'; // по умолчанию  constructor() {    this.init();  }  @action  async init() {    const lang = await AsyncStorage.getItem(STORE);    if (lang) {      this.lang = lang;    } else {      let deviceLanguage: string = (Platform.OS === 'ios'        ? NativeModules.SettingsManager.settings.AppleLocale ||          NativeModules.SettingsManager.settings.AppleLanguages[0] // iOS 13        : NativeModules.I18nManager.localeIdentifier      ).toLowerCase();      if (        RU_LANGS.findIndex((rulang) => deviceLanguage.includes(rulang)) === -1      ) {        this.lang = 'en';      }      AsyncStorage.setItem(STORE, this.lang);    }}export default new LangModel();


При инициализации нашей модели мы вызываем метод init, который берет локаль либо из AsyncStorage, если там есть, либо извлекаем текущий язык устройства и кладет в AsyncStorage.

Далее нам нужно написать метод(action), который будет менять язык:

  @action  changeLang(lang: string) {    this.lang = lang;    AsyncStorage.setItem(STORE, lang);  }


Думаю, что тут все понятно.

Теперь самое интересное. Сами переводы мы решили хранить простым словарем. Для этого создадим js файл рядом с нашей LangModel, в котором мы поместим наши переводы:

// translations.js// Да, за основу мы взяли русский. export default const translations = {  "Привет, Мир!": {en: "Hello, World!"},}


Далее реализуем еще один метод в LangModel, который будет принимать на вход текст и возвращать текст текущей локализации:

import translations from './translations';  ...  rk(text) {    if (!text) {      return text;    }    // если локаль ru, то переводить не нужно    if (this.lang === 'ru') {      return text;    }    // если перевода нет, кинем предупреждение     if (translations[text] === undefined || translations[text][this.lang] === undefined) {      console.warn(text);      return text;    }    return translations[text][this.lang];  }


Все, наш LangModel готов.

Полный код LangModel
import {NativeModules, Platform} from 'react-native';import {observable, action} from 'mobx';import AsyncStorage from '@react-native-community/async-storage';import translations from './translations';const STORE = '@lang-store';// список ru локали const RU_LANGS = [  'ru',  'az',  'am',  'by',  'ge',  'kz',  'kg',  'md',  'tj',  'tm',  'uz',  'ua',];class LangModel {  @observable  lang = 'en';  constructor() {    this.init();  }  @action  async init() {    // Берем текущую локаль из AsyncStorage    const lang = await AsyncStorage.getItem(STORE);    if (lang) {      this.lang = lang;    } else {      let deviceLanguage: string = (Platform.OS === 'ios'        ? NativeModules.SettingsManager.settings.AppleLocale ||          NativeModules.SettingsManager.settings.AppleLanguages[0] // iOS 13        : NativeModules.I18nManager.localeIdentifier      ).toLowerCase();      if (        RU_LANGS.findIndex((rulang) => deviceLanguage.includes(rulang)) > -1      ) {        this.lang = 'ru';      }      AsyncStorage.setItem(STORE, this.lang);  }  @action  changeLang(lang: string) {    this.lang = lang;    AsyncStorage.setItem(STORE, lang);  }  rk(text) {    if (!text) {      return text;    }    // если локаль ru, то переводить не нужно    if (this.lang === 'ru') {      return text;    }    // если перевода нет, кинем предупреждение     if (translations[text] === undefined || translations[text][this.lang] === undefined) {      console.warn(text);      return text;    }    return translations[text][this.lang];  }}export default new LangModel();



Теперь мы можем использовать метод rk для локализация текста:

<Text>{LangModel.rk("Привет, Мир!")}</Text>


Посмотреть как это работает можно в нашем приложении в AppStore и Google Play (Нажать на иконку (!) справа вверху, пролистать вниз)

Бонус


Конечно, писать каждый раз LangModel.rk это не круто. Поэтому мы можем создать собственный компонент Text и в нем уже использовать LangModel.rk

//components/text.jsimport React from 'react';import {Text} from 'react-native';import {observer} from 'mobx-react';import {LangModel} from 'models';export const MyText = observer((props) => (   <Text {...props}>{props.notTranslate ? props.children : LangModel.rk(props.children)}</Text>));


Так же нам может понадобиться, например, менять логотип приложения в зависимости от текущей локализации. Для этого можно просто менять контент в зависимости от LangModel.lang (не забудьте обернуть ваш компонент в observer(MobX))

P.S.: Возможно такой подход вам покажется не стандартным, но он нам понравился больше чем то, что предлагает react-native-i18n

На этом у меня все. Всем спасибо!)
Подробнее..

Когда имеет смысл писать кроссплатформенные приложения появление и исчезновение React Native в Lingualeo

15.09.2020 10:12:59 | Автор: admin

В приложениях Lingualeo сложился довольно редкий кейс. Их создали до того, как появились кроссплатформенные технологии, но через несколько лет туда добавили модули на React Native. Кроссплатформенные модули прожили в приложениях примерно четыре года: в ближайшем релизе мы их уберём.

Мы попросили лидера мобильной разработки Артёма Рыжкина (phoenix_rav) рассказать о том, откуда в нативных приложениях Lingualeo появились модули на React Native, какие они вызывали проблемы и когда вообще имеет смысл делать кроссплатформенные приложения.

Как в приложении Lingualeo появились кроссплатформенные элементы

Приложение Lingualeo появилось в русских сторах в 2012 году. Тогда ещё не было кроссплатформенных технологий, приложение для iOS написали на Objective-C, а для Android на Java. Их поддерживали и развивали две отдельные команды.

Со временем приоритеты в компании несколько раз менялись. После 2015 в Lingualeo сделали упор на веб: в мобильной команде осталось всего несколько разработчиков. В основном они поддерживали и актуализировали версии библиотек, и редко добавляли новое.

Веб стал развиваться гораздо быстрее. Там появилась новая функциональность, которую не адаптировали для приложений, и они стали уступать по наполненности. В технологическом плане приложения тоже отстали, потому что за эти годы мобильная разработка шагнула вперёд.

В 2016 году в Lingualeo родилась идея игровых тренировок комплексов заданий, которые помогают пользователям учить язык. Часть была платная, часть бесплатная. Всего их придумали шесть.

Три тренировки по чтению. На скриншотах тренировка, в которой прочитанный текст нужно заново собрать из фрагментов. В других тренировках пользователю нужно разделить текст пробелами на слова или вставить пропущенные слова.Три тренировки по чтению. На скриншотах тренировка, в которой прочитанный текст нужно заново собрать из фрагментов. В других тренировках пользователю нужно разделить текст пробелами на слова или вставить пропущенные слова.Две аудиотренировки, где пользователь слушает текст или предложение и затем собирает его из фрагментов. Например, восстанавливает прослушанный текст из из слов с вариантами ответа.Две аудиотренировки, где пользователь слушает текст или предложение и затем собирает его из фрагментов. Например, восстанавливает прослушанный текст из из слов с вариантами ответа.Одна грамматическая тренировка. В ней пользователь видит предложение на родном языке и затем по словам собирает его на изучаемом языке.Одна грамматическая тренировка. В ней пользователь видит предложение на родном языке и затем по словам собирает его на изучаемом языке.

В команде приняли решение делать игровые тренировки в приложениях на кроссплатформенном языке. Этим хотели добиться параллельности релизов, унифицированности команды, повышения скорости разработки.

Для работы выбрали React Native. Помимо него рассматривали несколько других кроссплатформенных технологий, например, подключаемые библиотеки, игровые движки и Webview. Все варианты оценили по скорости, удобству и качеству разработки, и в итоге выбрали React Native.

К тому же в тот момент веб переезжал на React. В Lingualeo была сильная веб-команда, и на это сделали ставку: решили, что разработчикам, знакомым с React, будет комфортнее и быстрее разобраться с React Native, чем с другой технологией. Шесть игровых тренировок сначала сделали на вебе, потом портировали в приложения.

В итоге когда я пришёл в команду в 2018 году, то увидел интересную ситуацию. Как минимум я с таким раньше не сталкивался: в компании нативные приложения на iOS и Android, но в них есть шесть тренировок, написанных на стороннем фреймворке, языке React Native. Получается, приложения по большей части нативные, но в чём-то кроссплатформенные.

Почему кроссплатформенные элементы в нативных приложениях это проблема?

Кроссплатформенный подход стал популярным в том числе потому, что предполагается, что с ним не нужно дублировать одинаковую логику на двух мобильных платформах. Вместо этого вы пишете единый код на одном из кроссплатформенных фреймворков. Но в нашем случае это было не совсем так: кроссплатформенные элементы только добавили сложностей и замедляли разработку. Вот с какими сложностями можно столкнуться:

React Native не позволяет полностью отказаться от нативного кода, заменив его кроссплатформенным. Для некоторых функций, например, проигрывания музыки, обращения к сенсорам устройства или к локальному хранилищу придётся писать так называемые bridge-классы.

Другой вариант подключать сторонние node модули, реализующие необходимую функциональность. Но может сложиться ситуация, что библиотеку всё равно придётся доработать под нужды вашего приложения. К тому же команда, разработавшая модуль, со временем может перестать его поддерживать.

У нас использовались bridge-классы код на двух нативных языках: Java/Kotlin для Android и Objective-C/Swift для iOS. Мы написали их для обращения к медиаплееру, к аналитическим системам, локальному хранилищу и логике авторизации.

Например, вот как bridge-класс запускает Intent Service в Android:

public class LLMergeBridgeModule extends ReactContextBaseJavaModule {

protected static final String MODULENAME = "LLMergeBridgeModule";

@Override

public String getName() {

return LLMergeBridgeModule.MODULENAME;

}

public LLMergeBridgeModule(ReactApplicationContext reactContext) {

super(reactContext);

}

@ReactMethod

public void merge() {

ReactApplicationContext context = getReactApplicationContext();

SyncService.startServiceForceSync(context);

}

}

У разработчика также могут возникнуть проблемы, если на кроссплатформенном фреймворке необходимо реализовать кастомную логику обработки жизненного цикла экрана Activity в Android или ViewController в iOS.

В нативных платформах со временем меняется логика работы: если в команде только разработчик на React Native, ему придётся следить ещё за двумя платформами. Когда выходят новые версии Android или iOS, нужно переписывать bridge-классы, тратить дополнительное время на поддержку. Разработчику нужно следить не только за развитием кроссплатформенного фреймворка, на котором он работает, но и за обновлениями обеих мобильных платформ.

Сложно искать разработчиков: нужен дорогой универсальный специалист или несколько разработчиков разного профиля. Если вы хотите создать приложение на React Native, можно найти разработчика, который знает одновременно iOS, Android и React Native.

Второй вариант искать 23 разработчиков, каждый из которых разбирается хотя бы в одной платформе. Но тогда усложняется отладка приложения. Например, разработчик, который знает React Native и Android, будет постоянно обращаться за помощью к коллеге, который знает iOS. Это замедляет процесс.

Если в приложении есть и нативные компоненты, и части на React Native, то может возникнуть дублирование логики. Нам пришлось дублировать общие элементы интерфейса и заново писать для React Native сетевой слой, который уже был в нативном приложении.

Например, на момент внедрения React Native у нас уже было два проекта для локализации строк в системе переводов. Один работал для приложения на Android, другой для iOS. Каждый из проектов учитывал особенности своей платформы.

При подключении React Native нужно было завести третий проект, но тогда бы сложилась ситуация дублирования строк: одна и та же строка была бы заведена в 2 проекта сразу. Это бы потребовало дополнительного труда переводчиков. Поэтому мы решили использовать маппер для преобразования строк из iOS-проекта в формат для React Native.

С августа 2019 все приложения Google Play должны обязательно поддерживать 64-битную архитектуру. Если для нативного приложения такая поддержка включалась парой строчек кода, то для React Native пришлось мигрировать на последнюю версию. Нативный разработчик несколько недель разбирался в коде, чтобы адаптировать его под новую версию.

Из-за всех этих трудностей получилось так, что поддержка 6 тренировок небольшой функциональности относительно наших Джунглей или Словарей требовала несоразмерно много ресурсов. Мы решили избавиться от кроссплатформенной части и перейти на полностью нативные приложения.

Как мы вернулись к полностью нативным приложениям

Сначала мы наняли для этой задачи аутсорсера. Мы предположили, что сторонняя команда справится быстрее, чем наши разработчики, потому что у нас было много текущих задач. Команда разработки продолжала заниматься приоритетными проектами, а аутсорсеры начали переписывать игровые тренировки с React Native на нативные языки. Первым взялись за версию для iOS.

Работа шла дольше, чем мы предполагали. Аутсорс-команда отдавала нам сборку, которую нужно было проверить, поэтому у нас выросла нагрузка на QA. Мы проверяли сборку, давали комментарии, их брали в работу, но процесс шёл медленно. Миграция одной тренировки в среднем занимала 3 месяца от получения ТЗ до отправки в прод.

Для ускорения процесса мы решили взяться за миграцию тренировок самостоятельно. Версии для iOS закончили аутсорсеры, а Android мы взяли сами. Начали с одной тренировки в экспериментальном режиме: получилось быстрее и дешевле, чем на аутсорсе.

Первую тренировку мы перенесли за полтора месяца, вторую и третью тоже. Дальше механики тренировок начали повторяться, поэтому последние три мы закрыли за месяц. Сейчас мы тестируем тренировки и включим их в следующий релиз.

Дополнительный плюс от перехода на полностью нативные приложения оказался в том, что размер архива приложения уменьшился на 28 Мб. Также сократилось время сборки: раньше билд релиза Android-приложения на Mac mini занимал до 20 минут на холодном старте, а сейчас 2.

Получается, что в Lingualeo сначала появились кроссплатформенные элементы, а затем мы переписали их в нативных языках. В нашем случае поддерживать кроссплатформенность было накладнее, чем вести полностью нативные приложения.

В каких случаях выгодно делать кроссплатформенное приложение?

React Native вполне подойдёт для многих проектов. Но, по нашему мнению, его выгоднее всего использовать, если ваша задача одновременно соответствует шести критериям:

1. Это простое приложение. Такое приложение не требует реализации сложной бизнес-логики и сложной UI-логики. Например, витрина интернет-магазина: приложение должно просто отобразить список товаров, дать возможность положить товар в корзину и оплатить покупку.

2. Это приложение должно быть одинаковым на каждой платформе. Если ваше приложение выглядит и построено так, что не будет отличаться в зависимости от платформы, используйте React Native. В таком случае получится сэкономить деньги бизнеса и время разработчиков за счёт унификации кода.

4. Это приложение не работает с медиафайлами, сенсорами и навигацией. React Native удобная технология для мобильных приложений, которым не требуется работать с медиафайлами и множеством сенсоров смартфона.

5. Вам важно быстро запуститься и вносить изменения на лету. Кроссплатформенные технологии отличный вариант для быстрого запуска. React Native будет выгодно использовать, например, стартапам. Скорее всего, кроссплатформенная разработка потребует меньше человеко-часов и предприниматель быстрее получит продукт. Его можно тестировать, показывать инвесторам и при необходимости менять код на лету без пересборки проекта, используя механизм code push.

6. У вас пока нет нативных приложений. Добавление кроссплатформенности в нативные приложения приведёт к дублированию сетевого слоя, логики работы UI, локализации, также появятся проблемы с настройками проекта.

Когда кроссплатформенные решения не выигрывают у нативных?

Есть кейсы, когда React Native точно не будет выгоднее, чем нативное приложение. Вот несколько таких:

В приложении нужны сложные механики с медиа-ресурсами. React Native не справится с проигрыванием медиа без bridge-классов. Если в приложении будут многоступенчатые механики, связанные, например, с воспроизведением музыки, то реализовывать это на React Native может быть сложнее, чем в нативных приложениях.

В Lingualeo такие механики как раз есть в игровых тренировках. Например, в аудиотренировке текст сначала проигрывается до конца, затем разбивается на фрагменты. Пользователь может воспроизводить их и перетаскивать при помощи drag and drop.

Приложение будет много обращаться к сенсорам. Чтобы обратиться, например, к GPS, Bluetooth, акселерометрам, датчику лица или микрофону, коду на React Native также нужны bridge-классы.

В приложении будут встроенные покупки. Внутренние покупки очень важная и чувствительная для пользователей фича в приложении. При её реализации лучше обращаться к нативным библиотекам Google и Apple, чтобы, например, чётко понимать, какие проблемы возникли на этапе покупки и верно обрабатывать состояния. Придётся внедрять в приложение нативный код, который будет обращаться к сторам, и для каждой платформы эти модули будут разными.

Фичеринг приложения и следование гайдлайнам. Если вы хотите активно получать фичеринг от Google Play и Apple Store, то, скорее всего, от команды разработчиков потребуется внедрение новой функциональности, специфичной для каждой из двух платформ. Поддержка подобных фичей в React Native потребует времени со стороны разработчиков, а сторонний node module может появиться с заметным опозданием.

Выводы

React Native мощная, удобная и во многом универсальная технология, но лучше всего она подойдёт для приложений, которые:

  • не имеют нативной кодовой базы: то есть, сразу создаются как кроссплатформенные;

  • основаны на простой логике: им не нужен доступ к медиафайлам и датчикам;

  • не имеют встроенных покупок, например, платного премиум-доступа или игровой валюты;

  • должны запуститься быстро и экономно: например, чтобы показать MVP инвесторам.

Подробнее..

Категории

Последние комментарии

  • Имя: Макс
    24.08.2022 | 11:28
    Я разраб в IT компании, работаю на арбитражную команду. Мы работаем с приламы и сайтами, при работе замечаются постоянные баны и лаги. Пацаны посоветовали сервис по анализу исходного кода,https://app Подробнее..
  • Имя: 9055410337
    20.08.2022 | 17:41
    поможем пишите в телеграм Подробнее..
  • Имя: sabbat
    17.08.2022 | 20:42
    Охренеть.. это просто шикарная статья, феноменально круто. Большое спасибо за разбор! Надеюсь как-нибудь с тобой связаться для обсуждений чего-либо) Подробнее..
  • Имя: Мария
    09.08.2022 | 14:44
    Добрый день. Если обладаете такой информацией, то подскажите, пожалуйста, где можно найти много-много материала по Yggdrasil и его уязвимостях для написания диплома? Благодарю. Подробнее..
© 2006-2024, personeltest.ru