it-roy-ru.com

Приложение чата для Android, использующее сервер XMPP и Google Cloud Messaging (или более новую версию Firebase Cloud Messaging) для push-уведомлений

Я разрабатываю приложение чата для 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-сервер.

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

13
Santiago Fermín

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

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

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

10
Nimrod Dayan

Вы должны настроить сервер 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

4
Riley MacDonald

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

https://github.com/carlosCharz/fcmxmppserver

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

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

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

4
Carlos Becerra Rodriguez

Я также создаю приложение для чата в 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. Зарегистрировать серверPingWithAlarmManager

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

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

1
raditya gumay

Ваше предложение действительно для соединения с tcp/ip, которое никогда не прерывается. что не так в мобильной сети 3G/4G. Таким образом, в реальной сети 3G/4G мобильный клиент/приложение может находиться в состоянии зомби (отключено) .. Вот почему вам нужен Firebase/FCM, чтобы прийти в игру.

0
TC Juan