2016-02-02 4 views
1

Я создал группу на сервере Openfire и двух пользователей. Я могу аутентифицировать обоих пользователей, используя XMPPFramework, но не могу обменять сообщения между ними. Я вижу, что оба пользователя присоединяются к группе на сервере Openfire.Не удалось отправить или получить сообщения в многопользовательском чате - XMPPFramework

Используя следующие сведения о сервере:

#define kHostName @"Some Server URL" 
#define kServerName @"Some Server Name" 
#define kRoomAddress @"[email protected] Server Name"  

Используя следующий код для настройки потока и создания комнаты:

- (void)setupStream { 

    NSString *jabberID = [UserDefaults stringForKey:kUserID]; 
    NSString *myPassword = [UserDefaults stringForKey:kUserPassword]; 

    [DDLog addLogger:[DDTTYLogger sharedInstance]]; 

    self.xmppStream = [[XMPPStream alloc] init]; 
    [self.xmppStream addDelegate:self delegateQueue:dispatch_get_main_queue()]; 
    self.xmppStream.hostName = kHostName; 
    self.xmppStream.hostPort = OptionPort; 

    NSString *userName = [NSString stringWithFormat:@"%@@%@", jabberID, kServerName]; 
    self.xmppStream.myJID = [XMPPJID jidWithString:userName]; 
    password = myPassword; 

    NSError *error = nil; 
    if (OptionOldSchoolSSL) 
     [self.xmppStream oldSchoolSecureConnectWithTimeout:timeOut error:&error]; 
    else 
     [self.xmppStream connectWithTimeout:timeOut error:&error]; 
} 

#pragma mark - 
#pragma mark XMPP delegates 

- (void)xmppStreamDidConnect:(XMPPStream *)sender { 

    isOpen = YES; 

    Class authClass = nil; 
    if ([OptionAuthenticationMethod isEqual:XMPPAuthenticationMethodPlain]) 
     authClass = [XMPPPlainAuthentication class]; 
    else if ([OptionAuthenticationMethod isEqual:XMPPAuthenticationMethodDigestMD5]) 
     authClass = [XMPPDigestMD5Authentication class]; 
    else { 
     NSLog(@"Unrecognized auhthentication method '%@', falling back on Plain", 
     OptionAuthenticationMethod); 
     authClass = [XMPPPlainAuthentication class]; 
    } 
    id<XMPPSASLAuthentication> auth = [[authClass alloc] initWithStream:sender 
                   password:password]; 
    NSError *error = nil; 
    if (![sender authenticate:auth error:&error]) 
     NSLog(@"Error authenticating: %@", error); 
    else 
     NSLog(@"Authenticated !!"); 
} 

- (void)xmppStreamDidAuthenticate:(XMPPStream *)sender { 
    [self createRoom]; 
} 

- (void)createRoom { 

    self.roomStorage = [[XMPPRoomMemoryStorage alloc] init]; 
    XMPPJID *roomJID = [XMPPJID jidWithString:kRoomAddress]; 
    self.xmppRoom = [[XMPPRoom alloc] initWithRoomStorage:self.roomStorage 
                 jid:roomJID 
              dispatchQueue:dispatch_get_main_queue()]; 

    [self.xmppRoom activate:self.xmppStream]; 
    [self.xmppRoom addDelegate:self 
       delegateQueue:dispatch_get_main_queue()]; 

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

#pragma mark XMPPRoom delegates 

- (void)xmppRoomDidCreate:(XMPPRoom *)sender { 
    NSLog(@"%s", __PRETTY_FUNCTION__); 
} 

- (void)xmppRoomDidJoin:(XMPPRoom *)sender { 
    NSLog(@"%s", __PRETTY_FUNCTION__); 

    NSString *jabberID = [UserDefaults stringForKey:kUserID]; 
    NSString *userName = [NSString stringWithFormat:@"%@@%@", jabberID, kServerName]; 
    XMPPJID *jid = [XMPPJID jidWithString:userName]; 

    [sender inviteUser:jid withMessage:nil]; 
} 

- (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"]; 
     // Make Room Persistent 
     if ([var isEqualToString:@"muc#roomconfig_persistentroom"]) { 
      [field removeChildAtIndex:0]; 
      [field addChild:[NSXMLElement elementWithName:@"value" stringValue:@"1"]]; 
     } 
    } 
    [sender configureRoomUsingOptions:newConfig]; 
} 

- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message { 

    NSMutableDictionary *m = [[NSMutableDictionary alloc] init]; 

    NSString *msg = [[message elementForName:@"body"] stringValue]; 
    NSString *from = [[message attributeForName:@"from"] stringValue]; 

    if (msg != nil && from != nil) { 
     [m setObject:msg forKey:@"msg"]; 
     [m setObject:from forKey:@"sender"]; 
     [_messageDelegate newMessageReceived:m]; 
    } 
} 

Используя следующий код для отправки сообщения:

if ([messageStr length] > 0) { 
    NSString *jabberID = [UserDefaults stringForKey:kUserID]; 
    NSString *userName = [NSString stringWithFormat:@"%@@%@", jabberID, kServerName]; 

    XMPPMessage * message = [[XMPPMessage alloc] init]; 
    [message addAttributeWithName:@"body" stringValue:messageStr]; 
    [message addAttributeWithName:@"sender" stringValue:userName]; 

    [DELEGATE.xmppClient.xmppRoom sendMessage:message]; 

    self.txtMessageField.text = @""; 

    NSMutableDictionary *m = [[NSMutableDictionary alloc] init]; 
    [m setObject:[messageStr substituteEmoticons] forKey:@"msg"]; 
    [m setObject:@"you" forKey:@"sender"]; 
    [m setObject:[NSString getCurrentTime] forKey:@"time"]; 

    [self.messages addObject:m]; 
    [self.messagesTableView reloadData]; 
} 

ответ

1

Способ, которым вы создаете XMPPMessage, неверен. Тело сообщения xmpp является элементом, а не атрибутом.

Попробуйте это:

XMPPMessage *xmppMessage = [[XMPPMessage alloc] initWithType:@"groupchat" to:[XMPPJID jidWithString:@"[email protected]"]]; 
[xmppMessage addBody:@"Hi there"]; 

И если вы хотите добавить дополнительные параметры:

XMPPElement *extraElement = [XMPPElement elementWithName:@"sender" stringValue:@"you"]; 
[xmppMessage addChild:extraElement]; 

А потом просто отправить:

[xmppRoom sendMessage:message]; 

Я рекомендую вам реализовать didFailToSendMessage делегировать и проверить, если вы получаете сообщение об ошибке после отправки вашего сообщения:

- (void)xmppStream:(XMPPStream *)sender didFailToSendMessage:(XMPPMessage *)message error:(NSError *)error {} 

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

  • Нет связанных вопросов^_^