swift的XMPP库SwiftXMPP中的代码:
func goOnline() {
print("goOnline")
var presence = XMPPPresence(type: "away")
curXmppStream!.sendElement(presence)
}看起来很可疑啊:
为啥上线,却是发送away-》离开?
而不是online之类的词?
对应的:
func goOffline() {
var presence = XMPPPresence(type: "unavailable")
curXmppStream!.sendElement(presence)
}就很正常:
offline了,发送unavailable
搜:
xmpp goOnline goOffline
参考:
- (void)goOnline {
XMPPPresence *presence = [XMPPPresence presence];
[[self xmppStream] sendElement:presence];
}所以后来改为了:
private func goOnline() {
// let presence = XMPPPresence()
let presence = XMPPPresence(type: "available")
// let domain = curXmppStream!.myJID.domain
// if domain == "gmail.com" || domain == "gtalk.com" || domain == "talk.google.com" {
// let priority = DDXMLElement.elementWithName("priority", stringValue: "24") as! DDXMLElement
// presence.addChild(priority)
// }
curXmppStream!.sendElement(presence)
}但是还是想要去搞清楚:
XMPP中的Presence的Type,到底有哪些
搜:
XMPP Presence Type
参考:
http://xmpp.org/rfcs/rfc3921.html
2.2.1. Types of Presence
The ‘type’ attribute of a presence stanza is OPTIONAL. A presence stanza that does not possess a ‘type’ attribute is used to signal to the server that the sender is online and available for communication. If included, the ‘type’ attribute specifies a lack of availability, a request to manage a subscription to another entity’s presence, a request for another entity’s current presence, or an error related to a previously-sent presence stanza. If included, the ‘type’ attribute MUST have one of the following values:
- unavailable — Signals that the entity is no longer available for communication.
- subscribe — The sender wishes to subscribe to the recipient’s presence.
- subscribed — The sender has allowed the recipient to receive their presence.
- unsubscribe — The sender is unsubscribing from another entity’s presence.
- unsubscribed — The subscription request has been denied or a previously-granted subscription has been cancelled.
- probe — A request for an entity’s current presence; SHOULD be generated only by a server on behalf of a user.
- error — An error has occurred regarding processing or delivery of a previously-sent presence stanza.
For detailed information regarding presence semantics and the subscription model used in the context of XMPP-based instant messaging and presence applications, refer to Exchanging Presence Information and Managing Subscriptions.
Presence中的type属性是可选的,
Presence是不会去检查处理type的值的
Presence本身,是用于通知服务器表示自己上线了,可以和我通话了
如果传入type参数的话,则type表示
Represents the type of a presence packet. Note: the presence is assumed to be “available” when the type attribute of the packet is null. The valid types are:
Presence.Type.unavailable— signals that the entity is no longer available for communication.Presence.Type.subscribe— the sender wishes to subscribe to the recipient’s presence.Presence.Type.subscribed— the sender has allowed the recipient to receive their presence.Presence.Type.unsubscribe— the sender is unsubscribing from another entity’s presence.Presence.Type.unsubcribed— the subscription request has been denied or a previously-granted subscription has been cancelled.Presence.Type.probe— a request for an entity’s current presence; SHOULD be generated only by a server on behalf of a user.Presence.Type.error— an error has occurred regarding processing or delivery of a previously-sent presence stanza.
搜:
swift XMPP goOnline
swiftXMPP goOnline
参考:
private func goOnline() {
let presence = XMPPPresence()
let domain = xmppStream.myJID.domain
if domain == "gmail.com" || domain == "gtalk.com" || domain == "talk.google.com" {
let priority = DDXMLElement.elementWithName("priority", stringValue: "24") as! DDXMLElement
presence.addChild(priority)
}
xmppStream.sendElement(presence)
}
private func goOffline() {
let presence = XMPPPresence(type: "unavailable")
xmppStream.sendElement(presence)
}(void)goOnline{
//发送在线状态
XMPPPresence *presence = [XMPPPresence presence];
[[self xmppStream] sendElement:presence];
}-》
现在有点明白了:
此处的,
goOnline
主要的目的是:
告诉服务器,我上线了
而生成并发送一个presence,发送到服务器即可
不要传递type参数
-》否则,传递了type的话,type表示的是你不在线的原因。。。
-》所以是下线了,或者出现其他问题了,才在发送presence时传递type参数,表示自己不在线的原因的
-》所以,此处代码应该写成:
private func goOnline() {
let presence = XMPPPresence()
// let presence = XMPPPresence(type: "available")
// let domain = curXmppStream!.myJID.domain
// if domain == "gmail.com" || domain == "gtalk.com" || domain == "talk.google.com" {
// let priority = DDXMLElement.elementWithName("priority", stringValue: "24") as! DDXMLElement
// presence.addChild(priority)
// }
curXmppStream!.sendElement(presence)
}就可以了。
-》
真为设计这个接口的人的逻辑感到无语。。。
能设计出这么违背常人的理解的接口。。。
转载请注明:在路上 » [整理]XMPP中Presence的Type的含义和用法