2015-06-20 65 views
0

我创建(又一个)使用Smack和ejabberd的移动聊天应用。我试图确定实现用户头像以供多用户聊天室使用的最佳方式,当然也包括名单成员。看看可能的解决方案,我可以看到:XMPP支持多用户聊天中的头像

  1. XEP-0008基于IQ的头像 - 头像被限制为64 x 64像素,太小。
  2. XEP-0153基于vCard的头像 - 易于在名单和MUC房间中为两个用户实现,然而(a)像this这样的源似乎表明自己的vcard需要在每次登录时下载(这是严格正确的(b)应该小于96乘96像素(仍然非常小)
  3. XEP-0084基于个人事件协议的用户头像 - 我不清楚我如何可以基于此协议检索多用户聊天室中的所有用户的头像。加入聊天室后,我需要订阅所有用户的元数据节点,以及随后加入的用户?当他们离开房间时也取消订阅?我认为这将是非常难看和笨拙的实施。

有人能指点我在正确的方向,或指出我可能误解的地方吗?谢谢。

+0

您是否试过XEP-0054? – souvickcse

+0

谢谢@souvickcse,我明白XEP-0153是建立在XEP-0054之上的。但是,我发现我可以在XEP-0053中使用vCard的BINVAL和EXTVAL字段来存储图像数据或URI到图像。一些问题:1.对于我们可以在BINVAL中存储的数据的大小,是否存在实际或理论上的限制?我在规范2中看不到任何内容:用户自己的vCard是否需要在每次登录时重新加载?这只是确保跨客户端同步的一项要求吗? 3.是否有一种方法可以使用现有的XMPP头像规范之一来实现此目标(例如标准且交叉兼容)? – Dave

+0

嗨,我没有那么多的想法(对此感到抱歉)我已经在我的项目中使用过这个使用https://github.com/robbiehanson/XMPPFramework代码:'NSData * photoData = [[[AppDelegate delegate ] xmppvCardAvatarModule] photoDataForJID:user.jid];' – souvickcse

回答

0

我想解决这个问题的最佳方法可能是通过HTTP服务器存储/加载图像带外。图像可以用诸如“username_imagehash.xxx”之类的文件名来存储。对于不在名单上的用户(例如多用户聊天中的陌生人),我们通过从他们的vCard PHOTO字段检索到的URI来拉他们的头像。每次遇到陌生人时,我们都会重新加载他们的vCard,并且可以通过更改vCard中的URI来识别是否需要重新下载他们的照片。

一旦用户被添加到自己的名单中,我们通过XEP-0084订阅他们的头像更新,发布相同的URI(参见XEP-0084中的示例4.)。

我认为这解决了所有要求,我会发现一旦我已经实施。我可以理解,在标准XMPP客户端中不这样做,因为它依赖于与XMPP服务分开的HTTP服务器(并且需要处理HTTP服务器安全性 - 用户授权/身份验证)。

反馈欢迎!