XMPPFramework中消息的“正在输入”状态

3

我正在使用robbiehanson/XMPPFramework进行我的当前项目。 如何使用XMPPFramework获取消息输入状态?现在有XEP-184协议,但这些已经过时了。 需要在iOS中获取撰写状态的帮助。 谢谢, Bhat

2个回答

8

首先要导入:

#import "XMPPMessage+XEP_0085.h"

然后根据您的目的添加以下方法。

组合.....

- (void)sendComposingChatToUser:(XMPPJID*)jid {
    NSXMLElement *message = [NSXMLElement elementWithName:@"message"];
    [message addAttributeWithName:@"type" stringValue:@"chat"];
    [message addAttributeWithName:@"to" stringValue:[jid full]];
    XMPPMessage *xmppMessage = [XMPPMessage messageFromElement:message];
    [xmppMessage addComposingChatState];
    [xmppStream sendElement:message];
}

Active.....

- (void)sendActiveChatToUser:(XMPPJID*)jid {
    NSXMLElement *message = [NSXMLElement elementWithName:@"message"];
    [message addAttributeWithName:@"type" stringValue:@"chat"];
    [message addAttributeWithName:@"to" stringValue:[jid full]];
    XMPPMessage *xmppMessage = [XMPPMessage messageFromElement:message];
    [xmppMessage addActiveChatState];
    [xmppStream sendElement:message];
}

未激活...

- (void)sendInactiveChatToUser:(XMPPJID*)jid {
    NSXMLElement *message = [NSXMLElement elementWithName:@"message"];
    [message addAttributeWithName:@"type" stringValue:@"chat"];
    [message addAttributeWithName:@"to" stringValue:[jid full]];
    XMPPMessage *xmppMessage = [XMPPMessage messageFromElement:message];
     [xmppMessage addInactiveChatState];
    [xmppStream sendElement:message];
}

消失了...
- (void)sendExitChatToUser:(XMPPJID*)jid {
    NSXMLElement *message = [NSXMLElement elementWithName:@"message"];
    [message addAttributeWithName:@"type" stringValue:@"chat"];
    [message addAttributeWithName:@"to" stringValue:[jid full]];
    XMPPMessage *xmppMessage = [XMPPMessage messageFromElement:message];
    [xmppMessage addGoneChatState];
   [xmppStream sendElement:xmppMessage];
}

暂停中...

- (void)sendPausedChatToUser:(XMPPJID*)jid {
    NSXMLElement *message = [NSXMLElement elementWithName:@"message"];
    [message addAttributeWithName:@"type" stringValue:@"chat"];
    [message addAttributeWithName:@"to" stringValue:[jid full]];
    XMPPMessage *xmppMessage = [XMPPMessage messageFromElement:message];
    [xmppMessage addPausedChatState];
    [xmppStream sendElement:message];
}

接下来,您应该在AppDelegate中的(didReceiveMessage)方法中编写以下代码。

例如:

- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message{
    if ([message isChatMessageWithBody]){
}
else{
if([message elementForName:@"composing"] != nil){



        } else if ([message elementForName:@"paused"] != nil) {



        } else if ([message elementForName:@"gone"] || [message elementForName:@"inactive"] ) {


        }
}

2
您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - codelover
对我来说运行得很好。谢谢。 :) - iPeter

4

"正在输入"通知的最常用协议是XEP-0085:聊天状态通知。如在此处详细描述,向联系人发送的第一条消息应包含一个“活动”状态元素(在<body/>元素旁边):

<active xmlns='http://jabber.org/protocol/chatstates'/>

如果联系人以聊天状态响应,则客户端可以继续使用其他状态,例如“正在撰写”:
<composing xmlns='http://jabber.org/protocol/chatstates'/>

或者是“暂停”(用户已输入文本,但并未积极地输入)。
<paused xmlns='http://jabber.org/protocol/chatstates'/>

当用户关闭聊天窗口或类似操作时,对话将结束并被标记为“gone”,之前可能是“active”、 “inactive”。


这个代码在单聊中完全正常,但当发送到 muc jid 时,我们的服务器会崩溃。有什么建议吗? - codelover
1
是的,这对于 MUC 也应该有效,正如XEP-0085的5.5节中所述。这不会导致服务器崩溃。向服务器供应商提交错误报告可能值得一试。 - legoscia
谢谢Legoscia,它也可以与MUC聊天一起使用并已确认。 - codelover

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