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

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

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

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

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

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

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

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

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

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

Вы должны настроить сервер 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-сервера:
https://stackoverflow.com/a/38170310/4433653

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

https://github.com/carlosCharz/fcmxmppserver

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

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

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

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

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

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

  public void processPacket(Stanza packet) 

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

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

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

Вот и все. Любые запросы, просто комментарий ниже 🙂

Best Regard R Адитья Гумай