3

你如何改变你的存在以显示 dnd/away 等?

XMPPPresence *presence = [XMPPPresence presenceWithType:status];
[[[self appDelegate] xmppStream] sendElement:presence];

statusNSString我设置为在线/不可用/离开/忙碌/不可见的。

它仅在我上网和/或不可用时才有效。

以下是在 my 中发送出席信息后的样子xmppStream

<presence type="away"><x xmlns="vcard-temp:x:update"><photo/></x></presence>
4

3 回答 3

14

要更改客户端的状态,您需要使用以下简单代码:

XMPPPresence *presence = [XMPPPresence presence];
NSXMLElement *status = [NSXMLElement elementWithName:@"status"];
[status setStringValue:@"online/unavailable/away/busy/invisible"];
[presence addChild:status];
[[self xmppStream] sendElement:presence];

这仅仅意味着改变客户状态的关键是在您的状态中添加一个状态元素。请注意,当您将鼠标悬停在管理面板中的用户图标上时,openfire 服务器只会显示“可用/离线”状态。不过,这不应该让您感到困惑。您可以简单地检查您的客户发送和其他人收到的状态消息,这些消息将显示您设置的状态(“在线/不可用/离开/忙碌/不可见”)。

于 2012-02-14T15:11:36.120 回答
5

除了上面的答案之外,还有一个<show>元素应该与<status>元素一起使用。通过使用这两个元素,您可以为每个可用性状态自定义用户的存在。

默认值:可用/离线

通过使用<show>:有空/忙碌/离开/延长离开/离线

通过使用<show><status>“免费聊天”/“努力工作”/“开会”/“出去吃午饭”。


如果您通过以下方法使用 Openfire:在 User Sessions > Presence 列中,您将看到:

  1. 每个用户的不同颜色的图标(例如绿色表示可用,红色表示忙碌等)

  2. 图标旁边的描述性文字(例如“在会议中”)


存在子元素

有 3 个元素可以改变 XMPP 中的存在类型。

  1. <show/>
  2. <status/>
  3. <priority/>我们将排除这个进行讨论

显示

<show> 指定用户的可用性状态。

必须根据下表指定元素的值。

"chat" -- user is actively interested in chatting.
"dnd"  -- user is busy (dnd a.k.a 'Do Not Disturb').
"away" -- user is temporarily away.
"xa"   -- user is away for an extended period (xa a.k.a. 'eXtended Away').

如果未提供此元素,则假定用户仅在线且可用。

地位

<status> 描述用户的可用性状态。它通常与<show>元素结合使用,以提供可用性状态的详细描述。

元素的值可以是任何描述性文本。例如:

"Available to chat" -- can be used for "chat"
"Busy at work"      -- can be used for "dnd"
"In a meeting"      -- can be used for "away"
"On a vacation"     -- can be used for "xa"

在 Objective-C 中的用法

以下是您应该如何在代码中应用上述概念。

// Initialize variables
XMPPPresence *presence = [XMPPPresence presence];
NSXMLElement *show = [NSXMLElement elementWithName:@"show"];
NSXMLElement *status = [NSXMLElement elementWithName:@"status"];

// If user is available
[show setStringValue:@"chat"];
[status setStringValue:@"Available to chat"];

// If user is busy
[show setStringValue:@"dnd"];
[status setStringValue:@"Busy at work"];

// If user is away
[show setStringValue:@"away"];
[status setStringValue:@"In a meeting"];

// If user is away for a long period of time
[show setStringValue:@"xa"];
[status setStringValue:@"On a vacation"];

// Add the XML child elements to XMPPPresence
[presence addChild:show];
[presence addChild:status];

// Update new presence to server
[[[self appDelegate] xmppStream] sendElement:presence];

好了,您的自定义用户的存在现在将准确地反映在您的服务器中。

另请参阅:可扩展消息传递和存在协议 (XMPP):即时消息传递和存在

于 2014-07-16T05:44:13.107 回答
1

对于 Swift 5 及更高版本

您可以向任何用户发送状态

let presence = XMPPPresence(show: XMPPPresence.ShowType(rawValue: XMPPPresence.ShowType.away.rawValue) , status: "I'm working")

流。发送(存在)

并且您可以使用上述方法收听所有状态

class LastStatus {
    var username :String
    var lastStatus : String
    
    internal init(username: String, lastStatus: String) {
        self.username = username
        self.lastStatus = lastStatus
    }
}

var lastStatusList : [LastStatus] = []
func xmppStream(_ sender: XMPPStream, didReceive presence: XMPPPresence) {
    
    guard let fromUser = presenceFrom.user else {return}
    
    if presence.showType == XMPPPresence.ShowType.init(rawValue: "away") {
        if let status = presence.status {
            
            if lastStatusList.firstIndex(where: { $0.username == fromUser}) == nil {
                let userStatus = LastStatus(username: fromUser , lastStatus: status)
                lastStatusList.append(userStatus)
            } else {
                let index = lastStatusList.firstIndex(where: { $0.username == fromUser})!
                let changing = lastStatusList[index]
                changing.lastStatus = status
            }
            
        }
    }
}
于 2021-05-01T11:57:26.700 回答