Status “digitando..” do XMPPFramework para mensagem
-
21-12-2019 - |
Pergunta
Estou usando robbiehanson/XMPPFramework para meu projeto atual.Como obter o status de digitação da mensagem usando XMPPFramework?Existe o protocolo XEP-184, mas eles estão obsoletos no momento.Precisa de ajuda aqui para obter o status de composição no iOS.Atenciosamente, Bhat
Solução
O protocolo mais comumente usado para notificações de “contato está digitando” é XEP-0085:Notificações de estado de bate-papo.Conforme descrito com mais detalhes, a primeira mensagem para um contato deve conter um elemento de estado "ativo" (próximo ao <body/>
elemento):
<active xmlns='http://jabber.org/protocol/chatstates'/>
Se o contato responder com um estado de chat, o cliente poderá prosseguir e utilizar outros estados, como "compondo":
<composing xmlns='http://jabber.org/protocol/chatstates'/>
ou "pausado" (o usuário digitou o texto, mas não está digitando ativamente):
<paused xmlns='http://jabber.org/protocol/chatstates'/>
ou "inativo" e finalmente "desaparecido" quando o usuário encerra a conversa fechando a janela de chat ou similar.
Outras dicas
Primeiro você importa:
#import "XMPPMessage+XEP_0085.h"
e então você adiciona os seguintes métodos de acordo com sua finalidade.
composição.....
- (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];
}
Ativo.....
- (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];
}
Inativo...
- (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];
}
Perdido...
- (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];
}
Pausado...
- (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];
}
então você deve escrever o seguinte código em appdelgate.(didReceiveMessage).
Ex:
- (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"] ) {
}
}