你如何改变你的存在以显示dnd / away等?
XMPPPresence *presence = [XMPPPresence presenceWithType:status];
[[[self appDelegate] xmppStream] sendElement:presence];
status
是我设置为在线/不可用/离开/忙/不可见的NSString
。
它仅在我上线和/或不可用时才有效。
以下是我在xmppStream
发送状态后的样子:
<presence type="away"><x xmlns="vcard-temp:x:update"><photo/></x></presence>
答案 0 :(得分: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服务器将仅显示“可用/离线”状态。这不应该让你感到困惑。您只需检查客户端发送的状态消息,并由其他人接收,这些消息将显示您已设置的状态(“在线/不可用/离开/忙碌/不可见”)。
答案 1 :(得分:5)
在上面的答案之上,还有一个<show>
元素应该与<status>
元素一起使用。通过使用这两个元素,您可以为每个可用性状态自定义用户的存在。
默认值:可用/离线
使用<show>
:可用/忙/离/远离/离线
将<show>
与<status>
一起使用:“免费聊天”/“努力工作”/“在会议中”/“外出吃午饭”。
如果您使用此方法使用Openfire:在用户会话中&gt; Presence列,您将看到:
每个用户的不同颜色图标(例如绿色表示可用,红色表示忙等)
图标旁边的描述性文字(例如“在会议中”)
有3个元素可以改变XMPP中的存在类型。
<show/>
<status/>
<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"
以下是您应该如何在代码中应用上述概念。
// 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];
在那里,您的自定义用户的存在现在将准确地反映在您的服务器中。
另请参阅:Extensible Messaging and Presence Protocol (XMPP): Instant Messaging and Presence
答案 2 :(得分:1)
适用于 Swift 5 及更高版本
您可以向任何用户发送状态
let presence = XMPPPresence(show: XMPPPresence.ShowType(rawValue: XMPPPresence.ShowType.away.rawValue) , status: "I'm working")
stream.send(存在)
并且您可以使用上述方法收听所有状态
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
}
}
}
}