【问题标题】:How to extract receive message body from XMPPMessage?如何从 XMPPMessage 中提取接收消息正文?
【发布时间】:2018-07-07 11:39:54
【问题描述】:

我收到所有用户发送给我的所有消息。
当我得到结果是 XMPPMessage 类型时,我不知道如何从中提取正文

此问题与获取存档消息有关。

func getALLMessagesFromServerWithXML() {
    let query = try? XMLElement(xmlString: "<query xmlns='urn:xmpp:mam:2'/>")
    let iq = XMLElement.element(withName: "iq") as? XMLElement
    iq?.addAttribute(withName: "type", stringValue: "set")
    iq?.addAttribute(withName: "id", stringValue: "getAllMesseges")
    if let aQuery = query {
        iq?.addChild(aQuery)
    }

    xmppStream.send(iq!)
}

从这个方法得到结果:

func xmppStream(_ sender: XMPPStream, didReceive message: XMPPMessage) {
    print(message)
}

输出

<message xmlns="jabber:client" to="f.talebi@x/1516292205485357040111042" from="f.talebi@x"><result xmlns="urn:xmpp:mam:2" id="1530957470465122"><forwarded xmlns="urn:xmpp:forward:0"><message xmlns="jabber:client" lang="en" to="a.mardani@xmpp.x.ir" from="f.talebi@x.ir/134788006381643425047394" type="chat"><archived xmlns="urn:xmpp:mam:tmp" by="f.talebi@x.ir" id="1530957470465122"></archived><stanza-id xmlns="urn:xmpp:sid:0" by="f.talebi@x.ir" id="1530957470465122"></stanza-id><body>hi 2018-07-07 09:57:49 +0000</body></message><delay xmlns="urn:xmpp:delay" from="x.ir" stamp="2018-07-07T09:57:50.465122Z"></delay></forwarded></result></message>

如何从该输出中提取正文?对于普通消息,我可以通过message.body 获取正文,但对于存档消息,我无法使用此代码获取正文。

根据@andesta.erfan 的回答,我添加了这些代码:

变量:

private var archiving = XMPPMessageArchiveManagement()

在初始化()中

archiving = XMPPMessageArchiveManagement(dispatchQueue: DispatchQueue.main)
archiving?.activate(xmppStream)    
archiving?.addDelegate(self, delegateQueue: DispatchQueue.main)

扩展实现:

extension XMPPHelper: XMPPMessageArchiveManagementDelegate {

    func xmppMessageArchiveManagement(_ xmppMessageArchiveManagement: XMPPMessageArchiveManagement, didReceiveMAMMessage message: XMPPMessage) {
        print(message.body())
    }

}

但是 xmppMessageArchiveManagement 永远不会被调用,xmppStream(_ sender: XMPPStream, didReceive message: XMPPMessage) 在这两种情况下都会被调用。当它是归档消息或普通消息时。

【问题讨论】:

  • 尝试打印:message.body,不知道您访问的情况(message.body),因为它取决于代码。或者试试这个 - NSString *str = [[message elementForName:@"body"] stringValue];
  • 使用mam:1 而不是mam:2

标签: swift xmppframework


【解决方案1】:

对于您应该使用的常规消息:

func xmppStream(_ sender: XMPPStream, didReceive message: XMPPMessage) { print(message.body()) }

出于 MAM 的目的,您应该实现 XmppMessageArchiveManagement 及其委托。它的委托方法之一是这样的:

func xmppMessageArchiveManagement(_ xmppMessageArchiveManagement: XMPPMessageArchiveManagement, didReceiveMAMMessage message: XMPPMessage) { print(message.body) }

您可以使用它打印存档文件。 请注意,您的传出数据包应该是这样的:

`let value = DDXMLElement(name: "value", stringValue: jid)
 let child = DDXMLElement(name: "field")
 child.addChild(value)
 child.addAttribute(withName: "var", stringValue: "with")
 let set = XMPPResultSet(max: 1, before: "")
 XmppMessageArchiveModule.retrieveMessageArchive(at: nil, withFields: [child], with: set)`

max: 1 告诉 MAM 您只需要特定 jid 的最后一条消息。 完成所有操作后,请检查此答案 [service unavailable error in openfire message archive management

【讨论】:

  • 谢谢,总线可以用于普通消息而不是存档消息。
  • 谢谢。我更新了我的问题。我按照你说的做了,但从未调用过 xmppMessageArchiveManagement。
  • @FattanehTalebi 请在此处查看我的另一个答案 [stackoverflow.com/questions/51237997/… 正在使用 mam:2,如果您的服务器是 openfire 它不支持,您应该使用 mam:1
  • 我检查了这个,不幸的是它没有工作。我收到存档消息,但我在 xmppStream 方法中而不是在 xmppMessageArchiveManagement 方法中获得它们。
  • 嗨@andesta.erfan 我尝试使用此代码获取聊天记录,但它不起作用。请查看此链接link 并分享您的答案。
【解决方案2】:

试试这个代码

 - (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message
    {
        NSString *str = [[message elementForName:@"body"] stringValue];
        NSLog(@"%@",str);
    }

【讨论】:

    【解决方案3】:

    Swift 4.2

    XMPPStreamDelegate

    func xmppStream(_ sender: XMPPStream, didReceive message: XMPPMessage) {
         let body = message.body
    }
    

    XMPPMessageArchiveManagementDelegate

    func xmppMessageArchiveManagement(_ xmppMessageArchiveManagement: XMPPMessageArchiveManagement, didReceiveMAMMessage message: XMPPMessage) {
      if let xmppMessage = message.mamResult?.forwardedMessage {
         let body = xmppMessage.body
      }
    }
    

    【讨论】:

    • 你能分享/提供任何项目链接,如 GitHub 吗?我在使用 XMPP 进行核心数据管理时遇到了困难。
    猜你喜欢
    • 1970-01-01
    • 2012-05-04
    • 2017-01-08
    • 2012-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-26
    • 2010-09-19
    相关资源
    最近更新 更多