[英]Issue on retrieve the XMPP archived message from ejabberd server(Chat history)
我使用以下方法來檢索聊天記錄。
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 part中返回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
}
根據您的代碼,我看到您沒有將 xmppMAM 保存在任何地方。 嘗試這個:
private var xmppMAM: XMPPMessageArchiveManagement?
func getArchieveMessages(forUser user:String){
xmppMAM = XMPPMessageArchiveManagement.init()
// Your code
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.