Чат для Android с использованием XMPP-сервера и облачных сообщений Google (или новых облачных сообщений Firebase) для Push-уведомлений

Я разрабатываю приложение для Android для Android. Я читал в течение нескольких недель о XMPP и Google Cloud Messaging (и Firebase Cloud Messaging), и я все еще очень смущен.

В настоящее время я уже настроил сервер XMPP локально (Ejabberd) и успешно подключил к нему приложение для Android с помощью библиотеки Smack.

Насколько я понимаю, мне нужно использовать GCM или новый FCM для Push-уведомлений, поэтому я уже создал проект в Google Cloud Platform. Мое приложение для Android может подключиться к нему с помощью библиотеки Smack (вместо прямого подключения к моему серверу XMPP). На моем сервере у меня есть небольшое приложение Java, которое также подключается к GCM, используя библиотеку Smack.

Все нормально, пока здесь. Моя большая путаница: Как я могу использовать свой XMPP-сервер с GCM для Push-уведомлений? Каждая документация, примеры, руководства, руководства, которые я нашел для серверных реализаций, просто расскажу, как подключиться к GCM, но ни один расскажите, как использовать мой сервер XMPP совместно с GCM. Что мне не хватает? Мое приложение Java просто подключается к GCM, получает и отправляет сообщения от и до GCM, но мой сервер XMPP просто сидит там, ничего не делая. На самом деле мое приложение для Android и серверное приложение Java используют GCM исключительно, а не мой сервер XMPP.

Я надеюсь, что кто-то может помочь мне понять это в целом, я, очевидно, не хватает некоторых ключевых элементов для достижения этой реализации.

Ответ 1

Вам нужно объединить и Ejabberd и FCM вместе, что и все большие чат-приложения. Для самых основных компонентов есть 3 компонента: сервер приложений, подключенный через XMPP к FCM, Ejabberd и вашему клиентскому приложению.

  • Когда приложение находится на переднем плане, вы используете библиотеку Smack для непосредственного подключения к серверу Ejabberd, отправки сообщений, изменения присутствия пользователя и т.д. Соединение с вашим Ejabberd сохраняется в течение этого времени. Вы не не отправляете сообщения вверх по течению в течение этого времени!
  • Как только пользователь переходит от вашего приложения, вы закроете соединение. Теперь пользователь считается "Away" или "Offline".
  • С этого момента ваш сервер приложений взаимодействует с FCM для отправки нисходящих сообщений на устройство с использованием библиотеки Smack.
  • На клиентском устройстве: вы обрабатываете входящее сообщение и показываете уведомление. С Android N пользователи могут отвечать непосредственно из уведомления. Я предполагаю, что в этом случае вы использовали бы FCM для отправки восходящего сообщения на ваш сервер приложений, поскольку в течение этого времени активное соединение с вашим сервером Ejabberd отсутствует.
  • Как только пользователь ударит уведомление, приложение вернется на передний план, а вы снова подключитесь к Ejabberd и вернитесь к шагу 1.

Это самое базовое описание архитектуры, в которой вы должны достичь того, чего хотите.

Ответ 2

Вам необходимо настроить сервер Java, который подключается к FCM (ранее GCM). Затем вы можете отправлять на своем устройстве восходящее сообщение в FCM, которое затем отправляет это восходящее сообщение на ваш Java-сервер, а затем на этом Java-сервере вы можете обработать это восходящее сообщение для отправки нисходящего сообщения на целевое устройство (устройства). Затем на стороне устройства вы можете обрабатывать те входящие сообщения, которые принимаются, чтобы дать push-уведомление.

Несколько полезных ссылок:

Как отправить восходящее сообщение:
https://firebase.google.com/docs/cloud-messaging/upstream#sample-send

Как получать и обрабатывать последующие сообщения:
https://firebase.google.com/docs/cloud-messaging/downstream#sample-receive

Как я установил пример Java-сервера:
fooobar.com/questions/456923/...

Ответ 3

Это пример проекта java для демонстрации сервера соединений XMPP для обмена облачными сообщениями Firebase (FCM). Этот проект является очень простым автономным сервером, который я разработал как основу более крупного проекта. Это сервер приложений, который мы должны реализовать в нашей среде. Этот сервер отправляет данные в клиентское приложение через FCM CCS Server с использованием протокола XMPP.

https://github.com/carlosCharz/fcmxmppserver

А также я создал видео на YouTube, где я объясняю, что он делает.

https://www.youtube.com/watch?v=PA91bVq5sHw

Надеюсь, вы сочтете это полезным.

Ответ 4

Я также создаю приложение для чата в Android с помощью Smack v.4.1.8, в котором последняя версия Smack, и наш сервер использует ejabberd. Я не использую никаких сторонних разработчиков, таких как GCM или Firebase, чтобы выталкивать нисходящее сообщение от пользователя к пользовательскому сообщению. Если я не ошибаюсь, вы собираетесь использовать GCM или Firebase для нажатия на пользовательское сообщение, если да, просто не делайте этого.

Почему? Протокол TCP продолжает прослушивать прослушиватель вызова, который вы зарегистрировали в приложении, когда соединение установлено и все еще подключено. У Smack есть слушатель, который называется "addAsyncStanzaListener()"

addAsyncStanzaListener используется для прослушивания пакета приема в приложении. Они имеют

 public void processPacket(Stanza packet) 

Вы можете вызвать это, и вы будете слушать пакет за время.

Я занимаюсь исследованиями о стабильном соединении Smack. Большинство Android-смартфонов имеют каждую конфигурацию и ограничение. Мы не можем тестировать все устройства. Здесь мои советы по поддержанию стабильности соединения:

  • Используйте ForegroundService вместо BackgroundService, я предлагаю этот подход, потому что большинство Android-устройств имеют ограничение на приложение, которое работает в фоновом режиме. Они убьют приложение, когда приложение переместится из диспетчера задач. (например, Asus zenphone имеет управление питанием)
  • ForegroundService предотвратит простоя приложения.
  • Register ReconnectingManager
  • Зарегистрировать Pingfailed
  • Зарегистрировать ServerPingWithAlarmManager

И что это. Любые запросы, просто комментарий ниже:)

С наилучшими пожеланиями R Адитья Гумай