我正在使用XMPP框架处理聊天概念。我成功地能够与服务器建立连接。现在我的下一步是进入给定的房间。
NSXMLElement *presence = [NSXMLElement elementWithName:@"presence"];
NSString *room = [@"myroom" stringByAppendingString:@"@app.xmpp.syn.in"];
[presence addAttributeWithName:@"to" stringValue:room];
NSXMLElement *x = [NSXMLElement elementWithName:@"x" xmlns:@"http://jabber.org/protocol/muc"];
NSXMLElement *history = [NSXMLElement elementWithName:@"history"];
[history addAttributeWithName:@"maxstanzas" stringValue:@"50"];
[x addChild:history];
[presence addChild:x];
XMPPIQ *iq = [XMPPIQ iq];
[iq addChild:presence];
[xmppStream sendElement:presence];
我已经尝试过上面的代码,但它没有用。它没有采用以下方法。
- (void)sendElement:(NSXMLElement *)element
{
if (element == nil) return;
dispatch_block_t block = ^{ @autoreleasepool {
if (state == STATE_XMPP_CONNECTED)
{
[self sendElement:element withTag:TAG_XMPP_WRITE_STREAM];
}
else
{
NSError *error = [NSError errorWithDomain:XMPPStreamErrorDomain
code:XMPPStreamInvalidState userInfo:nil];
[self failToSendElement:element error:error];
}
}};
if (dispatch_get_specific(xmppQueueTag))
block();
else
dispatch_async(xmppQueue, block);
}
我是第一次实施这个。可能是我错误进入MUC房间。请更正或建议我解决此问题。
答案 0 :(得分:0)
首先,这些行是错误的:
XMPPIQ *iq = [XMPPIQ iq];
[iq addChild:presence];
3节中使用的XMPP是<presence>
,<message>
和<iq>
。您将这些作为XML <stream:stream>
的单独子项发送。在iq中包含存在是没有意义的。但是在您的示例代码中,您在执行此操作后并未使用iq
,因此这可能不会导致您出现问题。
其次,您应该将您的状态发送到完整的JID,而不是裸JID。完整的JID是包含资源的jid,因此myroom@app.xmpp.syn.in/resource
代替myroom@app.xmpp.syn.in
。您指定为资源的内容将成为聊天中的昵称。见Example 18 in XEP-0045。所以相反,你应该做类似的事情:
NSString *room = [[@"myroom" stringByAppendingString:@"@app.xmpp.syn.in"] stringByAppendingString:@"/nickname"];
[presence addAttributeWithName:@"to" stringValue:room];