我们正在尝试为我们的产品实施XMPP
over BOSH
。Strophe.js
javascript 库可以很好地满足我们在 WWW 站点上的需求。我们请求预绑定,它已交付,然后我们使用 Strophe 的“附加”方法开始我们的会话 - 然后我们能够更新状态和发送/接收消息。在 iOS 方面,我们使用的是 robbiehanson XMPPFramework
,它包含一个 BOSH 传输,但没有附加方法。以下是我试图让它发挥作用的一些悲伤。
我预先绑定,获取我的 sid/jid/rid,然后在 bosh 传输和其他文件中设置内部逻辑,以说明我们已经连接。然后,如果我尝试更新状态,包括给定的 SID,我会发送:
BOSH:发送[1248340729] = <body xmlns="http://jabber.org/protocol/httpbind" sid="568a3ae9" ack="1248340728" rid="1248340729"><presence></presence></body >
但根本没有得到任何答复。这是最后一个。如果我尝试在不指定 SID 的情况下更新状态,我会发送:
BOSH:SEND[1064338700] = <body xmlns="http://jabber.org/protocol/httpbind" ack="1064338699" rid="1064338700"><presence></presence></body>
然后回来:
BOSH:RECD[1342811427] = < body xmlns="http://jabber.org/protocol/httpbind" xmlns:stream="http://etherx.jabber.org/streams" authid="9ef0ccdb" sid="9ef0ccdb "secure="true" requests="2" inactivity="300" polling="5" wait="60"><stream:features><mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl "><机制>PLAIN</mechanism></mechanisms><压缩xmlns="http://jabber.org/features/compress"><method>zlib</method></compression><bind xmlns="urn :ietf:params:xml:ns:xmpp-bind"/>< session xmlns="urn:ietf:params:xml:ns:xmpp-session"/></stream:features></body>
这看起来像是一个连接确认,或者一个连接挑战节,希望我用 PLAIN 信息做出回应——但这已经通过预绑定建立了。如果是连接确认,那么接下来的几行就没有意义了。如果使用上面连接字符串提供的 SID,就好像它是一个肯定(我不确定),这些是下一行:
BOSH: SEND[1342811427] = <body xmlns="http://jabber.org/protocol/httpbind" sid="9ef0ccdb" rid="1342811428"><iq type="set"><bind xmlns="urn: ietf:params:xml:ns:xmpp-bind"><resource>api</resource></bind></iq></body>
BOSH:RECD[1342811427] = <body xmlns=' http: //jabber.org/protocol/httpbind '><iq xmlns="jabber:client" type="error" to="chat.*.com/9ef0ccdb" ><bind xmlns="urn:ietf:params:xml:ns:xmpp-bind"><resource>api</resource></bind><error code="401" type="auth"><未授权xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error></iq></body>
我没有被授权。现在,如果我尝试使用在预绑定期间协商的 SID,最后两行是不同的:
BOSH: SEND[1172064714] = <body xmlns="http://jabber.org/protocol/httpbind" sid="27e3745b" rid="1172064715"><iq type="set"><resource>api</resource >< /bind></iq></body>
BOSH:RECD[1172064714] = <body xmlns="http://jabber.org/protocol/httpbind"></body>
一个空洞的回应。然后,如果我再次尝试更新我的状态,它会给我一个文字404
页面,说明 SID 无效。当我使用 openfire 提供的 SID 时,如果我重新尝试状态更新,它只会继续给我401 not authorized
.
任何帮助将不胜感激。