XMPPFramework:我能否确定用户的在线/离线状态?

3

如何使用XMPPFramework for iPhone确定用户在线/离线状态?

我有他们的JID等等。是否有一种请求存在或其他方式?

谢谢。

2个回答

7

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

如果我没记错,这应该是相关的代码片段:

// 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”文件夹中。

这基本上意味着你首先需要获取名册,然后进行单独的调用。 - user281300
@puzzle 你能否提供更多的想法来查找特定用户的在线/离线状态? - Dhaval Bhadania
@puzzle 给出一些更多的想法来获取用户状态。 - Sunil kr singh
@Bucket 到底是哪里出了问题?这个回答已经有将近7年的历史了,XMPPFramework自那以后已经发生了很大的变化(Google Code也已经关闭,所以你现在可以在GitHub上找到这个框架)。但有一件事情没有改变:你需要查看Xcode文件夹中的示例代码!我建议你在那里搜索 xmppRosterDidChange - puzzle
@puzzle:感谢您的回复,我昨天已经解决了这个问题。 - Bucket

0

首先,在获取用户状态时,ROSTER列表中必须要有双方的订阅。

enter image description here

在这里,学习如何订阅并接受出席请求。

    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)

如果您的朋友向您发送了出席请求,那么您将在花名册委托中收到该请求。
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 }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接