2013-10-09 3 views
18

Я работаю над клиентом чата iOS. Может ли кто-нибудь помочь мне в многопользовательском чате?XMPPFramework - выполнить групповой чат (MUC)

Я реализовал XMPPFramework от Robbiehanson.

Может кто-нибудь, пожалуйста, дайте мне знать, как получить список групп и создать группу на сервере с этой структурой?

Заранее спасибо.

+0

Привет всем, спасибо вам всем и starckoverflow, я могу создать group и отправлять приглашения другим пользователям с обоими хранилищами (основные данные и память). Проблема заключается в том, когда я создаю вторую группу, она удаляет данные первой группы из хранилища данных Core и также как мы можем автоматически присоединяться к другому пользователю? – Mangesh

ответ

38

, чтобы получить список номеров:

NSString* server = @"chat.shakespeare.lit"; //or whatever the server address for muc is 
XMPPJID *servrJID = [XMPPJID jidWithString:server]; 
XMPPIQ *iq = [XMPPIQ iqWithType:@"get" to:servJID]; 
[iq addAttributeWithName:@"from" stringValue:[xmppStream myJID].full]; 
NSXMLElement *query = [NSXMLElement elementWithName:@"query"]; 
[query addAttributeWithName:@"xmlns" stringValue:@"http://jabber.org/protocol/disco#items"]; 
[iq addChild:query]; 
[xmppStream sendElement:iq]; 

чек на ответ в метод делегата:

- (BOOL)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq{ 
    DDLogVerbose(@"%@", [iq description]); 
    return NO; 
} 

присоединиться или создать комнату

XMPPRoomMemoryStorage * _roomMemory = [[XMPPRoomMemoryStorage alloc]init]; 
NSString* roomID = @"[email protected]"; 
XMPPJID * roomJID = [XMPPJID jidWithString:roomID]; 
XMPPRoom* xmppRoom = [[XMPPRoom alloc] initWithRoomStorage:_roomMemory 
              jid:roomJID 
            dispatchQueue:dispatch_get_main_queue()]; 
[xmppRoom activate:self.xmppStream]; 
[xmppRoom addDelegate:self delegateQueue:dispatch_get_main_queue()]; 
[xmppRoom joinRoomUsingNickname:@"myNickname" 
         history:nil 
         password:nil]; 

проверка для ответа в методах делегата XMPPRoom:

- (void)xmppRoomDidCreate:(XMPPRoom *)sender{ 
    DDLogVerbose(@"%@: %@", THIS_FILE, THIS_METHOD); 
} 

- (void)xmppRoomDidJoin:(XMPPRoom *)sender{ 
    DDLogVerbose(@"%@: %@", THIS_FILE, THIS_METHOD); 
} 

обновление

настроить номер:

после:

[xmppRoom joinRoomUsingNickname:self.xmppStream.myJID.user 
         history:history 
         password:nil]; 

добавить:

[xmppRoom fetchConfigurationForm]; 

и проверить ответ на:

- (void)xmppRoom:(XMPPRoom *)sender didFetchConfigurationForm:(NSXMLElement *)configForm{ 
    DDLogVerbose(@"%@: %@ -> %@", THIS_FILE, THIS_METHOD, sender.roomJID.user); 
} 

Просмотрите configForm объект, и изменения по мере необходимости, а затем отправить его с [sender configureRoomUsingOptions:newConfig];

Например: изменить конфигурацию, чтобы сделать комнату постоянной вы может добавить что-то вроде:

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]; 

(i n Ot знакомы с NSXMLElement, так что, может быть, есть лучший способ, чтобы изменить значение)

+1

Спасибо за ваш ответ, это сработало для меня. Не могли бы вы дать мне знать, как настроить различный тип комнаты, я хочу создать постоянную комнату, похожую на группу в whatsapp, можно приглашать людей и общаться в чате. Пожалуйста, дайте мне знать, если у вас есть представление об этом. – Satish

+1

Посмотрите на '[xmppRoom configureRoomUsingOptions: (NSXMLElement *) roomConfigForm]'.Чтобы создать 'NSXMLElement' с конфигурацией комнаты, которую вы хотите, обратитесь к: [link] (http://xmpp.org/extensions/xep-0045.html#roomconfig) также посмотрите пример 159 –

+0

Спасибо за комментарий Flores, я сделал посмотрел в документе сервера и прочитал все в нем, но не мог понять, как его настроить. Я попытался передать форму для конфигурации, но это не повлияло. Если у вас есть код или какой-либо другой документ, это поможет ... – Satish

0
+(void)getGroupRooms{ 
    NSError *error = nil; 
    NSXMLElement *query = [[NSXMLElement alloc] initWithXMLString:@"<query xmlns='http://jabber.org/protocol/disco#items'/>" error:&error]; 
    XMPPIQ *iq = [XMPPIQ iqWithType:@"get" to:[XMPPJID jidWithString:Jabber_groupChat_Domain_server] elementID:[[[PXMPPManager sharedInstance] xmppStream] generateUUID] child:query]; 
    [iq addAttributeWithName:@"from" stringValue:[[[PXMPPManager sharedInstance] xmppStream] myJID].full]; 
    [[[PXMPPManager sharedInstance] xmppStream] sendElement:iq]; 

//<iq type="get" 
//to="conference.cnr-uat.panamaxil.com" 
//id="DF27F28E-488D-4DAB-AA03-399A4CDE91B3" 
//from="[email protected]/iphone"> 
//<query xmlns="http://jabber.org/protocol/disco#items"/> 
//</iq> 
} 

#pragma - mark XMPPStreamDelegate Methods 

- (BOOL)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq{ 
// NSLog(@"Did receive IQ"); 

    if([iq isResultIQ]) 
    { 
     if([iq elementForName:@"query" xmlns:@"http://jabber.org/protocol/disco#items"]) 
     { 
      NSLog(@"Jabber Server's Capabilities: %@", [iq XMLString]); 

      NSXMLElement *queryElement = [iq elementForName:@"query" xmlns:@"http://jabber.org/protocol/disco#items"]; 
      NSArray *items = [queryElement elementsForName:@"item"]; 
      NSMutableArray *arrGroupName = [[NSMutableArray alloc] init]; 
      for (NSXMLElement *i in items) { 
       NSString *roomName = [i attributeStringValueForName:@"name"]; 
       NSString *jidString = [i attributeStringValueForName:@"jid"]; 
       //XMPPJID *jid = [XMPPJID jidWithString:jidString]; 

       NSDictionary *dict = @{ 
             @"groupName" : roomName, 
             @"groupJID" : jidString, 
             }; 
       [arrGroupName addObject:dict]; 
      } 

      [ConversationsModel saveGroupName:arrGroupName]; 
     } 
    } 

    return false; 
} 
2

Вот Swift версия:

func joinRoom(with jidString: String, delegate: XMPPRoomDelegate) -> XMPPRoom { 

    let roomJID = XMPPJID(string: jidString) 
    let roomStorage = XMPPRoomCoreDataStorage.sharedInstance() 

    let room = XMPPRoom(roomStorage: roomStorage, jid: roomJID, dispatchQueue: DispatchQueue.main)! 

     room.activate(xmppStream) 

     room.addDelegate(delegate, delegateQueue: DispatchQueue.main) 

     // If the room is not existing, server will create one. 
     room.join(usingNickname: xmppStream.myJID.user, history: nil) 

     return room 
    } 

    // MUCRoomDelegate 
    public func xmppRoomDidCreate(_ sender: XMPPRoom!) { 
     print("xmppRoomDidCreate") 

     // I prefer configure right after created 
     sender.fetchConfigurationForm() 
    } 

    public func xmppRoomDidJoin(_ sender: XMPPRoom!) { 
     print("xmppRoomDidJoin") 
    } 

    public func xmppRoom(_ sender: XMPPRoom!, didFetchConfigurationForm configForm: DDXMLElement!) { 
     print("didFetchConfigurationForm") 

     let newForm = configForm.copy() as! DDXMLElement 

     for field in newForm.elements(forName: "field") { 

      if let _var = field.attributeStringValue(forName: "var") { 

       switch _var { 
       case "muc#roomconfig_persistentroom": 
        field.remove(forName: "value") 
        field.addChild(DDXMLElement(name: "value", numberValue: 1)) 

       case "muc#roomconfig_membersonly": 
        field.remove(forName: "value") 
        field.addChild(DDXMLElement(name: "value", numberValue: 1)) 

       // other configures 
       default: 
        break 
       } 

      } 

     } 

     sender.configureRoom(usingOptions: newForm) 
    } 

    public func xmppRoom(_ sender: XMPPRoom!, didConfigure iqResult: XMPPIQ!) { 
     print("didConfigure") 
    } 
+0

Можете ли вы мне помочь в этом https://stackoverflow.com/questions/44172852/how-to-parse-xmppmessage-element-attribute-and-node-in-xmppframework-with-swif @dichen? –

Смежные вопросы