将XMPPPresence更改为Away / Busy / Invisible

时间:2011-11-08 07:32:17

标签: ios objective-c xmpp xmppframework user-presence

你如何改变你的存在以显示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>

3 个答案:

答案 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列,您将看到:

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

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


  3. 存在子元素

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

    1. <show/>
    2. <status/>
    3. <priority/>我们将其排除在讨论之外
    4. 显示

      <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];
      

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

      另请参阅: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
            }
            
        }
    }
}