Ответ 1
Чтобы добавить чат в приложение для Android, есть несколько вариантов. Я представлю варианты, заказанные по количеству необходимых знаний о развитии, от наименьшего к большинству.
Использование бэкэнд-службы реального времени
Существует несколько компаний, предлагающих бэкэнд-услуги в режиме реального времени. Эти службы предоставят вам SDK, который позволяет вашему приложению получать доступ к своим серверам. Используя SDK, вы сможете передавать данные между устройствами.
Вот список самых популярных сервисов:
Google использует базу данных реального времени, которая использует WebSockets и MongoDB в качестве основного стека технологий. Служба позволяет сохранять данные в базе данных без SQL, а затем регистрироваться для получения обновлений в режиме реального времени при изменении этих данных. Они также предлагают услуги для push-уведомления и хранения файлов. Существует также сторонняя платформа обмена сообщениями с открытым исходным кодом, доступная для iOS и Android.
У Firebase есть библиотека под названием GeoFire, которая позволяет вам определить местоположение вашего приложения.
Я сгруппировал их вместе, потому что они очень похожи. Они обеспечивают поточную инфраструктуру и технологию реального времени. Вы можете устанавливать каналы между группами устройств и потоковыми данными между ними. Они не предоставляют никаких средств для аутентификации пользователей, поэтому вам нужен сервер приложений.
Quickblox нацелен именно на рынок обмена мгновенными сообщениями, и они используют сервер XMPP на сервере. Поскольку они используют XMPP, эта служба имеет множество функций обмена сообщениями, встроенных в списки конфиденциальности и индикаторы ввода. Они обеспечивают разумное, но базовое приложение для обмена сообщениями.
Слой находится на полпути между Quickblox и PubNub/Pusher. Они предлагают поточную платформу, предназначенную для обмена мгновенными сообщениями. У них есть некоторые функции обмена сообщениями, такие как базовая блокировка, но это не полноценная реализация сообщений, например Quickblox. У них есть библиотека компонентов пользовательского интерфейса, которые можно использовать для создания полного приложения - Atlas.
Если вы используете бэкэнд как услугу, вам всегда придется самостоятельно создавать клиентский чат. Если вы перейдете к одной из наиболее универсальных опций, таких как Firebase, вам также понадобится создать собственный протокол обмена сообщениями.
Эти службы сэкономят ваше время, когда дело доходит до реализации сервера в реальном времени, конфигурации сервера и масштабирования.
XMPP
Другой вариант - разместить сервер XMPP самостоятельно. Доступно несколько серверов XMPP с открытым исходным кодом:
Серверы XMPP предоставят вам большое количество функций обмена сообщениями из коробки. Как правило, они не содержат информации о местоположении, но это можно решить, настроив сервер на размещение пользовательской базы данных на отдельном сервере, что позволит вам добавить дополнительные таблицы для обработки геолокации. Альтернативой может быть использование присутствия для обновления соответствующих устройств, когда местоположение пользователя изменилось на определенную величину.
Чтобы создать клиент, я бы рекомендовал использовать Smack. Поскольку XMPP является открытым стандартом, ваш клиент должен иметь возможность работать с сторонними серверами и клиентами XMPP.
Если вы не хотите самостоятельно строить клиент, существует ряд проектов с открытым исходным кодом (в основном по копиям левой лицензии), которые могут служить отправной точкой. Xabber будет одним из примеров, но вы можете найти больше, выполнив поиск. Кроме того, вы можете использовать этот коммерческий проект с открытым исходным кодом.
Создание сервера самостоятельно
Последний вариант - создать сервер обмена сообщениями самостоятельно. Это имеет то преимущество, что вы можете добавить необходимые вам функции и держать их достаточно простыми. Хорошим подходом было бы использовать Symfony и WebSocket Bundle для задней части реального времени и Android WebSockets для клиента. Используя этот подход, у вас будет много гибкости, реализующей функциональность геопозиционирования.