如何在 Smack 4.1 中的 XMPP 消息标签中添加自定义属性(昵称)

Posted

技术标签:

【中文标题】如何在 Smack 4.1 中的 XMPP 消息标签中添加自定义属性(昵称)【英文标题】:How can I add custom attribute (nick) in my XMPP message tag, in Smack 4.1 【发布时间】:2015-05-11 06:42:36 【问题描述】:

我想在我的 XMPP 聊天消息中添加 自定义属性(昵称),如下例所示

<message from='*' to='*' id='123' nick='KASHIF' type='chat'><body>hello</body></message>

我知道,XMPP 不推荐,但这是我的要求,因为这个 attribute(nick) 已经在我正在使用的应用程序的 ios 版本中实现开。

【问题讨论】:

【参考方案1】:

不要这样做,不推荐这样做是有原因的。有些服务器很可能会剥离该属性,甚至完全拒绝处理数据包。相反,推荐的方法是添加自定义元素。

其实这样的扩展已经存在了,XEP-0172:

<message from='*' to='*' id='123' type='chat'>
    <nick xmlns='http://jabber.org/protocol/nick'>KASHIF</nick>
    <body>hello</body>
</message>

这可能已经适用于其他客户端或库,因此它是一个更好的解决方案。

【讨论】:

在我的情况下,这会导致应用程序的 iOS 版本崩溃【参考方案2】:

为此,您需要编辑 2 类 Smack 4.1

(org.jivesoftware.smack.packet)中的Stanza类 (org.jivesoftware.smack.util) 中的 PacketParserUtils

1.节类

定义您的自定义属性(nick

 private String nick = null;

定义 Getter 和 Setter

public String getNick() 
    return this.nick;


public void setNick(String paramString) 
   this.nick = paramString;

编辑节构造函数

protected Stanza(Stanza p) 

   //add this line
   nick = p.getNick();


编辑addCommonAttributes方法

protected void addCommonAttributes(XmlStringBuilder xml) 

    //add this line
    if(getNick()!= null)
         xml.optAttribute("nick", getNick());

2. PacketParserUtils 类

编辑parseMessage方法

 public static Message parseMessage(XmlPullParser parser)
                throws XmlPullParserException, IOException, SmackException 

   //add this line
   message.setNick(parser.getAttributeValue("", "nick"));


现在您可以简单地设置昵称并发送消息,如下所示

Message message = new Message();
message.setType(Message.Type.chat);
message.setStanzaId("123");
message.setTo(number);

message.setNick("SHAYAN");    

try 
 connection.sendStanza(message);
 catch (NotConnectedException e) 

【讨论】:

嗨 shanrais!,我从 github 克隆了 Smack,并编辑了两个类。但是,你没有说如何将 smack 和创建 jars 再次部署到 android 对吗? 我没有创建罐子,而是包含了我在项目中编辑的那个罐子的源代码。 你能说哪些文件夹需要复制吗?在github上的项目github.com/igniterealtime/Smack中有很多文件夹,我不知道哪些文件夹需要复制到我的项目中。以下 jar 在我的应用程序 gradle 中声明: compile 'org.igniterealtime.smack:smack-android-extensions:4.1.1' compile 'org.igniterealtime.smack:smack-experimental:4.1.1' compile 'org.igniterealtime.smack: smack-tcp:4.1.1' 不要将 smack-core-4.1.0.jar 复制到您的 lib 文件夹中。只需将 smack-core-4.1.0-sources 的代码复制到您的项目中即可。 你能举例项目吗?我只添加了源代码 smack-core-4.1.0-sources 但出现另一个错误: not found import org.jxmpp.jid.DomainBareJid;导入 org.jxmpp.jid.parts.Resourcepart;

以上是关于如何在 Smack 4.1 中的 XMPP 消息标签中添加自定义属性(昵称)的主要内容,如果未能解决你的问题,请参考以下文章

我们如何在 smack 或来自 android 的 xmpp 中获得对发件人的消息读取/看到确认

如何从 Smack 4.1 中的实时消息中获取服务器时间戳

无法使用 Smack 4.1 从 Android 连接 apache vysper XMPP 服务器

收到消息时通知 XMPP + Smack

XMPP Smack - 消息被修改

在 xmpp 中接收消息