Простой интерфейс, правила, которые держатся: разработка мобильного приложения для встреч
Заметки о проектировании мобильного приложения для iOS и Android, которое должно гарантировать единственное место, опираться на время сервера, переживать обрывы сети и обеспечивать конфиденциальность на уровне API.
Простой интерфейс, правила, которые держатся
Общественное место. Выбранная продолжительность. Два участника. Приложение позволяет предложить активность рядом с собой или присоединиться к ней, не листая фотографии и биографии. За этим намеренно сжатым форматом мы строим продукт, который должен управлять единственным местом, расписанием, обрывами соединения и данными, которые не должны быть видны всем.
Контекст
Выпить кофе, пройтись, сходить на выставку: отправной точкой служат общая активность и общее свободное время. Один человек предлагает, другой присоединяется. Они знакомятся на месте.
Продукт спроектирован и разработан Scopes в Монпелье. Работа охватывает проектирование пользовательского пути, приложение для iOS и Android, бизнес-сервисы, администрирование и сайт-презентацию. Задача состоит в том, чтобы сохранить ясность интерфейса и при этом обработать менее заметные ситуации: два человека бронируют место в один и тот же момент, сетевой ответ приходит после выхода из аккаунта, встреча истекает, пока запрос ждёт своей очереди.
Эти ситуации определяют архитектуру не меньше, чем экраны.
Смоделировать путь прежде, чем множить экраны
Цикл предложения описан явными состояниями и переходами: публикация, бронирование, прибытие, отмена, истечение. Правила собраны в модуле TypeScript, не зависящем от сети и базы данных. Он получает идентичность действующего лица и время, переданное сервером, и решает, возможно ли действие.
Такое разделение позволяет проверить правило с точностью до миллисекунды, не запуская приложение. Оно также исключает ситуацию, когда экран, HTTP-маршрут и автоматическая обработка по-разному истолковывают одно и то же положение дел.
API построен на Fastify и PostgreSQL. Выбор модульного монолита удерживает бизнес-операции в одной транзакции и ограничивает число сервисов, которые нужно эксплуатировать. Контракты валидации общие с клиентами; доступ к SQL остаётся на стороне сервера.
Гарантировать единственное место
Если два человека одновременно нажимают «Присоединиться», место должен получить только один. Решение принимается в транзакции PostgreSQL, которая блокирует соответствующее предложение. Второй запрос поэтому перечитывает уже забронированное состояние.
Время проверяется после получения блокировки: ожидание транзакции не должно позволить присоединиться к активности, начало которой тем временем прошло.
Создание также учитывает повторы после сбоев сети. Каждый запрос несёт ключ, позволяющий распознать его повторение. Если первое создание удалось, но ответ потерялся, новая попытка находит то же предложение. Она не публикует вторую активность. Это поведение тестируется параллельными транзакциями в настоящей базе PostgreSQL.
Искать рядом с собой, по запросу
Приложение использует React Native и Expo, с нативной картой в качестве точки входа. Человек выбирает зону, радиус поиска и ограничения по времени и продолжительности. PostGIS выполняет географический поиск на стороне сервера, с расстояниями в метрах.
Геолокация запрашивается явным действием. Зону можно также выбрать вручную. Перемещение карты не запускает автоматически новый запрос: пользователь подтверждает поиск в отображаемой зоне. Пути не нужно отслеживать его перемещения в фоне.
Обеспечить конфиденциальность на уровне API
Вход основан на номере телефона и коде подтверждения. Путь не требует фотографии, биографии или паспортных данных, которые нужно показывать другим участникам. Это не делает сервис анонимным: данные аккаунта и участия остаются необходимыми для его работы.
На месте каждый может указать примету момента, например «жёлтый рюкзак». Обе приметы раскрываются после двух заявлений о прибытии. Это правило применяется в ответах сервера: скрыть поле на экране было бы недостаточно. Список активностей этих данных не содержит.
Сессии отзываемы, а их токены хранятся в базе в виде хешей. На мобильной стороне асинхронные ответы привязаны к сессии, которая их запросила. Старый запрос не должен снова показать данные после смены аккаунта.
Предусмотреть эксплуатацию с самого начала
У службы поддержки есть внутренний интерфейс, отдельный от мобильного приложения, со своим сервером, своей аутентификацией и выделенной ролью SQL. Обращения можно отслеживать, назначать, закрывать и снова открывать, когда пользователь присылает дополнение.
Чувствительные действия журналируются. Версии обращений позволяют обнаружить устаревшее изменение, например когда два сотрудника работают над одним и тем же вопросом. Повторные попытки после обрыва сети также учитываются.
Разработка идёт полными функциональностями: бизнес-правила, API, персистентность, интерфейс, затем проверка пути. Юнит-тесты покрывают решения; интеграционные тесты проверяют ограничения базы данных; испытания интерфейса проверяют ошибки, повторы и разрывы соединения. Сценарии с имитированными провайдерами остаются отделены от испытаний на реальных сервисах и устройствах.
Что остаётся
У проекта есть реализованный путь создания и участия, географический поиск, проверяемые правила конфиденциальности и инструмент поддержки. Дальнейшая разработка касается, в частности, уведомлений, квалификации внешних интеграций и путей на физических устройствах, а также доводки интерфейса перед мобильной дистрибуцией.
Сайт-презентация продукта уже открыт. Он генерируется в статический HTML на 24 официальных языках Европейского союза. Его анимация синхронизирует два телефона, чтобы объяснить путь; это представление продукта, а не запись экрана нативного приложения. Сайт работает без рекламных трекеров и инструментов аналитики на стороне посетителя.
На момент написания мобильное приложение остаётся в разработке. Поэтому мы пока не представляем результатов использования или масштабного развёртывания. Работа документирует более насущное требование: сделать жест простым для пользователя, не оставляя его правила на волю сети, часов или интерфейса.
Техническая карточка
Используемые технологии: TypeScript, React Native, Expo, Fastify, PostgreSQL, PostGIS, React и Vite для администрирования, Vitest и Docker. Статический сайт на HTML, CSS и JavaScript, генерация на Node.js, хостинг на Railway.
Периметр: проектирование продукта, архитектура, мобильная и серверная разработка, администрирование, тесты и многоязычный сайт.
Статус: продукт Scopes, мобильное приложение в разработке в 2026 году. Название продукта в этой заметке не приводится; мы делимся им по запросу.
Вы готовите мобильное приложение с бизнес-правилами, которые не должны зависеть от сети? Scopes проектирует и разрабатывает приложения для iOS и Android в Монпелье: см. нашу страницу разработка мобильных приложений в Монпелье или опишите ваш контекст.