ИП Юшков
Маркетинг, дизайн, реклама
Россия, Москва
iOS, Android
Октябрь 2024
Мы получили заказ на разработку инновационного решения для нетворкинга. Приложение должно использовать геолокацию для поиска потенциальных контактов на мероприятиях. Дополнительная функция — встроенный чат для мгновенной связи с найденными контактами. О нем мы сегодня и расскажем.
Технический стек
В приложении были использованы следующие технологии:
Фронт
Ktor – библиотека, которая реализует сетевой стек (HTTP, WebSocket) для платформ с поддержкой плагинов для расширения функциональности.
Kotlin Multiplatform – фреймворк, который позволяет использовать общую кодовую базу для бизнес-логики приложений разных платформ.
SwiftUI – фреймворк для создания пользовательского интерфейса на iOS.
Jetpack Compose — UI-фреймворк, изначально предназначенный для Android, но позже реализованный и для других платформ.
Koin – библиотека для инъекции зависимостей, простая и лаконичная. Отличный выбор для быстрого старта.
Бэк
.NET 7
Docker
RabbitMQ
Kubernetes
WebSocket
Elasticsearch
PostgreSQL
MongoDB
Провели оценку с проектированием и стартовали
Перенесли все задачи в YouTrack. Собрали команду из четырех разработчиков: один — бэкенд, два — «Андроид» и один — iOS.
Обеспечили постоянное соединение между сервером и приложением
Для этого использовали протокол WebSocket.
Через TCP handshake он устанавливает нужное нам постоянное и двустороннее соединение между сервером и приложением. И позволяет получать сообщения ровно тогда, когда вам их отправили.
А ещё с ним клиент периодически пингует сервер, чтобы проверить соединение. Сервер отвечает — понг, а если нет — соединение закрывается.
Разработали подключение к сокетам и реализовали сокет-методы
Искали инструмент для ведения документации по сокет-методам, выбирали между Swagger или Postman. Swagger — хорошая штука для документирования и тестирования API, но в ней нельзя тестировать сокеты. Постман удобен для тестирования и API и сокетов, но документацию вести сложно. Поэтому тестировали в Постмане, а документацию вели в Google Docs.

Разработали решение для пагинации сообщений
Пагинация — функция, которая позволяет приложению загружать только необходимый объем данных. Это гораздо быстрее, чем ждать открытия всего контента — особенно в условиях медленного интернет-соединения.
Всё приложение написано на Kotlin Multiplatform. Но оказалось, что этот фреймворк не поддерживает пагинацию сообщений.
Разработали решение с нуля, причем оно стало мультиплатформенным, то есть работает на «Андроид» и iOS.
Избавили приложение от внеплановых перезапусков
Трудности возникли при работе с системой навигации в Jetpack Compose Configuration. Например, когда пользователь открывал чат из списка контактов или нажимал на пуш, приложение перезагружалось.
Чтобы это поправить, отказались от автоматической обработки и переписали навигацию вручную. Каждую ситуацию программно реализовывали и досконально тестили.
Отладили пуши
Бывало, что уведомления появлялись уже после того, как пользователь вышел из своего аккаунта.
Чтобы решить эту проблему, отправляли на сервер сразу два сигнала — идентификатор пользователя и флажок. Последний дополнительно уточнял для бекэнда, нужно ли в этом случае отправлять пуш-уведомление.
Постоянно созванивались, чтобы решить все технические трудности — с командой и заказчиком
Спорили, предлагали разные способы решения, обсуждали и выбирали оптимальный путь.
А в итоге сделали продукт, который полностью отвечает ожиданиям клиента.
Вот что мы реализовали в рамках проекта
Экран чата и списка чатов
Статусы online/offline и последняя активность пользователей
Статусы прочтения сообщений
Отправка ссылок и эмоджи
Пуш-уведомления
Отображение последнего сообщения на экране списка чатов
Динамическое появление нового сообщения
Локальное хранение сообщений
Удаление диалогов/сообщений
![]()
Анна Сабадаш
Операционный директор
Спасибо всем, кто дочитал до конца. И отдельная благодарность нашему заказчику за терпение. Верим, что проект взлетит, а мы сделаем для него еще немало крутых фич.
Подписывайтесь на наш тг-канал https://t.me/+e3YmBK7CjcQ2ZTRi там мы рассказываем как меняем позиционирование и работаем с топами рынка. А ещё просто делимся буднями и ищем людей в команду.