Перейти к содержимому
Все проекты
02 · МОБИЛЬНОЕ ПРИЛОЖЕНИЕ · ЛИЧНАЯ ОХРАНАНа сайт

Hector: Приложение для iOS и Android со сборкой iOS в облаке

Экраны приложения Hector: выбор охраны, live-трекинг команды, проверка заказа и экран SOS
  • Мобильное приложение
  • Тимлид

Стек:

  • Vue 3
  • TypeScript
  • Vite
  • Capacitor 8
  • Pinia
  • Vue Router
  • vue-i18n
  • VueUse
  • Tailwind CSS 4
  • vee-validate
  • zod
  • maska
  • Vitest
  • Vue Test Utils
  • Storybook
  • oxlint
  • ESLint
  • oxfmt
  • Husky
  • mise
  • Leaflet
  • OpenStreetMap
  • lottie-web
  • View Transitions API
  • miragejs
  • Codemagic
  • TestFlight
  • BrowserStack

использовал я

Роль
Frontend Team Lead
Команда
15 человек: 5 frontend, 4 backend, 2 дизайнера, 2 QA, PM и DevOps
Срок
С июня 2026
Статус
В разработке, демо-сборка для заказчика

Что сделал я

  • Архитектура и стекВыбрал Vue 3 и Capacitor вместо React Native, Flutter и натива. Написал регламенты: Tailwind без отдельных стилей, весь текст через i18n, без as и комментариев, тесты в формате AAA.
  • Старт проектаЗаложил проект: Capacitor с live-reload, Tailwind, Storybook, линтеры, pre-push, окружение через mise, README с запуском в эмуляторе и симуляторе.
  • КодКолёса выбора времени и даты с бесшовной циклической прокруткой, маска телефона, аккордеон, i18n с локалью устройства, первые версии экранов проверки заказа и активного заказа.
  • Команда и заказчикСтавил задачи и приоритеты ещё четырём разработчикам, ревьюил и сливал PR. Анимации, iOS-часть, сигналы и карты они писали по моим задачам. Приложение заказчику презентовал сам.

Контекст

Бизнес

Hector — сервис личной охраны и машин с водителем в Европе и ОАЭ. Клиент заказывает охрану или машину, оплачивает заказ, следит за командой на карте, а в опасной ситуации нажимает SOS.

У агентов охраны свой кабинет: дежурство, назначенные заказы и маршрут, отметка о прибытии, SOS-тревоги клиентов.

Ситуация

Приложения не было: это новый продукт по ТЗ заказчика, разработка с нуля с июня 2026.

Заказчику нужно, чтобы всё работало на iOS и Android. Команда работает удалённо из разных городов, каждый на своём рабочем компьютере, а iPhone и Mac не входят в основной набор устройств разработчика. Поэтому сборку и проверку iOS нужно было организовать так, чтобы они не зависели от устройств на руках. Вдобавок приложение работает с API устройства, например реагирует на двойной стук по задней крышке iPhone.

Процесс, архитектура и решения

Путь заказа

  1. 01КонфигураторОхрана: число агентов, с оружием или без, дресс-код, кинолог K9, язык. Или машина с водителем. Маршрут, дата, длительность. В разработке: состояние заказа в Pinia, колёса выбора даты и времени с бесшовной прокруткой, поиск адреса через Photon и Nominatim, чтобы клиент собрал заказ на одном экране за пару минут
  2. 02ПроверкаКлиент проверяет заказ и отправляет его менеджеру. В разработке: экран проверки заказа и маска телефона, чтобы менеджер получал заказ без ошибок в контактах
  3. 03ОплатаСчёт с разбивкой, таймлайн статусов, заказ можно отредактировать. В разработке: экран активного заказа с таймлайном статусов. При правке заказа клиент возвращается в конфигуратор с сохранёнными данными и не собирает заказ заново
  4. 04Live-трекингКоманда на карте с ETA, кнопка SOS под рукой. В разработке: карта на Leaflet и маршрут через OSRM. Кнопка SOS закреплена на экране, чтобы в опасной ситуации её не пришлось искать

Почему Vue и Capacitor

Стек выбирали по сильным сторонам команды. Фронтенд-разработчики уверенно работают с Vue, и я сам хорошо знаю его экосистему. Поэтому команда с первого дня писала продукт, а не осваивала новый инструмент: это сократило путь до демо и снизило риск ошибок. У связки Vue и Capacitor есть и другие преимущества: один код для iOS и Android, интерфейс на обычном CSS, на котором сложный дизайн Hector с градиентами, стеклом и прозрачностями делается точно по макету, и доступ к возможностям телефона через плагины: биометрии, защищённому хранилищу, системным кнопкам. React Native и Flutter тоже рассматривали, но они дали бы меньше свободы в вёрстке и потребовали бы времени на освоение.

Архитектура

  • APPVue 3 SPA

    В оболочке Capacitor на Android и iOS. Pinia хранит заказ, конфигуратор, назначенные заказы и сигналы.

  • NATIVEНативные плагины

    Биометрия, secure storage для PIN, клавиатура, системная кнопка «Назад», safe area под вырезы iPhone.

  • APIREST бэкенда

    Свой HTTP-клиент с интерцепторами. В демо API подменяет мок-сервер на miragejs, который повторяет контракт.

    • auth
    • configurator
    • orders
  • MAPSКарты

    OpenStreetMap: Leaflet для карты и live-трекинга, Photon и Nominatim для поиска адресов, OSRM для маршрута.

Весь текст идёт через vue-i18n, локаль берётся с устройства, поэтому новый язык добавляется файлом. Мок-сервер повторяет контракт API, и фронтенд с демо не ждут бэкенд.

Тихие сигналы

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

Приложение ловит сигнал через URL-схему, в том числе при холодном старте. Пока это прототип, в демо-сборке он скрыт.

Безопасность данных

Вход в приложение защищён как в банковских приложениях: PIN-кодом, Face ID или отпечатком пальца. PIN хранится в защищённой части телефона, куда нет доступа другим приложениям. Если сессия истекла, приложение само возвращает на экран входа, и посторонний не сможет продолжить работу в чужом аккаунте. Клиенты и агенты охраны видят только свои разделы.

Качество и релизы

Vitest и Vue Test Utils: 177 файлов, около 1700 тест-кейсов рядом с кодом, включая сервисы сессии, PIN, safe area и клавиатуры. Storybook с проверкой доступности. E2E на Playwright пишет другой разработчик по сценариям демо: вход, заказ от конфигуратора до завершения, SOS, профиль, кабинет агента.

  1. pre-push тесты и линт изменённых файлов
  2. Codemagic сборка iOS в облаке
  3. TestFlight приложение на iPhone

Pre-push с тестами и линтом и сборку iOS в Codemagic настроил я. Android собирается подписанным bundle из Android Studio.

Работаем недельными спринтами с демо в конце каждого. Задачи в Jira, ветка на задачу, PR с ревью.

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

Сложности

iOS-сборка в распределённой команде

Проблема
Всё должно работать на iOS. Команда распределена по разным городам и работает на своих устройствах, а iPhone и Mac для сборки и отладки в рабочий набор разработчика не входят. Нужен был способ собирать и проверять iOS без привязки к конкретному устройству.
Решение
Сборку iOS вынесли в облако Codemagic: вариант под симулятор и подписанный .ipa с выгрузкой в TestFlight. Нативный проект патчится скриптом на каждой сборке, иначе приложение из Xcode 27+ закрывается сразу после запуска. Тестировали на облачных устройствах BrowserStack и через TestFlight.
Итог
Приложение дошло до демо под iOS и Android. В демо-сборке закрыты баги, которые видно только на iPhone: двойной тап приближал экран, шапка заезжала под строку состояния, низ шторки уходил под полоску «домой».

Сложный визуал в WebView

Проблема
Градиенты, прозрачности, стеклянная шапка, шторка-параллакс, переходы между экранами: на iOS такой визуал постоянно ломается.
Решение
Интро сделали на Lottie вместо видео: видео много весило и теряло качество. Переходы построили на View Transitions API. При подготовке демо собрали визуальные баги в один список и закрывали по одному.
Итог
Из примерно 20 визуальных багов демо закрыты все, кроме одного. Интерфейс в WebView выглядит как нативное приложение.

Метрики и результаты

  • 26экранов для клиента и агента
  • ~1700тест-кейсов в 177 файлах
  • 55переиспользуемых компонентов
  • 2платформы из одного кода: iOS и Android

Приложение доведено до демо-сборки для заказчика. Бизнес-метрик пока нет: оно ещё не вышло в релиз.

Нужно мобильное приложение для iOS и Android со сложным дизайном?

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