XMPPFramework - 如何创建消息/对话线程

时间:2013-12-26 14:43:31

标签: ios xmpp openfire xmppframework

我正在使用XMPPFramework(https://github.com/robbiehanson/XMPPFramework)处理iOS聊天客户端,任何人都可以帮我聊聊和留言。 我使用Spark(http://www.igniterealtime.org/projects/spark/index.jsp)来测试我的iOS聊天客户端。

我发现Spark在Openfire服务器日志中发送的消息XML格式如下:

<message id="nBT3N-161" 
         to="aaa@demo.com/7beebb67" 
         from="bbb@demo.com/Spark 2.6.3" 
         type="chat">
    <body>testing message ...</body>
    <thread>FIoMFD</thread>
    <x xmlns="jabber:x:event"><offline/><composing/></x>
</message> 

XML格式的消息有id:

id="nBT3N-161"

和线程ID:

<thread>FIoMFD</thread>

和其他信息:

<x xmlns="jabber:x:event"><offline/><composing/></x>

但是,当我使用XMPPSteam发送消息时,Openfire日志中的消息XML格式如下:

<message type="chat" 
         to="bbb@demo.com/Spark 2.6.3" 
         from="aaa@demo.com/7beebb67">
    <body>tttttttttttttttt</body>
</message>

消息XML格式不包含消息ID,线程ID和xmlns信息。我的代码如下:

- (IBAction)didSendingMessage:(id)sender
{
    NSString *messageStr = self.messageTextField.text;
    if([messageStr length] > 0) {
        NSXMLElement *body = [NSXMLElement elementWithName:@"body"];
        [body setStringValue:messageStr];

        NSXMLElement *message = [NSXMLElement elementWithName:@"message"];
        [message addAttributeWithName:@"type" stringValue:@"chat"];
        [message addAttributeWithName:@"to" stringValue:@"bbb@demo.com/Spark 2.6.3"];
        [message addChild:body];

        [imManager.xmppStream sendElement:message];
        self.messageTextField.text = @"";

       [self.tView reloadData];
    }
}

我是否错过了什么或做错了什么?如何在消息中生成这些信息(例如:message id,thread,xmlns ..)?

或者如何创建消息线程或会话线程?

XMPPFramework在ChatManagerhttps://github.com/Flowdalic/asmack)中是否有createChatasmack的内容?

由于

1 个答案:

答案 0 :(得分:7)

您可以使用+[XMPPStream generateUUID]-[XMPPStream generateUUID]方法或任何其他方法为您的邮件生成唯一ID。

线程元素不是致命的。你可以使用或不使用它。

名称空间为jabber:x:event的XML元素在 XEP-0022 中定义。 AFAIK XMPPFramework 未实现它。但是你可以自己实现它。您可以在XEP-0022 Message Events找到信息。正如您所见,不再推荐使用此扩展程序:

  

注意:此功能的更多现代协议扩展已在聊天状态通知(XEP-0085)1中为撰写和离线事件以及在邮件传递收据(XEP-0184)[2]中定义。交付和展示的活动;那些规格取代了这一规定。

所以,你的最终代码可以是:

- (IBAction)didSendingMessage:(id)sender
{
    NSString *messageStr = self.messageTextField.text;
    if([messageStr length] > 0) {
        NSXMLElement *body = [NSXMLElement elementWithName:@"body"];
        [body setStringValue:messageStr];

        NSXMLElement *message = [NSXMLElement elementWithName:@"message"];
        [message addAttributeWithName:@"type" stringValue:@"chat"];
        [message addAttributeWithName:@"to" stringValue:@"bbb@demo.com/Spark 2.6.3"];
        [message addChild:body];
        NSXMLElement * thread = [NSXMLElement elementWithName:@"thread" stringValue:@"SomeThreadName"];
        [message addChild:thread];
        [message addAttributeWithName:@"id" stringValue:[imManager.xmppStream generateUUID]];

        [imManager.xmppStream sendElement:message];
        self.messageTextField.text = @"";

       [self.tView reloadData];
    }
}