2014-05-01 74 views
2

我正在使用XMPP框架研究聊天概念。我成功地能够与服务器建立连接。现在我的下一步是进入给定的房间。如何进入聊天室+ 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

@iPatel我刚进入房间它在服务器端的静态聊天室 –

+0

确定..我只是把上面的链接,我从谷歌,否则我发现没有任何与XMPP框架的经验.. :)开心编码:) – iPatel

+0

@Sudha这可能会帮助你。 http://stackoverflow.com/questions/19268629/xmpp-ios-chat-c​​lient-implement-group-chat – DipakSonara

回答

0

首先,这些线路都是错误的:

XMPPIQ *iq = [XMPPIQ iq]; 
    [iq addChild:presence]; 

3种XMPP用途<presence><message><iq>。您将这些作为XML <stream:stream>的独立子项发送。在iq中包装存在是没有意义的。但是在你的示例代码中,你在做这些之后并没有使用iq,所以这可能不是导致你问题的原因。

其次,您应该将您的状态发送到完整的JID,而不是纯粹的JID。完整的JID是一个包含资源的jid,所以[email protected]/resource而不是[email protected]。您在资源中指定的内容将成为聊天中的昵称。见Example 18 in XEP-0045。因此,相反,你应该做类似的东西:

NSString *room = [[@"myroom" stringByAppendingString:@"@app.xmpp.syn.in"] stringByAppendingString:@"/nickname"]; 
    [presence addAttributeWithName:@"to" stringValue:room];