Search code examples
xmppejabberdwhatsappejabberd-moduleejabberd-hooks

Ejabberd Message delivery while application is terminated


I am developing a chat app using ejabberd server for both IOS and Android. I also wrote a module for ejabberd to get the offline messages sent to my own server api .

my own server api will send notifications to the IOS/Android platforms using FCM.

On the client side , if the application is in the foreground or the background , it will stay connected to ejabberd and if the client receives the message then ejabberd will send the message delivery status.

I am facing an issue while the app is terminated ( service is not running ) which means it is not connected to ejabberd (offline) . if i send a message to this app while it is not terminated , it will receive a notification but the message still undelivered . how can mark the messages as delivered when receiving the notification while the app is terminated.

to explain it more , the same functionality is working fine with whatsapp :

  • device A has whatsapp installed and whatsapp was turned off (terminated)
  • Device B has whatsapp running
  • Device B sends a message to device A
  • Device A receives a whatsapp notification
  • Without doing anything on Device A , the message status on Device B is marked as delivered .

How can I implement this scenario with ejabberd ?


Solution

  • In case someone went into this issue , here is the solution that I implemented with help of @Mickaël Rémond from his answer.

    • I configured ejabberd to send the offline messages to an http service ( your own server) please refer to this link for further on how to do it
    • your server should catch the above call and generate a notification message (FCM ) in my case and send it to recipient device
    • recipient device will catch the notification which includes the message
    • recipient device will call http service (your own server backend)that responsible for sending the deliver ack to the original sender . you need to pass from, to , stanzaId , vhost with this call
    • backend server will use ejabberd-api (set of exposed apis to manage ejabberd through rest apis calls) to send delivery message using this api

    please note the following notes also :

    • sending the delivery message from your own server to ejabberd will not delete them from ejabberd database
    • if the user re-connected to the ejabberd server then the recipient will receive the message again from ejabberd .