ios - 从 ejabberd 服务器检索 XMPP 存档消息的问题(聊天记录)
问题描述
我使用以下方法检索聊天记录。
func getArchieveMessages(forUser user:String){
let xmppMAM = XMPPMessageArchiveManagement.init()
xmppMAM.addDelegate(self, delegateQueue: .main)
xmppMAM.activate(stream)
let xmppDateString = NSDate().addingTimeInterval(-(3 * 24 * 60 * 60)).xmppDateTimeString
var fields: [XMLElement] = []
let start = XMPPMessageArchiveManagement.field(withVar: "end", type: nil, andValue: xmppDateString)
fields.append(start)
let value = DDXMLElement(name: "value", stringValue: user)
let child = DDXMLElement(name: "field")
child.addChild(value)
child.addAttribute(withName: "var", stringValue: "with")
let set = XMPPResultSet(max: 20, before: "")
fields.append(child)
xmppMAM.retrieveMessageArchive(at: nil, withFields: fields, with: set)
}
调用此函数后,我收到了两个代表。即如果在 XMPPResultSet 中给出 20 条消息,我收到了 20 次xmppStreamDidFilterStanza(_ sender: XMPPStream)方法。
func xmppMessageArchiveManagement(_ xmppMessageArchiveManagement: XMPPMessageArchiveManagement, didFinishReceivingMessagesWith resultSet: XMPPResultSet) {
print("didFinishReceivingMessagesWith", resultSet)
}
func xmppStreamDidFilterStanza(_ sender: XMPPStream) {
debugPrint("xmppStreamDidFilterStanza")
}
func 中的响应 xmppMessageArchiveManagement(_ xmppMessageArchiveManagement: XMPPMessageArchiveManagement, didFinishReceivingMessagesWith resultSet: XMPPResultSet)
didFinishReceivingMessagesWith <set xmlns="http://jabber.org/protocol/rsm"><count>364</count><first>1603801030936227</first><last>1603948285226175</last></set>
但是这个方法永远不会被调用。
func xmppMessageArchiveManagement(_ xmppMessageArchiveManagement: XMPPMessageArchiveManagement, didReceiveMAMMessage message: XMPPMessage) {
if let body = message.mamResult?.forwardedMessage{
print("didReceiveMAMMessage", body)
}
print("didReceiveMAMMessage", message)
}
如果有人遇到此问题并已解决或任何已知要解决的问题,请分享您的答案。
解决方案
下面的代码之前我用于消息获取委托。它完全错误
func xmppStream(_ sender: XMPPStream, willReceive message: XMPPMessage) -> XMPPMessage? {
guard let body = (message.body?.replacingOccurrences(of: "\t", with: String.empty))?.replacingOccurrences(of: "\\s+$", with: String.empty, options: .regularExpression) else {
return nil
}
debugPrint(body)
return message
}
返回消息是获取历史消息所必需的。以前我在 guard let 部分返回 nil 值
返回零
func xmppStream(_ sender: XMPPStream, willReceive message: XMPPMessage) -> XMPPMessage? {
if let forwardedMessage = message.mamResult?.forwardedMessage{
debugPrint(forwardedMessage)
return message
}
guard let body = (message.body?.replacingOccurrences(of: "\t", with: String.empty))?.replacingOccurrences(of: "\\s+$", with: String.empty, options: .regularExpression) else {
return nil
}
debugPrint(body)
return message
}
推荐阅读
- javascript - Storybook 在preview-head.html 中的所有链接和脚本的http: 之后添加一个句点,如何删除它
- python - 如何在虚拟环境中调用python函数?
- swiftui - 如何从分页的 ScrollView (TabView) 添加/删除视图
- javascript - TypeScript 中的 ParallelJs,其中输入和输出数据属于不同类型
- perl - 无论如何要判断 perl 脚本是否通过 do 运行?
- spring-boot - 使用 SpringPhysicalNamingStrategy 的 Spring Boot 多数据源
- python - 当大小/索引不同时,我们如何从另一个数据帧将字段添加到数据帧?
- java - 我可以从数据库 sqlite 存储和检索 .kml 文件吗
- pandoc - pandoc 可以按引用顺序生成参考书目吗?
- mysql - 良好的实施