Общение посредством цифровых устройств часто кажется нам поверхностным, особенно в сравнении с личным контактом. Авторы приложения FreeforLunch задумались, как преодолеть эту проблему, используя возможности смартфонов для встреч в реальной жизни. Решение пришло быстро: создать специальный сервис, позволяющий каждому подписчику найти компанию для обеда или ужина в любимых местах города в радиусе своего местоположения. Эта идея стала основой для приложения.
Azoft разработал приложение в строгом соответствии с требованиями заказчика. Готовое решение включает объёмную серверную часть для распределения большой нагрузки на сервер и широкий пользовательский функционал. FreeforLunch выгодно отличается от других приложений для знакомств, совмещая в себе функции соцсети, мессенджера и геолокационного сервиса. Яркий дизайн и user-friendly интерфейс успешно дополняют друг друга и завершают концепцию приложения.
Виды работ
Приложенные усилия: 3500 – 4000 человеко-часов
Технологии: iOS, Android, Java, Spring, Hibernate, Postgres, REST
На начальном экране отображается карта с актуальными событиями и активными пользователями. С помощью меню пользователь может искать или создавать события и приглашать других пользователей на встречи.
Когда пользователь создает событие, например, ланч в кафе, приложение публикует ланч с указанием места и времени, и встреча становится доступной для всех активных пользователей. В своих личных профайлах пользователи могут просматривать информацию о предстоящих событиях, участниками или организаторами которых они являются.
Помимо основных функций, связанных с событиями, пользователям доступны дополнительные возможности: добавляться друг к другу в друзья и обмениваться личными сообщениями.
По расширенной подписке для пользователей становятся доступными приятные бонусы: отключение рекламы, виртуальные подарки для друзей, VIP-статус, чтобы выделиться среди других пользователей.
С первого взгляда проект Free for Lunch казался простым и легко выполнимым, но чем глубже мы погружались в работу, тем больше понимали, что это не так. Всё сводилось к вопросу: как реализовать заявленный функционал, сохранив при этом простую и удобную навигацию внутри приложения.
В соответствии с поставленными задачами мы подготовили прототипы экранов приложения, где учитывались все возможные действия пользователя.
Изначально мы развивали идею, в центре которой был поиск партнёра для бизнес-ланча, в том числе с целью обсуждения деловых вопросов. В деловой сфере важно успевать всё вовремя. Учитывая этот принципиальный момент, мы разработали цветовую шкалу времени, бегунок на которой показывал период интересного пользователю бизнес-ланча. Чем ближе к текущему времени был бизнес-ланч, тем теплее был его цвет на шкале. В результате пользователь мог отслеживать ближайшие встречи по списку ланчей, каждый из которых был отмечен своим цветом.
Весь дизайн был реализован в соответствии с этой идеей. Однако на практике пользователи больше заинтересовались не поиском ланчей, а созданием встреч и новыми знакомствами. Поэтому мы решили отказаться от цветовой шкалы времени, расставив акценты в пользу создания событий. Цветовое решение сохранилось только в отношении символов на карте – когда время ланча приближается, его значок принимает более тёплый оттенок.
Из-за большого объема фотографий, которые пользователи загружают в личные профайлы, требовалось решить задачу распределения нагрузки на сервер. В результате, мы предусмотрели возможности пиковых нагрузок на сервер и разделили приоритетность функционала. Например, если приложение одновременно откроют тысячи пользователей, то более важно, чтобы сервер поддерживал обмен сообщениями и создание событий, чем подгружал все фотографии подписчиков.
Еще одной непростой задачей оказалось равномерное распределение пользователей и событий на карте. Когда пользователь делает свой профайл видимым или создаёт событие, на карте отображается пин. Сначала, при большом количестве созданных пинов происходило наложение событий и рендеринг карты тормозил.
Для того чтобы карта не выглядела визуально перегруженной, мы хотели сделать кластеризацию. Однако это было проблематично выполнить в рамках разработанной концепции дизайна пинов и pop-ups. Поэтому мы придумали и реализовали систему кэширования и фильтрации пользователей и событий.
В первой версии мобильный клиент передавал серверу данные о радиусе и центре пинов, а сервер отдавал клиенту ограниченное число пинов – до 100, включая и пользователей, и события. Эта реализация привела к тому, что на карте все пины отображались ближе к центру. Требовалось уйти от неудобного визуального представления. Для этого на сервере был разработан алгоритм передачи сбалансированного числа пинов в зависимости от их радиуса.
Радиус поиска пинов разбивается на 10 равных частей, представляющих собой окружность. Для каждой части рассчитывается и отмечается определённое количество пользователей, пины которых могут попадать в радиус этой части. Выбранные пины возвращаются мобильному клиенту.
В то же время, в мобильном клиенте была реализована система кэширования данных, позволяющая при изменении зума “почистить” пины по радиусу. Проще говоря, когда в радиус одного пина попадают другие, при уменьшении зума окружающие пины исчезают из общего радиуса и распределяются по карте. Мы реализовали это следующим образом: рассматриваем радиус каждого пина и убираем близлежащие события, чтобы подчистить кэш.
Мы также разработали алгоритм очистки кэша за пределами большого радиуса. Например, пользователь FreeForLunch находится на уровне одного города, а затем решает сменить город для поиска ланчей и переходит на новую карту. В этом случае разработанный нами алгоритм освобождает кэш от всех прошлых пинов, чтобы освободить место для новых.
Приложение FreeforLunch доступно во всех крупных городах России и продолжает развиваться. Поддерживает русский, английский и испанский языки. Является бесплатным и открытым для скачивания в AppStore и Google Play. Для пользователей предусмотрен пакет расширенных функций по платной подписке.