【问题标题】:XMPPFramework : can I determine the online/offline status of a user at all?XMPPFramework:我可以确定用户的在线/离线状态吗?
【发布时间】:2011-06-25 00:09:57
【问题描述】:

如何使用 XMPPFramework for iPhone 确定用户是否在线/离线?

我有他们的 JID 等。有什么方法可以请求出席吗?

谢谢。

【问题讨论】:

    标签: iphone objective-c cocoa-touch xmpp xmppframework


    【解决方案1】:

    您查看过 XMPPFramework 示例项目的源代码吗?

    如果我没记错的话,应该是相关代码sn-p:

    // Subscribe to the buddy's presence
    // 
    // <presence to="bareJID" type="subscribe"/>
    
    NSXMLElement *presence = [NSXMLElement elementWithName:@"presence"];
    [presence addAttributeWithName:@"to" stringValue:[jid bare]];
    [presence addAttributeWithName:@"type" stringValue:@"subscribe"];
    
    [xmppStream sendElement:presence];
    

    您的流委托获得的回调应该是

    - (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence;
    

    我假设你已经有了 xmmpframework 源,如果没有,你可以在此处克隆存储库

    hg clone https://xmppframework.googlecode.com/hg/ xmppframework
    

    示例项目位于“Xcode”文件夹中。

    【讨论】:

    • 这基本上意味着您首先需要获得名册,然后再进行个人调用
    • @puzzle 嘿,您能否提供更多关于如何在线/离线查找特定用户状态的想法?
    • @puzzle 提供更多获取用户状态的想法
    • @Bucket 究竟是什么不工作?这个答案已经有将近 7 年的历史了,XMPPFramework 从那以后发生了很大的变化(Google Code 也已经死了,所以你会在 GitHub 上找到这个框架)。但有一件事没有改变:您需要查看 Xcode 文件夹中的示例代码!我建议你在那里搜索xmppRosterDidChange
    • @puzzle : 谢谢你的回复,我昨天已经解决了这个问题。
    【解决方案2】:

    首先,获取用户状态需要在ROSTER List中进行双方订阅。

    这里,如何订阅和接受出席请求。

        let senderName = strReceiverEjabberedName + "@" + eJabVirtualHost
        let roomJID = XMPPJID(string: senderName)
        
        // Send subscribe request
        let detxTag:XMLElement = XMLElement(name: "presence")
        detxTag.addAttribute(withName: "to", stringValue: roomJID?.bare ?? "")
        detxTag.addAttribute(withName: "type", stringValue: "subscribe")
        xmppController.xmppStream.send(detxTag)
        
        // Send subscribed request
        let detxTaged:XMLElement = XMLElement(name: "presence")
        detxTaged.addAttribute(withName: "to", stringValue: roomJID?.bare ?? "")
        detxTaged.addAttribute(withName: "type", stringValue: "subscribed")
        xmppController.xmppStream.send(detxTaged)
        
        // Subscribe & Accept Presence Request
        xmppController.xmppRoster?.subscribePresence(toUser: roomJID!)
        xmppController.xmppRoster?.acceptPresenceSubscriptionRequest(from: roomJID!, andAddToRoster: true)
    

    如果您的朋友向您发送了 Precense 请求,那么您在 Roster Delegate 中收到了请求。

    extension XMPPServiceController: XMPPRosterDelegate {
        func xmppRoster(_ sender: XMPPRoster, didReceivePresenceSubscriptionRequest presence: XMPPPresence) {
            sender.acceptPresenceSubscriptionRequest(from: presence.from!, andAddToRoster: true)
        }
    }
    

    完成上述步骤后,您将在下面的 XMPP 委托方法中收到您朋友的在线/离线状态。

    func xmppStream(sender: XMPPStream?, didReceivePresence presence: XMPPPresence?) {
        let presenceType = presence?.type
        if presenceType == "available" { //ONLINE }
        else if presenceType == "unavailable" { //OFFLINE }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-08
      • 1970-01-01
      • 1970-01-01
      • 2019-01-23
      • 1970-01-01
      相关资源
      最近更新 更多