如何在XMPP iOS中获取消息传递,查看,失败和未读消息计数? (Swift 3.0)

时间:2017-08-08 13:47:29

标签: ios swift xmpp ejabberd xmppframework

我正在开发聊天应用,因为我陷入了两种情况。

1)如何获得交付,看到等消息状态。    我做了以下事情:

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

但是我没有进一步的想法,我如何进一步处理以检查消息状态?

2)如何获取像whatsapp那样的未读消息计数?    为了获取我在核心数据对象XMPPMessageArchiving_Contact_CoreDataObject

下面使用的最新消息

其他档案代码

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

但请告诉我如何才能获取详细信息或帮助完整的代码片段?

我已经检查了下面的堆栈链接:

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

服务器:ejabber

1 个答案:

答案 0 :(得分:3)

XMPP提供“ 流管理” ,以了解是否将邮件传递到XMPP服务器。

为此,您必须注册并激活它。 这是代码。

// 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)
}

身份验证成功后调用此方法。

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

使用“ XMPPStreamManagementDelegate ”,您可以获取传递到XMPP服务器的消息ID。

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
    }
  }
}

如上所述,下面的代码将自动发送已交付的客户收据,这意味着消息已交付给客户。

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

在“ XMPPStreamDelegate ”中,当邮件将发送到客户端时,您将收到回执邮件。

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