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 ?
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 .