2015-04-08 2 views
0

Я работаю в чате, где мне нужно добавить групповой чат с использованием XMPP Framework. Я могу настроить peer-to-peer чате. Но когда дело доходит до группового чата, я не могу создать chat room. Я знаю, этот вопрос был задан многим раз раньше, но я не мог найти решения из этих ответов. Вот мой код для создания и настройки чата.Создать чат с XMPPFramework openfire

- (void)createChatRoom:(NSString *) newRoomName 
{ 
    NSString *jid=[NSString stringWithFormat:@"%@@%@",newRoomName,kGroupChatDomain]; 
    XMPPRoomMemoryStorage * _roomMemory = [[XMPPRoomMemoryStorage alloc]init]; 
    XMPPJID * roomJID = [XMPPJID jidWithString:jid]; 
    _xmppRoom = [[XMPPRoom alloc] initWithRoomStorage:_roomMemory 
                  jid:roomJID 
               dispatchQueue:dispatch_get_main_queue()]; 

    NSString *nickName=[NSString stringWithFormat:@"%@chatRoom",newRoomName]; 
    [_xmppRoom joinRoomUsingNickname:nickName 
          history:nil 
          password:nil]; 
    [_xmppRoom activate:[AppDel xmppStream]]; 
    [_xmppRoom addDelegate:self delegateQueue:dispatch_get_main_queue()]; 
    [_xmppRoom fetchConfigurationForm]; 
} 

- (void)xmppRoomDidCreate:(XMPPRoom *)sender{ 
    NSLog(@"didCreateChat Room method called"); 
} 

- (void)xmppRoomDidJoin:(XMPPRoom *)sender{ 
    NSLog(@"xmppRoomDidJoin method called "); 
} 

- (void)xmppRoom:(XMPPRoom *)sender didFetchConfigurationForm:(NSXMLElement *)configForm{ 
    NSXMLElement *newConfig = [configForm copy]; 
    NSArray* fields = [newConfig elementsForName:@"field"]; 
    for (NSXMLElement *field in fields) { 
     NSString *var = [field attributeStringValueForName:@"var"]; 
     if ([var isEqualToString:@"muc#roomconfig_persistentroom"]) { 
      [field removeChildAtIndex:0]; 
      [field addChild:[NSXMLElement elementWithName:@"value" stringValue:@"1"]]; 
     } 
    } 
    [sender configureRoomUsingOptions:newConfig]; 
} 

Выше приведен код создания и настройки чата. До , вызывающ этот код, я соединяю XMPP в viewDidLoad метод. Но Я не могу создать чат. Код не звонит XMPPRoom Delegate методы (xmppRoomDidCreate, xmppRoomDidJoin) Я не знаю , где я ошибаюсь, пожалуйста, исправьте меня, если в моем код ошибки. Я даже не мог найти ошибки в журналах openfire. Пожалуйста, помогите мне решить проблему. Любая помощь будет оценена.

ответ

1

Создать комнату и, если номер уже создан, Вы можете легко присоединиться к существующей группе, используя этот код

- (void)createOrEnterRoom:(NSString *)groupName 
{ 
    BOOL flag=valueExistInGroup(groupName); 
    if (flag==TRUE) { 
     savevalueInGroup(groupName); 

     XMPPRoomMemoryStorage *roomStorage = [[XMPPRoomMemoryStorage alloc] init]; 
     XMPPJID *roomJID = [XMPPJID jidWithString:[NSString stringWithFormat:@"%@@conference.your_server_name",groupName]]; 
     XMPPRoom *xmppRoom = [[XMPPRoom alloc] initWithRoomStorage:roomStorage 
                   jid:roomJID 
                dispatchQueue:dispatch_get_main_queue()]; 

     [xmppRoom activate:xmppStream]; 
     [xmppRoom addDelegate:self 
       delegateQueue:dispatch_get_main_queue()]; 
     [xmppRoom joinRoomUsingNickname:xmppStream.myJID.user 
           history:nil 
           password:nil]; 
} 
    else 
    { 
     NSString *strJid=[AppSetting getUserId]; 
     strJid=[strJid stringByAppendingFormat:@"@your_server_name"]; 
     _xmppRoomStorage = [XMPPRoomHybridStorage sharedInstance]; 
     XMPPJID *roomJid = [XMPPJID jidWithString:[NSString stringWithFormat:@"%@@conference.52.10.97.23",groupName]]; 
     XMPPRoom *xmppRoom = [[XMPPRoom alloc] initWithRoomStorage:_xmppRoomStorage jid:roomJid]; 
     [xmppRoom addDelegate:self delegateQueue:dispatch_get_main_queue()]; 
     [xmppRoom activate:xmppStream]; 
     NSXMLElement *history = [NSXMLElement elementWithName:@"history"]; 
     [history addAttributeWithName:@"maxstanzas" stringValue:@"10"]; 
     [xmppRoom joinRoomUsingNickname:strJid history:nil]; 
    } 
} 


- (void)xmppRoomDidJoin:(XMPPRoom *)sender{ 
    [sender fetchConfigurationForm]; 
} 

- (void)fetchConfigurationForm 
{ 
    dispatch_block_t block = ^{ @autoreleasepool { 

     XMPPLogTrace(); 

     // <iq type='get' 
     //  id='config1' 
     //  to='[email protected]'> 
     // <query xmlns='http://jabber.org/protocol/muc#owner'/> 
     // </iq> 

     NSString *fetchID = [xmppStream generateUUID]; 

     NSXMLElement *query = [NSXMLElement elementWithName:@"query" xmlns:XMPPMUCOwnerNamespace]; 
     XMPPIQ *iq = [XMPPIQ iqWithType:@"get" to:roomJID elementID:fetchID child:query]; 

     [xmppStream sendElement:iq]; 

     [responseTracker addID:fetchID 
         target:self 
         selector:@selector(handleConfigurationFormResponse:withInfo:) 
         timeout:60.0]; 

    }}; 

    if (dispatch_get_specific(moduleQueueTag)) 
     block(); 
    else 
     dispatch_async(moduleQueue, block); 
} 
+0

если вы сталкиваетесь с любой проблемой, дайте мне знать – suthar

+0

Спасибо за ответ, @suthar, На самом деле я могу создать чат комнату и добавление пользователей в качестве чата. Но я застрял в интеграции coreData. Как сохранить и получить список комнат чата и сообщения из coreData, предоставленные XMPPFramework? –

+0

В настоящее время я использую sqlite для этого, вы также можете использовать sqlite для сохранения чата – suthar