Подтвердить что ты не робот

XMPPFramework - получение архивных сообщений с сервера Openfire

Я разрабатываю приложение для чата для iPhone, используя сервер XMPP и OpenFire, сервер OpenFire сохраняет историю чатов между пользователями, но когда я пытаюсь получить историю чата для конкретного пользователя, я получаю только дату и количество чатов сообщения, но не фактические текстовые сообщения

Я уже установил плагин с открытым архивом для архивирования сообщений на openfire

Это строфа, которую я передал серверу Openfire

    <iq type='get' id='pk1'>
    <list xmlns='urn:xmpp:archive'
    with='[email protected]'>
    <set xmlns='http://jabber.org/protocol/rsm'>
    <max>30</max>
    </set>
    </list>
    </iq>

Это результат, который я получил с сервера

  <iq type="result" id="pk1" to="[email protected]/iphone">
  <list xmlns="urn:xmpp:archive">
  <chat with="[email protected]" start="2012-07-04T13:16:12.291Z"/>
  <chat with="[email protected]" start="2012-07-05T08:25:31.555Z"/>
  <chat with="[email protected]" start="2012-07-05T12:38:24.098Z"/>
  <set xmlns="http://jabber.org/protocol/rsm">
  <first index="0">15</first>
  <last>25</last>
  <count>3</count>
  </set>
  </list>
  </iq>

Это результат, который я хочу и которого я ожидал

 <iq type='result' to='[email protected]/iphone' id='page1'>
 <chat xmlns='urn:xmpp:archive'
    with='[email protected]'
    start='2012-07-04T13:16:12.291Z'
    subject='She speaks!'
    version='4'>
<from secs='0'><body>Art thou not Romeo, and a Montague?</body></from>
<to secs='11'><body>Neither, fair saint, if either thee dislike.</body></to>
.
[98 more messages]
.
<from secs='9'><body>How cam'st thou hither, tell me, and wherefore?</body></from>
<set xmlns='http://jabber.org/protocol/rsm'>
  <first index='0'>0</first>
  <last>99</last>
  <count>217</count>
</set>

Пожалуйста, помогите мне получить желаемый результат

Спасибо

4b9b3361

Ответ 1

Вы должны сделать запрос с <retrieve> (см. http://xmpp.org/extensions/xep-0136.html), тогда вы можете принять определенное время от полученного <list> результат. Например:

Отправить:

    <iq type='get' id='pk1'>
       <list xmlns='urn:xmpp:archive'
               with='[email protected]'>
        <set xmlns='http://jabber.org/protocol/rsm'>
            <max>30</max>
        </set>
      </list>
   </iq>

Получать:

 <iq type="result" id="pk1" to="[email protected]/iphone">
     <list xmlns="urn:xmpp:archive">
      <chat with="[email protected]" start="2012-07-04T13:16:12.291Z"/>
      <chat with="[email protected]" start="2012-07-05T08:25:31.555Z"/>
      <chat with="[email protected]" start="2012-07-05T12:38:24.098Z"/>
      <set xmlns="http://jabber.org/protocol/rsm">
          <first index="0">15</first>
           <last>25</last>
           <count>3</count>
      </set>
    </list>
 </iq>            

Теперь вы выбираете один из start и отправляете (дата и час должны быть точными):

  <iq type='get' id='pk1'>
    <retrieve xmlns='urn:xmpp:archive'
        with='[email protected]''
        start='2012-07-04T13:16:12.291Z'>
     <set xmlns='http://jabber.org/protocol/rsm'>
       <max>100</max>
     </set>
    </retrieve>
 </iq>

Вы получите что-то вроде этого (зависит от максимального значения → max = 30, органов = 30):

   <iq type='result' to='[email protected]/iphone' id='page1'>
      <chat xmlns='urn:xmpp:archive'
             with='[email protected]'
              start='2012-07-04T13:16:12.291Z'
            subject='She speaks!'
       version='4'>
         <from secs='0'><body>Art thou not Romeo, and a Montague?</body></from>
         <to secs='11'><body>Neither, fair saint, if either thee dislike.</body></to>
          .
          [28 more messages]
          .
         <from secs='9'><body>How cam'st thou hither, tell me, and therefore?           </body>   
         </from>
      <set xmlns='http://jabber.org/protocol/rsm'>
       <first index='0'>0</first>
       <last>29</last>
       <count></count>
     </set>
  <iq>

Ответ 2

Чтобы получить определенное время чата

Отправьте его, чтобы получить время:

 NSXMLElement *iq1 = [NSXMLElement elementWithName:@"iq"];
 [iq1 addAttributeWithName:@"type" stringValue:@"get"];
 [iq1 addAttributeWithName:@"id" stringValue:@"pk1"];
 NSXMLElement *retrieve = [NSXMLElement elementWithName:@"list" xmlns:@"urn:xmpp:archive"];
 [retrieve addAttributeWithName:@"with" stringValue:@"[email protected]"];
 NSXMLElement *set = [NSXMLElement elementWithName:@"set" xmlns:@"http://jabber.org/protocol/rsm"];
 NSXMLElement *max = [NSXMLElement elementWithName:@"max" stringValue:@"100"];
 [iq1 addChild:retrieve];
 [retrieve addChild:set];


 [set addChild:max];


 [xmppStream sendElement:iq1];

Чтобы получить историю чата

Используйте дату начала и отправьте:

 NSXMLElement *iq1 = [NSXMLElement elementWithName:@"iq"];
 [iq1 addAttributeWithName:@"type" stringValue:@"get"];
 [iq1 addAttributeWithName:@"id" stringValue:@"pk1"];

 NSXMLElement *retrieve = [NSXMLElement elementWithName:@"retrieve" xmlns:@"urn:xmpp:archive"];
 [retrieve addAttributeWithName:@"with" stringValue:@"[email protected]"];
 [retrieve addAttributeWithName:@"start" stringValue:@"2013-11-18T05:11:53.460Z"];
 NSXMLElement *set = [NSXMLElement elementWithName:@"set" xmlns:@"http://jabber.org/protocol/rsm"];
 NSXMLElement *max = [NSXMLElement elementWithName:@"max" stringValue:@"100"];
 [iq1 addChild:retrieve];
 [retrieve addChild:set];
 [set addChild:max];
 [xmppStream sendElement:iq1];

Ответ 3

Во-первых, для извлечения истории чата из openfire вам нужно установить плагин Open Archive, потому что Monitering Plugin предназначен для мониторинга и регистрации истории чатов на панели администратора, поэтому, как только вы установите Open Archive, вы не получите никакой ошибки с кодом "500",

Вы можете загрузить и узнать, как установить Open Archive со следующих ссылок.

https://nexus.reucon.com/content/repositories/opensource-snapshots/com/reucon/openfire/plugins/archive/

https://maven.reucon.com/projects/public/archive/

Другая проблема в приведенном выше коде заключается в том, что когда вы указываете начальный тег в запросе, он совпадает с чатом с точной меткой времени, почему он возвращает код ошибки "404". Я пропустил начальный тег из моего запроса и написал следующий код, который возвращает всю историю чата с пользователем.

NSXMLElement *iq1 = [NSXMLElement elementWithName:@"iq"];
[iq1 addAttributeWithName:@"type" stringValue:@"get"];
[iq1 addAttributeWithName:@"id" stringValue:@"pk1"];

NSXMLElement *retrieve = [NSXMLElement elementWithName:@"retrieve" xmlns:@"urn:xmpp:archive"];

[retrieve addAttributeWithName:@"with" stringValue:@"[email protected]"];
NSXMLElement *set = [NSXMLElement elementWithName:@"set" xmlns:@"http://jabber.org/protocol/rsm"];
NSXMLElement *max = [NSXMLElement elementWithName:@"max" stringValue:@"100"];

[iq1 addChild:retrieve];
[retrieve addChild:set];
[set addChild:max];
[[[self appDelegate] xmppStream] sendElement:iq1]; 

Здесь это вернет всю историю чата в ответе XML между пользователем Rahul и пользователем, который в настоящий момент вошел в систему.

Для получения более подробной информации см. этот блог http://question.ikende.com/question/363439343236313430

Ответ 4

Быстрая версия извлечения архивных сообщений с сервера openfire Запрос:

func getArchieveMessages(){
        let iQ = DDXMLElement.elementWithName("iq")
        iQ.addAttributeWithName("type", stringValue: "get")
        iQ.addAttributeWithName("id", stringValue: "page1")
        let list = DDXMLElement.elementWithName("retrieve")
        list.addAttributeWithName("xmlns", stringValue: "urn:xmpp:archive")
        list.addAttributeWithName("with", stringValue: "[email protected]")
        let set = DDXMLElement.elementWithName("set")
        set.addAttributeWithName("xmlns", stringValue: "http://jabber.org/protocol/rsm")
        let max = DDXMLElement.elementWithName("max")
        max.addAttributeWithName("xmlns", stringValue: "http://jabber.org/protocol/rsm")
        //(max as! DDXMLElement).setStringValue("30")
        (set as! DDXMLElement).addChild(max as! DDXMLNode)
        list.addChild(set as! DDXMLNode)
        iQ.addChild(list as! DDXMLNode)
        xmppStream.sendElement(iQ as! DDXMLElement)
    }

Ответ:

func xmppStream(sender: XMPPStream!, didReceiveIQ iq: XMPPIQ!) -> Bool {
        let chat = iq.elementForName("chat")
        let chats = (chat as DDXMLElement).children()
        for chat in chats{
            let msg = chat
            let body = (msg as! DDXMLElement).elementForName("body")
            if body != nil{
                if body.stringValue() != nil{
                    //print(body.stringValue()!)
                    chatMessages.append(body.stringValue()!)
                    if msg.attributeForName("jid") == nil{
                        type.append("Send")
                    }
                    else{
                        type.append("Receive")
                    }
                }
            }
        }
        print("Did receive IQ")
        return false
    }

* with - это смещение человека, чьи архивные сообщения вы хотите получить