【问题标题】:XMPPFramework - How to Create Message / Conversation ThreadXMPPFramework - 如何创建消息/对话线程
【发布时间】:2014-01-14 05:14:26
【问题描述】:

我正在使用 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];
    }
}

我是否错过了什么或做错了什么?如何在消息中生成这些信息(例如:消息 ID、线程、xmlns ..)?

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

XMPPFramework 在asmack (https://github.com/Flowdalic/asmack) 中是否有类似ChatManagercreateChat 的内容?

谢谢

【问题讨论】:

    标签: ios xmpp openfire xmppframework


    【解决方案1】:

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

    Thread 元素不是致命的。你可以用也可以不用。

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

    注意:在 Chat State Notifications (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];
        }
    }
    

    【讨论】:

    • 谢谢!对我很有帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-24
    • 1970-01-01
    • 2014-04-27
    • 2012-10-28
    相关资源
    最近更新 更多