协议描述链接:
http://xmpp.org/rfcs/rfc6121.html
管理Presence Subscriptions
为了保护用户隐私,用户presence信息只有用户审核过的其他用户才能获取。
当用户同意了其他用户获取自身的presence的请求时候,被称作其他用户subscripiton了用户的presence。
xmpp中,subscription是一直存在的,直到用户主动取消了这个subscription。
xmpp通过4种不同的presence stanzas来进行subscription的管理:(subscribe, unsubscribe, subscribed, unsubscribed)。
注意:当进行subscription管理时,使用的jid是bare jid,而不是full jid。
1. 发起subscription请求
subscription请求在格式是一个presence,其type属性的值为subscribe,例如:
<presence id='xk3h1v69'
<to='juliet@example.com>'
type='subscribe’/>
当服务器收到用户发起的subscription请求时,首先将请求推送出去,然后给发起方用户所有interested resources发送一个roster push,其中ask属性为subscribe,subscription属性为none(不一定非为none吧,要是对方已经订阅了自身呢),例如:
<iq id='b89c5r7ib575'
to='romeo@example.net/bar'
type='set'>
<query xmlns='jabber:iq:roster'>
<item ask='subscribe'
<jid='juliet@example.com>'
subscription='none'/>
</query>
</iq>
如果发送了请求之后很久没有收到回应,服务器应该重新发送这个请求。
俄如果接收方用户离线,那么服务器会保存这个请求,如果发起方发送了多个请求,服务器只会缓存一条(第一条或者最后一条)。
当接受方收到这个请求时候,它必须讲这个请求展现给用户让用户选择批准还是拒绝,发送的回应如下:同意时候type为subscribed, 不同意时type为unsubscribed。
CC: <presence id='h4v1c4kj'
<to='romeo@example.net>'
type='subscribed’/>
CC: <presence id='tb2m1b59'
<to='romeo@example.net>'
type='unsubscribed'/>
当服务器收到这个请求回复时候,首先将请求推送出去,然后给发起方用户所有interested resources发送一个roster push,subscription属性为from。
<iq id='x81g3bdy4n19'
to='juliet@example.com/chamber'
type='set'>
<query xmlns='jabber:iq:roster'>
<item <jid='romeo@example.net>'
subscription='from'/>
</query>
</iq>
紧接着会发送presence消息
CS: <presence from='juliet@example.com/balcony'
id='pw72bc5j'
to='romeo@example.net'/>