Нативное или кроссплатформенное приложение — вопрос обычно задают как технический, а решается он экономикой: две кодовые базы стоят почти вдвое дороже одной и всегда дороже в поддержке. Поэтому по умолчанию мы делаем кроссплатформенное приложение на Flutter, а нативный путь выбираем там, где он окупается.
Нативное или кроссплатформенное приложение: в чём разница
Нативное приложение пишут отдельно под каждую платформу на её родном языке. Для iOS это Swift — Apple называет его языком для всех своих платформ. Для Android — Kotlin: Google с 2019 года ведёт разработку под Android по принципу «сначала Kotlin» и советует начинать новое приложение с него. Нативная разработка — это две кодовые базы, а значит, обычно и два набора специалистов.
Кроссплатформенное приложение пишут один раз и собирают из одного кода под обе платформы. Два самых частых способа устроены по-разному:
- Flutter. Код на Dart заранее компилируется в машинный код телефона, а интерфейс рисует собственный движок Flutter, а не системные элементы платформы. Из того же кода собираются и веб- и десктоп-версии.
- React Native. Интерфейс описывается на JavaScript, а во время работы React Native создаёт настоящие системные элементы Android и iOS.
Мы писали и так, и так — на Flutter, нативно под iOS и под Android и на React Native, — поэтому сравниваем не по рекламным обещаниям. Главная практическая разница — в доступе к возможностям телефона. Нативный код обращается к ним напрямую. Кроссплатформенный дотягивается до них через библиотеки, а где нужной библиотеки нет, кусок пишут отдельно под каждую платформу — о таких кусках ниже, в разделе про сроки и деньги.
Что даёт кроссплатформа
Одна кодовая база, одно поведение на обеих платформах, релизы одновременно, один набор багов вместо двух. Мы делаем на Flutter: наш собственный маркетплейс написан на нём, и это приложение с платежами, чатом, загрузкой видео и ИИ-студией внутри — то есть не витрина.
Для подавляющего большинства продуктов вопрос на этом закрывается.
Когда правильный ответ — нативно
Продукт живёт на возможностях платформы. Тяжёлая работа с камерой прямо во время съёмки, обработка звука, фоновая геолокация как основа продукта, системные виджеты и глубокие интеграции с ОС.
Частота кадров решает. Игры, AR, всё, что должно быть идеально плавным. Это не наш профиль, и мы скажем это прямо.
У вас уже есть нативная команда. Технически правильный выбор, который развалит процесс, — плохой выбор.
Чего кроссплатформа НЕ означает
Не означает, что можно не тестировать на обеих платформах. Android убивает фоновые приложения охотнее, разрешения ведут себя иначе, платёжные шторки выглядят по-разному. Одна кодовая база — не одна среда.
Не означает экономию на бэкенде: он тот же самый и часто дороже клиента.
Не означает, что вторая платформа ничего не стоит. Она дешёвая, но тестирование, публикация и ревью удваиваются.
Что это значит для сроков и денег
Разница считается не в процентах на строку кода, а в том, сколько раз надо сделать одну и ту же работу.
Экраны и логика пишутся один раз вместо двух — это основная экономия, и она заметна сразу.
Платформенные куски всё равно делаются дважды: пуши, оплата в приложении, разрешения, работа в фоне. Их немного, но они всегда есть, и подрядчик, который обещает «ноль платформенного кода», либо не делал этого, либо не считает то, что уже написал за него автор библиотеки.
Проверка и публикация — двойные в любом случае: два стора, два ревью, два набора устройств. Тестировать приложение надо на обеих платформах и на живых устройствах, а не на эмуляторе: половина интересных отказов случается именно на настоящем телефоне.
Итог в наших проектах: кроссплатформа даёт экономию порядка трети на первой версии и больше — на втором году, когда каждая правка делается один раз, а не дважды.
Что делать, если вы уже начали нативно
Частый случай: есть iOS-приложение, теперь нужен Android, и вопрос звучит как «переписать всё или добавить вторую нативную команду».
Третий вариант — оставить рабочее приложение как есть, а вторую платформу сделать кроссплатформенной, договорившись, что общий у них только сервер. Звучит как компромисс и обычно им и является: вы получаете вторую платформу быстрее и дешевле, но живёте с двумя интерфейсными кодовыми базами вместо одной.
Разумно это тогда, когда первое приложение уже приносит деньги и трогать его рискованно. Неразумно — когда оно ещё меняет форму: тогда дешевле один раз свести всё к одной базе и дальше идти вдвое быстрее.
Если нужна только одна платформа
Бывает, что вторая платформа на старте не нужна вовсе: например, все ваши клиенты ходят с iPhone. Где на самом деле ваши пользователи, видно по вашей же статистике, и это решается за один разговор. Тогда разработка приложения для iOS без Android — нормальный первый релиз, и вопрос «нативное или кроссплатформенное приложение» звучит иначе.
Главный довод за кроссплатформу — одна кодовая база на две платформы — в первой версии не работает: платформа одна. Остаётся второй довод: если через полгода понадобится Android, он соберётся из того же кода, и платить придётся за платформенные куски, тестирование, публикацию и ревью, а не за второе приложение. Нативный код под одну платформу оправдан, когда вы уверены, что вторая не понадобится, а продукт держится на возможностях именно этой. Если уверенности нет, дешевле оставить дверь открытой.
Как решить за один разговор
Назовите три вещи: что приложение делает, где им пользуются и есть ли внутри деньги. Этого хватает, чтобы ответить по существу, что вам нужно — нативное или кроссплатформенное приложение, — а не продать то, что удобнее.
У нас разработка мобильного приложения до первого релиза на обеих платформах стоит от 800 000 ₽ и занимает восемь недель. Если после разговора окажется, что вам нужно нативно, мы так и скажем — даже когда это значит, что заказ не наш.
Кстати, спросите заодно, как подрядчик тестирует то, что живёт вне приложения: системное окно разрешений, платёжную шторку, пуш на заблокированном экране. Мы это гоняем автотестами на живом устройстве, и таких сценариев у нашего приложения тридцать.
Соседний разбор: сколько стоит разработка мобильного приложения и что двигает эту цифру.