在iOS中从XMPP服务器检索归档消息

8
我正在将XMPP功能集成到我的iOS应用程序中,但遇到了一个无法解决的问题。 问题是我无法从服务器获取归档的消息。我的客户端能够登录,并且我已经成功测试了几个服务调用(发送、接收消息、获取有关用户的信息)。
发送后,
<iq type='get' id='pref1'>
  <pref xmlns='urn:xmpp:archive'/>
</iq>

响应是

SEND: <iq type="get"><pref xmlns="urn:xmpp:archive"/></iq>

RECV: <iq xmlns="jabber:client" type="error" to="1@iis2/ae76edc"><error code="501"    
type="cancel"><feature-not-implemented xmlns="urn:ietf:params:xml:ns:xmpp-
stanzas"/</error></iq>

服务器管理员可以查看已存档的消息,因为他激活了归档功能。

要实现此功能,是否需要在服务器或客户端执行某些操作?查看旧消息和服务器实际实现并支持XEP-0136,这两者是否不同?


一个简短的更新,看起来由管理员添加的监控插件不支持检索消息的(XEP-0136)。我们添加了开放式存档插件,但仍然没有任何作用。 - Simon
你解决了这个问题吗?我也收到了同样的错误信息。 - DevCali
@Developer007 不,我不得不放弃这个想法。我认为这是一些根本行不通的东西。也许这一年里有些变化,但目前我们只有客户端存档和xmpp。 - Simon
我们也在尝试实现类似的东西。如果你成功了,请记得你可以回答自己的问题。 - JM Hicks
@Developer007 你的 XMPP 服务器连接了哪种数据库? - Simon
2个回答

1
如果你想从服务器获取数据,使用这段代码。
  internal var xmppMAM: XMPPMessageArchiveManagement?

func setupXMPPMam(){
    xmppMAM = XMPPMessageArchiveManagement.init()
    xmppMAM?.addDelegate(self, delegateQueue: .global(qos: .background))
    // stream is XMPPStream
    xmppMAM?.activate(stream)
}

在XMPP连接后调用setupMam函数

  func retrieveArchiveMessage(){
    let set = XMPPResultSet(max: totalCount)
    xmppMAM?.retrieveMessageArchive(at: XMPPJID(string: user), withFields: nil, with: set)
  }

 func xmppStream(_ sender: XMPPStream, willReceive message: XMPPMessage) -> XMPPMessage? {
    if let forwardedMessage = message.mamResult?.forwardedMessage{
      debugPrint(forwardedMessage)
      return message
    }
  }

如果您使用Robbiehanson框架,上述代码可以完美地从服务器获取值。
我希望这篇文章对您有用@ Akash Thakkar

0

在Swift 4中获取归档消息的示例

声明并初始化变量XMPPMessageArchivingCoreDataStorage,在其中初始化XMPPStream

var xmppMessageStorage: XMPPMessageArchivingCoreDataStorage?
var xmppMessageArchiving: XMPPMessageArchiving?

xmppMessageStorage = XMPPMessageArchivingCoreDataStorage.sharedInstance()
    xmppMessageArchiving = XMPPMessageArchiving(messageArchivingStorage: xmppMessageStorage)

    xmppMessageArchiving?.clientSideMessageArchivingOnly = true
    xmppMessageArchiving?.activate(stream)
    xmppMessageArchiving?.addDelegate(self, delegateQueue: DispatchQueue.main)

通过这样做,每当一条消息到达时,它将被归档,无需进行其他操作。

然后,要检索已归档的消息

func RecibedMessageArchiving(idFriend: String) {

    let JabberIDFriend = idFriend   //id friend chat, example test1@example.com


    let moc = xmppMessageStorage?.mainThreadManagedObjectContext
    let entityDescription = NSEntityDescription.entity(forEntityName: "XMPPMessageArchiving_Message_CoreDataObject", in: moc!)
    let request = NSFetchRequest<NSFetchRequestResult>()
    let predicateFormat = "bareJidStr like %@ "
    let predicate = NSPredicate(format: predicateFormat, JabberIDFriend)

    request.predicate = predicate
    request.entity = entityDescription

    //jabberID id del usuario, cliente
    var jabberIDCliente = ""
    if let jabberj = globalChat.value(forKey: "jabberID"){
        jabberIDCliente = jabberj as! String
    }


    do {
        let results = try moc?.fetch(request)

        for message: XMPPMessageArchiving_Message_CoreDataObject? in results as? [XMPPMessageArchiving_Message_CoreDataObject?] ?? [] {

            var element: DDXMLElement!
            do {
                element = try DDXMLElement(xmlString: (message as AnyObject).messageStr)
            } catch _ {
                element = nil
            }

            let body: String
            let sender: String
            let date: NSDate
            let isIncomings: Bool
            if message?.body != nil {
                body = (message?.body)!
            } else {
                body = ""
            }



            if element.attributeStringValue(forName: "to") == JabberIDFriend {
                sender = jabberIDCliente
                isIncomings = false

            } else {
                sender = "test2@example.com"
                isIncomings = true

            }


                var m: [AnyHashable : Any] = [:]
                m["msg"] = message?.body

                print("body", message?.body)

                print("test", element.attributeStringValue(forName: "to"))
                print("test2", element.attributeStringValue(forName: "body"))


        }
    } catch _ {
        //catch fetch error here
    }

}

1
以上方法无法正常工作,如果有其他方法或链接可以从Ejabberd服务器获取聊天记录。 - Abishek Thangaraj
1
@AbishekThangaraj,你有找到任何可行的解决方案来查找两个人之间的聊天记录吗?如果有,请帮帮我。 - Akash Thakkar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接