2014-05-01 108 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];