1

我正在创建一个使用 django 作为后端的 iOS 应用程序。我需要在用户之间建立聊天功能。

听说XMPP很适合实时通信,我已经成功设置ejabberd作为XMPP服务器。但是我仍然很难处理细节:
我先创建了应用程序,然后创建了聊天功能,所以在我设置 ejabberd 之前,我的 django DB 中已经有用户了。我需要 ejabberd 针对我现有的数据库对用户进行身份验证,我几乎通过使用外部身份验证解决了这个问题。只有一个小问题,因为 ejabberd 似乎需要像username@abc.com这样的 jabber ID ,这里是abc表示 ejabberd 的虚拟主机。我不知道也许我只能在我的服务器上使用一个虚拟主机(即域名)?但是一开始我要求用户使用来自不同域的电子邮件进行注册,例如 gmail.com、yahoo.com,但username@gmail.com@abc.com不是有效的 jabber ID,所以也许是一个我可以在这里做的小技巧是将第一个 @ 转换为 # 并在后端的 python 脚本中正确处理它。但也许我做错了?

另一个问题是关于用户资料。我还将用户信息存储在我的 django 数据库中,例如显示名称、头像 url 等。我了解到,如果我想从 XMPP 服务器获取这些信息,我可以使用 vCard 模块。所以也许我需要在两个地方有重复的信息?而且我还没有弄清楚如何将用户信息从 DB 同步到 ejabberd。或者也许我只需要一个来源,即我的数据库,然后 iOS 客户端可以在需要时从后端查询信息?

我觉得 XMPP 不容易设置,在你的应用程序中使用它真的很流行吗?特别是如果聊天不是您的应用程序的主要功能,并且您不希望收到来自大量用户的大量消息?

4

1 回答 1

1

你写了:

但 username@gmail.com@abc.com 不是有效的 jabber ID

您应该转义用户 ID(即“username@gmail”)。

XEP 106解释了如何转义 JID 的节点部分。

在 python 中,它看起来像这样:

def escape_node(node):
    """ """
    node.strip()
    node = node.replace('\\', "\\5c")
    node = node.replace(' ',  "\\20")
    node = node.replace('\"', "\\22")
    node = node.replace('\&', "\\26")
    node = node.replace('\'', "\\27")
    node = node.replace('\/', "\\2f")
    node = node.replace(':',  "\\3a")
    node = node.replace('<',  "\\3c")
    node = node.replace('>',  "\\3e")
    node = node.replace('@',  "\\40")
    return node

关于在 Django 中存储用户的详细信息。当您在 XMPP 中注册 Django 用户时,只需确保您还为他们注册了有效的 vCard。

当 Django 用户更改他的详细信息时,也要更新 vCard。

于 2012-11-26T14:52:35.640 回答