Ejabberd Доставка сообщений, когда приложение прекращено - PullRequest
0 голосов
/ 25 ноября 2018

Я занимаюсь разработкой приложения для чата с использованием сервера ejabberd для IOS и Android.Я также написал модуль для ejabberd, чтобы получать автономные сообщения, отправленные на мой собственный сервер API.

мой собственный сервер API будет отправлять уведомления на платформы IOS / Android с помощью FCM.

На стороне клиента, если приложение находится на переднем плане или в фоне, оно будет оставаться подключенным к ejabberd, а если клиент получит сообщение, то ejabberd отправит статус доставки сообщения.

Я столкнулся с проблемой, когда приложение закрыто (служба не запущена), что означает, что оно не подключено к ejabberd (в автономном режиме).если я отправлю сообщение в это приложение, пока оно не прервано, оно получит уведомление, но сообщение все еще не доставлено.как пометить сообщения как доставленные при получении уведомления, когда приложение завершено.

, чтобы объяснить это более подробно, те же функции работают нормально с WhatsApp:

  • устройство A имеет WhatsAppустановлен и WhatsApp был выключен (прекращено)
  • На устройстве B работает WhatsApp
  • Устройство B отправляет сообщение на устройство A
  • Устройство A получает уведомление WhatsApp
  • Ничего не делая на устройстве A, состояние сообщения на устройстве B помечается как доставленное.

Как реализовать этот сценарий с помощью ejabberd?

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

В случае, если кто-то решил эту проблему, вот решение, которое я реализовал с помощью @ Mickaël Rémond из его ответа.

  • Я настроил ejabberd для отправки автономных сообщений в службу http (ваш собственный сервер), пожалуйста, обратитесь к этой ссылке для получения дополнительной информации о том, как это сделать
  • ваш сервер должен перехватить вышеуказанный вызов и сгенерировать уведомление (FCM) в моем случае и отправить его наустройство-получатель
  • устройство-получатель получит уведомление, которое включает в себя сообщение
  • устройство-получатель вызовет службу http (ваш серверный сервер), которая отвечает за отправку подтверждения доставки исходному отправителю.вам нужно перейти от, к, stanzaId, vhost с этим вызовом
  • внутренний сервер будет использовать ejabberd-api (набор открытых API для управления ejabberd с помощью остальных вызовов API) для отправки сообщения доставки с использованием этого API

обратите внимание также на следующие примечания:

  • отправка сообщения доставки с вашего собственного сервера в ejabberd не удалит их из базы данных ejabberd
  • если пользователь повторно подключился к серверу ejabberd, получатель снова получит сообщение от ejabberd.
0 голосов
/ 27 ноября 2018

Это, вероятно, слишком сложно для простого вопроса переполнения стека, так как вам нужно интегрировать несколько движущихся частей на клиенте и сервере:

  1. При получении push-уведомлений на iOS вам нужно выполнять код в фоновом режиме(вам нужно, чтобы это свойство было установлено в вашем приложении в профиле обеспечения приложения и имел код для его обработки).Клиент инициирует HTTPS-запрос, чтобы сервер знал, что сообщение доставлено.
  2. Вам необходимо иметь конечную точку, которая будет принимать доставленные HTTPS-вызовы и генерировать либо подтверждающее сообщение, либо маркер чата от именипользователь и направьте его в ejabberd.

В реальном мире этого недостаточно, если вы хотите принять во внимание тот факт, что в APNS вы можете иметь только 1 нажатие в очереди.Если у вас есть несколько сообщений, отправленных, когда устройство не находится в сети, вам потребуется, чтобы устройство проверяло все полученные сообщения в автономном режиме на сервере, иначе вы потеряете обмен сообщениями.Вам нужно полагаться на XMPP Message Archive Management (MAM) для обработки этой истории.

Как видите, это не просто несколько десятков строк кода, но требуется реальный дизайн и сложная работа.

...