Получить полный JID с сервера или клиента xmpp для запроса IQ

Я работаю над приложением для iOS, которое использует сервер XMPPFramework и openfire xmpp. Я почти закончил, но не могу заставить свою iOS получать запрос IQ. Я мог получать сообщения и отправлять запросы IQ, но не получать запросы IQ.

Я попытался отправить запрос IQ от клиента iOS и сервера XMPP, но приложение iOS просто проигнорировало запрос IQ. После долгих исследований я сузил круг своей проблемы. Оказывается, я отправлял IQ-запрос на голый JID. Bare JID был направлен на сервер, а не напрямую клиенту.

Решение, которое я нашел, заключалось в том, чтобы получить полный JID и установить в сообщении IQ "to" полный JID, а не пустой JID. Мне трудно понять, как я могу получить ресурс или превратить пустой JID в полный JID.

Может кто-нибудь дать мне несколько предложений? Я хочу иметь возможность получить полный JID, чтобы отправлять запрос IQ своему клиенту iOS.


person user1157352    schedule 10.03.2012    source источник


Ответы (1)


Подпишитесь на присутствие человека, которому вы хотите отправить IQ:

<presence type='subscribe' from='[email protected]' to='[email protected]'/>

Они должны принять вашу подписку:

<presence type='subscribed' to='[email protected]' from='[email protected]'/>

Затем вы начнете получать данные о присутствии, включающие полный JID от всех их клиентов:

<presence to='[email protected]' from='[email protected]/home'/>

Если у них есть полнофункциональный клиент, они отправят вам информацию о присутствии, помеченную с помощью XEP-0115, чтобы вы могли определить, поддерживает ли их клиент ваш протокол IQ, прежде чем отправлять его им:

<presence to='[email protected]' from='[email protected]/home'>
  <c xmlns='http://jabber.org/protocol/caps' 
     hash='sha-1'
     node='http://code.google.com/p/exodus'
     ver='QgayPKawpkPSDYmwT/WM94uAlu0='/>
</presence>
person Joe Hildebrand    schedule 11.03.2012
comment
Есть ли API, который я могу вызвать, чтобы напрямую получить полный JID пользователя из моего клиента XMPP openfire или XMPPFramework? Я пишу приложение, которое должно отправить запрос IQ на полный JID, но я не знаю, какие функции я могу вызвать, чтобы получить полный JID из имени пользователя / голого JID. Я все еще новичок в этом, и у меня есть доступ к бэкэнду моего сервера или моего приложения для iOS. - person user1157352; 11.03.2012
comment
гм, так что метод, который вы предлагаете, заключается в том, что с моего внутреннего сервера я сообщаю своему плагину, чтобы он отправил подписку о присутствии, чтобы полный JID возвращался из приложения iOS? Как только я получу полный JID, я смогу отправить запрос iq? Немного избыточно? У моего плагина есть полный доступ к серверной части, и мне все еще нужно отправить запрос на подписку на присутствие? - person user1157352; 11.03.2012
comment
@ user1157352 Если вы пишете клиент, и ваш серверный компонент имеет фиксированный адрес, вы можете пропустить подписку и заставить клиент отправлять прямое присутствие компоненту при входе в систему, тем самым раскрывая его полный JID. Присутствие - это стандартный способ делать то, что вы хотите в XMPP. Альтернатива, которую вы, кажется, предлагаете, - это написать плагин для конкретного сервера, чтобы получить полные JID, но это другой вопрос, поскольку он зависит от внутреннего API вашего сервера. - person MattJ; 11.03.2012
comment
Спасибо, ребята, я думаю, что присутствие решило мою проблему. Кажется, я могу получить полный JID, используя функцию присутствия. Я хочу, чтобы мой сервер отправил запрос о присутствии моему клиенту приложения iOS, а в ответе приложения будет полный JID. Затем с полным JID мой сервер отправит моему приложению заданный IQ. - person user1157352; 12.03.2012