【问题标题】:<error type="cancel" code="501"><feature-not-implemented xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/><error type="cancel" code="501"><feature-not-implemented xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/>
【发布时间】:2020-10-01 00:28:10
【问题描述】:

我是 XMPP 的初学者。我想用 OpenFire 服务器实现聊天应用程序。我能够与服务器建立正确的连接,但是当我想向另一个 Jabberid 发送任何消息时,我收到一个错误

SEND: <iq type="error" to="DOMAINMANE" id="348-5581"><query xmlns="jabber:iq:version"/><error type="cancel" code="501"><feature-not-implemented xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error></iq>

这是我试过的代码

extension AppDelegate{
private func setupStream() {
    //xmppRoster = XMPPRoster(rosterStorage: xmppRosterStorage)
    xmppRoster.activate(xmppStream)
    self.xmppStream.addDelegate(self, delegateQueue: DispatchQueue.main)
    self.xmppRoster.addDelegate(self, delegateQueue: DispatchQueue.main)

}
func connect() -> Bool {
    if !xmppStream.isConnected {
        let jabberID = GlobleConstants.senderJID

        if !xmppStream.isDisconnected {
            return true
        }

        xmppStream.myJID = XMPPJID(string: jabberID)

        do {
            try xmppStream.connect(withTimeout: XMPPStreamTimeoutNone)
            self.xmppMessageDeliveryRecipts.autoSendMessageDeliveryReceipts = true
            self.xmppMessageDeliveryRecipts.autoSendMessageDeliveryRequests = true
            self.xmppMessageDeliveryRecipts.activate(self.xmppStream)
            print("Connection success")
            return true
        } catch {
            print("Something went wrong!")
            return false
        }
    } else {
        return true
    }

}
func disconnect() {
    goOffline()
    xmppStream.disconnect()
}
private func goOnline() {
    let presence = XMPPPresence()
    let domain = xmppStream.myJID?.domain

    if domain == GlobleConstants.XMPPHOSTNAME || domain == "gmail.com" || domain == "gtalk.com" || 
domain == "talk.google.com" {
        let priority = DDXMLElement.element(withName: "priority", stringValue: "24") as! DDXMLElement
        presence.addChild(priority)
    }
    xmppStream.send(presence)
}
private func goOffline() {
    let presence = XMPPPresence(type: "unavailable")
    xmppStream.send(presence)
}


}
extension AppDelegate : XMPPStreamDelegate{
func xmppStreamDidConnect(_ sender: XMPPStream) {
    do {
        try    xmppStream.authenticate(withPassword: GlobleConstants.sPassword)
    } catch {
        print("Could not authenticate")
    }
}
func xmppStreamDidAuthenticate(_ sender: XMPPStream) {
    goOnline()
}

func xmppStream(_ sender: XMPPStream, didReceive iq: XMPPIQ) -> Bool {
    print("Did receive IQ")
    return false
}


func xmppStream(_ sender: XMPPStream, didReceive message: XMPPMessage) {
    print("Did send message \(message)")
}
func xmppStream(_ sender: XMPPStream, didReceive presence: XMPPPresence) {
      print("IN APPDELEGATE -----> ", presence)
    let presenceType = presence.presenceType?.rawValue
          let myUsername = sender.myJID?.user
          let presenceFromUser = presence.from?.user
          print("MY USERNAME ",myUsername)
          print("OTHER USER NAME  ",presenceFromUser)
          print("PRESNET ",presenceType)
         **//HERE ALSO NOT GETTING ANOTHER ONLINE USER, SO THAT I CAN ADD INTO ONLINE BUDDIES LIST**
         /*if presenceFromUser != myUsername {
              print("Did receive presence from \(presenceFromUser)")
              if presenceType == "available" {
                  delegate.buddyWentOnline(name: "\(presenceFromUser)@\(GlobleConstants.XMPPHOSTNAME)")
              } else if presenceType == "unavailable" {
                  delegate.buddyWentOffline(name: "\(presenceFromUser)@\(GlobleConstants.XMPPHOSTNAME)")
              }
          }*/
}

}
extension AppDelegate : XMPPRosterDelegate{
    func xmppRoster(_ sender: XMPPRoster, didReceiveRosterItem item: DDXMLElement) {
        print("Did receive Roster item")
    }
}

现在在控制器内部,我正在尝试通过

获取在线好友
func setupUI(){
    appDelegate.delegate = self
    if appDelegate.connect() {
        self.title = appDelegate.xmppStream.myJID?.user
        appDelegate.xmppRoster.fetch()
    }
    self.tableView.register(UITableViewCell.self, forCellReuseIdentifier: "cell")
}

但得到同样的错误。有人有相同的解决方案吗?

【问题讨论】:

    标签: ios xmpp swift5 openfire xmppframework


    【解决方案1】:

    您没有收到错误,您正在发送一个错误。在您的客户端连接后,Openfire 会查询它的软件版本。您的客户端不支持该请求,并向 Openfire 发回一个错误(“功能未实现”)。这是完全合理的,无需担心。

    如果你想摆脱错误,你可以让你的客户端响应https://xmpp.org/extensions/xep-0092.html协议中定义的查询

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-16
      • 1970-01-01
      • 2014-12-30
      相关资源
      最近更新 更多