1
votes

i am developing chat app in that i have stuck in two scenario.

1) How to get message status like delivered ,seen etc.. I have done following things :

self.xmppMessageDeliveryRecipts = XMPPMessageDeliveryReceipts(dispatchQueue: DispatchQueue.main)
self.xmppMessageDeliveryRecipts!.autoSendMessageDeliveryReceipts = true
self.xmppMessageDeliveryRecipts!.autoSendMessageDeliveryRequests = true  

but i do't get further idea, how can i further process to check message status ?

2) How to get un-read message count like whatsapp done? For get last recent message i have used below core data object XMPPMessageArchiving_Contact_CoreDataObject

Other Archive Code

self.xmppMessageArchivingStorage = XMPPMessageArchivingCoreDataStorage.sharedInstance();
self.xmppMessageArchiving = XMPPMessageArchiving(messageArchivingStorage: xmppMessageArchivingStorage);
self.xmppMessageArchiving!.clientSideMessageArchivingOnly = true;

but let me know how can i get ur-read message count or help full snippet of code ?

I have alread checked below stack links :

1)How to get the message delivery status using XMPP framework

2)Need assistance regarding using the xep-0184

3)How to get the message read/unread/report in xmpp framework

Server : ejabber

1

1 Answers

3
votes

XMPP provides 'Stream Management' to know whether message is delivered to XMPP server or not.

For that you have to register and activate it. Here is the code.

// Stream Management 
func configureStreamManagement() {
  let xmppSMMS = XMPPStreamManagementMemoryStorage()
  xmppStreamManagement = XMPPStreamManagement(storage: xmppSMMS, dispatchQueue: DispatchQueue.main)
  xmppStreamManagement.addDelegate(self, delegateQueue: DispatchQueue.main)
  xmppStreamManagement.activate(xmppStream)
  xmppStreamManagement.autoResume = true
  xmppStreamManagement.ackResponseDelay = 0.2
  xmppStreamManagement.requestAck()
  xmppStreamManagement.automaticallyRequestAcks(afterStanzaCount: 1, orTimeout: 10)
  xmppStreamManagement.automaticallySendAcks(afterStanzaCount: 1, orTimeout: 10)
  xmppStreamManagement.enable(withResumption: true, maxTimeout: 0)
  xmppStreamManagement.sendAck()
  xmppStream.register(xmppStreamManagement)
}

Call this method after authentication is successful.

func xmppStreamDidAuthenticate(_ sender: XMPPStream!) {
  print("Stream: Authenticated")
  configureStreamManagement()
}

Using the 'XMPPStreamManagementDelegate' you can get the message ids which are delivered to XMPP server.

func xmppStreamManagement(_ sender: XMPPStreamManagement!, didReceiveAckForStanzaIds stanzaIds: [Any]!) {
  if let messageIds = stanzaIds as? [String] {
    for id in messageIds {
      print("Message is delivered to xmpp server: \(id)")
      // TODO: Custom code goes here to change the message status
    }
  }
}

As you have mentioned above, below code will automatically send delivered receipts of client, which means message is delivered to client.

self.xmppMessageDeliveryRecipts = XMPPMessageDeliveryReceipts(dispatchQueue: DispatchQueue.main)
self.xmppMessageDeliveryRecipts!.autoSendMessageDeliveryReceipts = true
self.xmppMessageDeliveryRecipts!.autoSendMessageDeliveryRequests = true 

In 'XMPPStreamDelegate' when message will be delivered to client you will get the receipt message.

func xmppStream(_ sender: XMPPStream!, didReceive message: XMPPMessage!) {
  print("Message From: \(message.from().user)")
  print("Message Body: \(message.body())")
  print("Message is delivered to client -: \(message.receiptResponseID())")
  // TODO: Compare receiptResponseID with sent message's id. 
}