xmppframework 的 didReceive 存在无法正常工作

Posted

技术标签:

【中文标题】xmppframework 的 didReceive 存在无法正常工作【英文标题】:xmppframework's didReceive presence is not working properly 【发布时间】:2018-11-27 11:15:57 【问题描述】:

我正在使用func xmppStream(_ sender: XMPPStream, didReceive presence: XMPPPresence) 管理在线离线状态。此功能对一对一用户可以正常工作,但在多个用户上无法正常工作。

例如,我有 3 个用户 A、B 和 C,现在场景是在线离线状态对于 A 到 B 和 B 到 A 工作正常,因为 func xmppStream(_ sender: XMPPStream, didReceive presence: XMPPPresence) 函数调用得很好。但如果 C 用户检查 A 或 B 的状态,则不会调用 func xmppStream(_ sender: XMPPStream, didReceive presence: XMPPPresence)

我无法理解问题所在。这是我的代码:

func xmppStream(_ sender: XMPPStream, didReceive presence: XMPPPresence) 
    let presenceType = presence.type
    let myUsername = sender.myJID?.user

    print("myusername \(myUsername)")

    if let usr = presence.from?.user 

        print("didReceive :- \(presenceType)")
        print("didReceive usr :- \(usr)")

        if usr != myUsername 
            if presenceType == "available" 
                let dict: NSDictionary = ["presenceType":"1",
                                          "user_id":usr]
                if !APP_DELEGATE.arrPresentUser.contains(dict) 
                    APP_DELEGATE.arrPresentUser.add(dict)
                
             else 
                let pred : NSPredicate = NSPredicate(format: "user_id = %@", usr)
                let approvalRequestArray =  APP_DELEGATE.arrPresentUser.filtered(using: pred) as NSArray
                if approvalRequestArray.count > 0 
                    let dict = approvalRequestArray.object(at: 0) as! NSDictionary
                    APP_DELEGATE.arrPresentUser.remove(dict)
                
            
            NotificationCenter.default.post(name: Notification.Name("ReceivedUserStatus"), object: nil)
        
    

注意:我也尝试过使用@objc(@objc func xmppStream(_ sender: XMPPStream, didReceive presence: XMPPPresence))

【问题讨论】:

【参考方案1】:

如果你想检查特定用户的存在,使用这个。

  let query = XMLElement(name: "query", xmlns: "jabber:iq:last")
  let iq = XMPPIQ(type: "get", to: "User's JID here", elementID: xmppStream.generateUUID, child: query)
  self.xmppStream.send(iq)

在委托方法中获取出席信息。

  func xmppStream(_ sender: XMPPStream, didReceive iq: XMPPIQ) -> Bool 
    if iq.isResultIQ 
      print(iq.from?.user)
      print(iq.lastActivitySeconds())
    
  

【讨论】:

你能告诉我什么是 xmppStream.generateUUID @KD4,这是 XMPP 提供的一种方法,它生成一个 UUID 并作为字符串返回。它就像唯一的 id 来标识一些标签或属性。您也可以使用任何其他字符串来代替它。 我收到以下错误:, 这似乎是某种身份验证错误。检查您的配置和权限。还要检查你是否通过了完整的jid?比如 userid@xmpp.something.in。如果没有,请尝试传递完整的 JID。【参考方案2】:

我通过添加以下代码解决了我的问题

    let userReceiverJID = XMPPJID(string: "\(receiverJID)@\(CHATHOST)")

    APP_DELEGATE.xmppRoster.acceptPresenceSubscriptionRequest(from: userReceiverJID!, andAddToRoster: true)
    APP_DELEGATE.xmppRoster.subscribePresence(toUser: userReceiverJID!)

【讨论】:

以上是关于xmppframework 的 didReceive 存在无法正常工作的主要内容,如果未能解决你的问题,请参考以下文章

XmppFramework 显示错误

XMPPFramework - 消息未发送

XMPPFramework - 存在不变

使用 xmppFramework 连接到服务器时卡住

XMPPFramework - 如何向 XMPPUserCoreDataStorageObject 添加自定义属性?

XMPPFramework 整理文件传输