无法在多用户聊天中发送或接收消息-XMPPFramework [英] Unable to send or receive messages in Multi User Chat - XMPPFramework

查看:136
本文介绍了无法在多用户聊天中发送或接收消息-XMPPFramework的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在Openfire服务器上创建了一个群组,并创建了两个用户.我能够使用XMPPFramework对两个用户进行身份验证,但无法在他们之间交换消息.我可以看到两个用户都加入了Openfire服务器上的组.

I have created a group on Openfire server and two users. I'm able to authenticate both users using XMPPFramework but unable to exchange the messages between them. I can see both users join the group on Openfire server.

使用以下服务器详细信息:

Using the following server details:

#define kHostName @"Some Server URL"
#define kServerName @"Some Server Name"
#define kRoomAddress @"testchatroom@conference.Some Server Name"    

使用以下代码进行流媒体设置和创建房间:

Using the following code for stream setup and creating room:

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

使用以下代码发送消息:

Using the following code to send messages:

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

推荐答案

构建XMPPMessage的方法不是正确的方法. xmpp消息的正文是元素而不是属性.

The way how you build the XMPPMessage isn't the correctly way. The body of xmpp message is an element not an attribute.

尝试一下:

XMPPMessage *xmppMessage = [[XMPPMessage alloc] initWithType:@"groupchat" to:[XMPPJID jidWithString:@"user@server.com"]];
[xmppMessage addBody:@"Hi there"];

如果要添加其他参数:

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

然后发送:

[xmppRoom sendMessage:message];

我建议您实现 didFailToSendMessage 委托,并在发送消息后检查是否收到错误:

I recommend you to implement didFailToSendMessage delegate, and check if you are receiving an error after sending your message:

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

这篇关于无法在多用户聊天中发送或接收消息-XMPPFramework的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆