问题描述
我使用以下方法检索聊天记录。
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")
}
函数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",options: .regularExpression) else {
return nil
}
debugPrint(body)
return message
}
,
根据您的代码,我看到您没有在任何地方保存xmppMAM。试试这个:
private var xmppMAM: XMPPMessageArchiveManagement?
func getArchieveMessages(forUser user:String){
xmppMAM = XMPPMessageArchiveManagement.init()
// Your code
}