Создайте комнату чата с помощью XMPPFramework openfire

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

- (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. Пожалуйста, помогите мне решить проблему. Любая помощь будет оценена.


person Sushil Sharma    schedule 08.04.2015    source источник


Ответы (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);
}
person Kishore Suthar    schedule 04.05.2015
comment
если вы столкнетесь с какой-либо проблемой, дайте мне знать - person Kishore Suthar; 04.05.2015
comment
Спасибо за ответ, @suthar, На самом деле я могу создать чат и добавлять пользователей в качестве участников в чат. Но я застрял на интеграции coreData. Как сохранить и получить список чатов и сообщения из coreData, предоставленные XMPPFramework? - person Sushil Sharma; 04.05.2015
comment
В настоящее время я использую sqlite для этого, вы также можете использовать sqlite для сохранения чата - person Kishore Suthar; 04.05.2015
comment
Разве мы не можем сделать это с помощью coreData? Потому что XMPPFramework предоставляет для него модели данных. - person Sushil Sharma; 04.05.2015
comment
Да, я знаю это, но я не работал с coreData, поэтому я выбрал для этого sqlite. - person Kishore Suthar; 04.05.2015
comment
Окей, @suthar. Спасибо - person Sushil Sharma; 04.05.2015
comment
Я получаю несколько сообщений, когда присоединяюсь к уже созданной комнате, может ли кто-нибудь помочь, почему это происходит? - person Kaushik Movaliya; 17.12.2015
comment
NSXMLElement *history = [NSXMLElement elementWithName:@history]; [история addAttributeWithName:@maxstanzas stringValue:@0]; - person Kishore Suthar; 17.12.2015