Два приложения на React Native поверх API Zapys24: одно для клиента, который записывается, второе для бизнеса, который ведёт день. Оба опубликованы в App Store и Google Play. Вот решения, которые их сформировали.
Два приложения, а не одно с переключателем
У клиента и владелицы салона общего почти нет: один смотрит, записывается и получает напоминания; вторая целый день работает с календарём, персоналом, клиентами и деньгами. Сведение обоих под флажок роли даёт приложение, в котором половина навигации всегда лишняя.
Поэтому они выходят отдельно, но против того же API. Клиентское опирается на карту и поиск, бизнесовое — рабочий инструмент с календарём в центре. И тогда каждая страница в сторе описывает одну вещь, чего и ждут на ревью.
Найти салон, а не список салонов
В клиентском приложении карта стоит первой: геолокация устройства, рендер на Mapbox и результаты, привязанные к тому, что действительно рядом, а не к списку по всей стране. Запись открывается шторкой поверх карты, так что выбор времени не стоит понимания, где это место.
Пуши, которые оправдывают разрешение
Уведомления идут через Firebase Messaging на обеих платформах и категоризируются на сервере, так что напоминание о завтрашнем визите и акция — это не одна подписка.
Разрешение спрашиваем тогда, когда оно имеет смысл — после того, как запись уже есть, — а не на первом запуске. Приложение, которое сжигает запрос на старте, теряет именно тот канал, который ему нужен.
Быстро на плохой связи
Серверное состояние кеширует React Query, а то, что должно пережить холодный старт, ложится в MMKV — достаточно быстрое, чтобы читать синхронно, пока рисуется первый экран. Токены живут в защищённом хранилище платформы, никогда в обычном.
Благодаря этому приложение на мобильном интернете сразу показывает вчерашнее расписание и через мгновение его уточняет, вместо того чтобы крутить спиннер.
Чего потребовали сторы
Подписки, купленные в приложении, проверяются на сервере через библиотеку App Store Server — доступ даёт чек, а не устройство. Удаление аккаунта доступно и внутри приложения, и в вебе, потому что оба стора этого требуют.
Сборки и публикации идут через Expo, что держит нативный проект вне репозитория, а релиз — в одной команде.