协议描述链接:

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'/>