Написать пост

Радар.Атланты: как мы внедрили функцию поиска участников бизнес-клуба по геоданным

Аватарка пользователя Бизнес-клуб «Атланты»

Рассказываем, как внедрить поиск пользователей в приложении по геоданным на примере сервиса «Радар.Атланты».

Всем привет! На связи Александр Шраменко, директор по цифровой трансформации бизнеса бизнес-клуба «Атланты». Сегодня я расскажу, как нам удалось внедрить в приложение клуба функцию поиска местонахождения участников на карте, с какими проблемами и сложностями мы столкнулись при этом, как их решали и, конечно, поделимся фрагментами кода.

Что такое бизнес-клуб «Атланты»

Чтобы грамотно объяснить, зачем нам понадобилась функция поиска людей на карте, следует сначала рассказать о самом клубе.

«Атланты» — это закрытое сообщество для предпринимателей, которое решает сразу несколько задач:

  • Нетворкинг и общение. В клубе собраны бизнесмены с оборотом компаний начиная от 60+ млн. рублей, при этом средний оборот компаний резидентов составляет 1,4 млрд в год. Участники могут не только расслабиться в кругу единомышленников, но и завести новых друзей.
  • Развитие бизнеса. Среди участников клуба профессионалы в разных сферах бизнеса: от тяжелой металлургии до консалтинга и ИT. В клубе распространена культура шеринга: каждый из резидентов обладает багажом знаний и опыта в определенной сфере. 
  • Личностный рост. В клубе есть множество форматов общения, проводятся мероприятия для личностного развития и решения индивидуальных запросов.

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

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

«Радар.Атланты»: разработка, особенности, сложности

1. Назначение функции

Главная задача «Радар.Атланты» — показать, где находятся резиденты клуба. Чтобы участник мог найти коллег-предпринимателей поблизости, независимо от того, где он сейчас находится.

Фичу мы внедряли в уже функционирующее приложение «Атланты», которое работает по принципу социальной сети для бизнесменов и топ-менеджеров. Весь процесс разработки «Радара» от идеи до релиза занял 3 месяца. 

Само приложение сделано на фреймворке Flutter, что позволяет нам поддерживать единую кодовую базу для Android и iOS. Flutter упрощает тестирование продукта и обеспечивает более высокую скорость и низкую стоимость разработки, если сравнивать с нативными версиями мобильного приложения для платформ IOS и Android. Для серверной обработки мы используем PHP с фреймворком Symfony и базу данных Postgre SQL.

2. Разработка

Для функции «Радар» мы применили технологии ElasticSearch вместе с одноименным программным продуктом. Именно это позволяет искать резидентов по карте. Также некоторую информацию мы кэшируем, чтобы как можно быстрее доставлять данные на устройство пользователя. Для этого мы используем Redis. Эксплуатируется это всё в облаке провайдера в отказоустойчивом кластере Kubernetes, геораспределенное хранение — в двух дата-центрах.

			public function update(UserGeoInterface $user, float $long, float $lat, int $accuracy): void
    {
        /** @var User $user */
        if ($user->isGeoEnabled()) {
            $point = new UserGeoPoint();
            $point
                ->setAccuracy($accuracy)
                ->setLong($long)
                ->setLat($lat)
                ->setUser($user)
                ->setAppId(AppService::getInstance()->getAppId())
            ;
            $this->_em->persist($point);
            $this->_em->flush();
        } else {
            throw new ApiValidationException('geo service is disabled for this user');
        }
    }
		

Сами геоданные мы получаем стандартными средствами API операционной системы смартфона. При его включенной геолокации данные обновляются раз в десять минут. Тут важно уточнить, что мы никак не храним историю геоданных пользователей — нам доступны только последние координаты, которые при изменении перезаписываются. Это обеспечивает максимальную безопасность резидентов — даже в теории отследить историю перемещений бизнесмена просто невозможно. У нас в Атлантах безопасность наших резидентов превыше всего.   

С клиентской стороны эта функция выглядит максимально просто. Он заходит в приложение, выбирает радиус поиска «Атлантов» с помощью управления масштабом карты на подложке Яндекс.Карт, и если рядом есть участники клуба, он увидит их на карте и сможет с ними связаться. А если нажать на аватарку, то быстро можно попасть в профиль резидента и узнать всю полезную информацию про него, включая оборот бизнеса, сферу деятельности, экспертизу и ресурсы, которыми обладает Атлант.         

Радар.Атланты: как мы внедрили функцию поиска участников бизнес-клуба по геоданным 1

3. Трудности

Самым сложным этапом, что интересно, оказалась совсем не разработка. «Радар» требует доступа к геолокации пользователя, и чтобы добавить ее в приложение, нужно пройти модерацию Google Play и App Store. Общение с представителями маркетплейсов заняло несколько недель. Концепция «Радара» отличается от приложений, которые обычно используют геолокацию. Поэтому пришлось доказывать, как именно эта фича пойдет на пользу клиентам. Мы максимально детально объясняли, как работает функция, как она реализована программно, как хранятся и передаются данные, как обеспечивается безопасность пользователя.

App Store не принимал фичу три раза. У них не было схожих кейсов, и они никак не могли понять специфику функции именно с продуктовой точки зрения: то есть, зачем нам нужно отслеживать геоданные внутри приложения для бизнес-клуба. Пришлось делать отдельный питч, в котором мы разжевали все нюансы. И только тогда доступ к геоданным одобрили.

4. Характеристики

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

Решение получилось простым и изящным. Воспользоваться «Радаром» и увидеть резидентов клуба на карте участник может только, если включит геолокацию у себя и даст приложению к ней доступ. Некоторые используют функцию только время от времени, но примерно у 20-25% всех резидентов клуба «Радар» включен постоянно. Это число стабильно и не падает с момента релиза. Значит, они видят в нем пользу и ценность. Причем, подобная виральная особенность родилась уже во время разработки, изначально мы ее не планировали.

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

Для безопасности резидентов мы внедрили погрешность на карте в 1,5 километра. Смартфон передает точные координаты клиента на сервер, где они намеренно искажаются и затем передаются на карту приложения. По сути «Атланты» видят всех членов клуба в рамках одного города, но эту информацию невозможно использовать в любых других целях.  

Изначально мы тестировали это на эмуляторах с Яндекс.Картами. То есть, вручную вводили координаты с точностью до метра и на выходе получали произвольную точку на карте в радиусе 1,5 км от реального местоположения клиента.

Вот как это реализовано программно:

			$randomLongOffset = random_int(-14, 14) / 1000;  // max: 0.014000;
$randomLatOffset = random_int(-22, 22) / 1000;   // max:0.022000;
$documentData['location'] = [
            'lat' => $point->getLat() + $randomLatOffset,
            'lon' => $point->getLong() + $randomLongOffset,
        ];
		

5. Тестирование

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

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

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

6. Результаты

«Радар.Атланты» мы запустили только месяц назад, и работа над его улучшением активно ведется. К примеру, одна из приоритетных целей в ближайшее время для нас — это оптимизация использования API Яндекс.Карт. Поскольку это платно, нам нужно минимизировать расходы бизнеса на использование нашими резидентами механизма Яндекс.Карт. Сделать это мы планируем с помощью кэширования некоторых клиентских данных, чтобы приложение чаще обращалось за сведениями к внутренним серверам, а не напрямую к базе Яндекса.

В целом «Радар» уже работает как самостоятельный продукт в пределах мобильного приложения «Атланты». При этом у нас уже есть фидбек от пользователей — больше 300 резидентов клуба пользуются поиском на карте для назначения бизнес-встреч, но для запуска полноценной аналитики мы планируем выждать немного времени, чтобы к функции привыкли и перестали ее воспринимать как что-то необычное. Процессом разработки и результатом мы довольны. Получилось ровно то, что планировали — даже чуть лучше. 

162 открытий633 показов