Search code examples
swiftofflinexmppframework

xmppframework's didReceive presence is not working properly


I am using func xmppStream(_ sender: XMPPStream, didReceive presence: XMPPPresence) for managing online offline status.This function is working fine for one to one user but it will not working properly on multiple user.

for example I have 3 user A, B and C now the scenario is Online offline status is working fine for A to B and B to A as func xmppStream(_ sender: XMPPStream, didReceive presence: XMPPPresence) function is calling very well. but If C user check status of A or B then func xmppStream(_ sender: XMPPStream, didReceive presence: XMPPPresence) is not being called.

I won't be able to understand what is the issue. Here is my Code:

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)
        }
    }
}

Note: I had tried to use @objc also.(@objc func xmppStream(_ sender: XMPPStream, didReceive presence: XMPPPresence))


Solution

  • I have solved my problem by adding following code

        let userReceiverJID = XMPPJID(string: "\(receiverJID)@\(CHATHOST)")
    
        APP_DELEGATE.xmppRoster.acceptPresenceSubscriptionRequest(from: userReceiverJID!, andAddToRoster: true)
        APP_DELEGATE.xmppRoster.subscribePresence(toUser: userReceiverJID!)