如何检查用户 JID 是不是已在 XMPPFrameWork 中使用

Posted

技术标签:

【中文标题】如何检查用户 JID 是不是已在 XMPPFrameWork 中使用【英文标题】:How to check if a user JID is already taken in XMPPFrameWork如何检查用户 JID 是否已在 XMPPFrameWork 中使用 【发布时间】:2018-08-09 03:04:09 【问题描述】:

我是 xmppframework 的新手。我有一个快速的问题。是否有可能知道某个 JID 是否可用。换句话说,是否可以检查用户名是否已与某个帐户关联或注册。

【问题讨论】:

【参考方案1】:

使用 jabber 搜索是的,您可以搜索并找到具有特定 jID 或用户名的用户或 ...

在这里,我创建了一个函数,该函数将一些 jID 作为参数,服务器对您的响应作为查询,并且在该查询中,如果有任何匹配项,则将包含具有匹配 jID 的用户的项目

func xmppQueryForSearchPacket(forJID jid: String) 
    let searchingServer = "search.something" //something must replace with your xmpp domain name
    let query = DDXMLElement(name: "query", xmlns: "jabber:iq:search")
    let x = DDXMLElement(name: "x", xmlns: "jabber:x:data")
    x.addAttribute(withName: "type", stringValue: "submit")


    let field1 = DDXMLElement(name: "field")
    let value1 = DDXMLElement(name: "value", stringValue: "jabber:iq:search")
    field1.addAttribute(withName: "type", stringValue: "hidden")
    field1.addAttribute(withName: "var", stringValue: "FORM_TYPE")
    field1.addChild(value1)


    let field2 = DDXMLElement(name: "field")
    let value2 = DDXMLElement(name: "value", stringValue: jid)
    field2.addAttribute(withName: "type", stringValue: "text-single")
    field2.addAttribute(withName: "var", stringValue: "search")
    field2.addChild(value2)

    //we just search in userNames

    let field3 = DDXMLElement(name: "field")
    let value3 = DDXMLElement(name: "value", stringValue: "1")
    field3.addAttribute(withName: "type", stringValue: "boolean")
    field3.addAttribute(withName: "var", stringValue: "Username")
    field3.addChild(value3)


    x.addChild(field1)
    x.addChild(field2)
    x.addChild(field3)
    query.addChild(x)


    let iq = XMPPIQ(iqType: .set, to: XMPPJID(string: searchingServer), elementID: XMPPStream.generateUUID, child: query)
   XMPPStream.send(iq)

该数据包的答案将以查询形式出现,您可以像这样接收它:

extension yourClassName: XMPPStreamDelegate 
    func xmppStream(_ sender: XMPPStream, didReceive iq: XMPPIQ) -> Bool 
        let searchingServer = "search.something"
        if iq.from?.bare != searchingServer 
            return true
        
        return false
    

更多信息请阅读XEP-0055。

【讨论】:

您好,感谢您的回复,但我收到了来自服务器的错误消息,指出“没有模块正在处理此查询”你知道我显示的模块是启用的吗 嗨,我认为要使这个工作,应该启用 v_card 模块对吗? @Ahmed 您使用的是哪个服务器?如果您在插件中使用 Openfire,您必须启用搜索模块。如果您使用 ejabberd,您应该在 ejabberd 目录中打开配置文件并启用您的搜索模块并为其定义一些服务名称,例如 search.ejabberd.no 不需要v_card 我正在使用 ejabberd 并且我在我的配置文件中设置了 mod_vcard: search: true 抱歉,服务名称是什么意思。它是一个子域。我应该在 ejabberconfig 文件中的哪里包含我的服务名称。 @Ahmed 是的,所有用户都必须将他们的 vcard 发布到服务器,vjud.something 服务将在 vcard 上查询以进行搜索

以上是关于如何检查用户 JID 是不是已在 XMPPFrameWork 中使用的主要内容,如果未能解决你的问题,请参考以下文章

如何检查用户是不是已在 React Native Android 中授予相机权限?

如何检查用户是不是已在 ejabberd 服务器中注册或未使用 asmack

如何让 SQL Python 查找用户名是不是已在数据库中?

如何检查电子邮件地址是不是已在使用 Firebase

检查用户是不是在 OpenFire 中经过身份验证

检查用户是不是已在 Swift 中注册本地通知时出错