【问题标题】:How to fetch member list of a MUC room with a member using iOS XMPP Robbie Hanson library如何使用 iOS XMPP Robbie Hanson 库获取具有成员的 MUC 房间的成员列表
【发布时间】:2015-06-23 08:59:22
【问题描述】:

我正在使用 git 上提供的 Robby Hanson 的 XMPP 库,并且我正在尝试实现 MUC 或群聊室。

我正在使用一个用户创建房间,然后尝试加入,而没有邀请另一个用户。问题是,如果我尝试连接另一个用户,而不是房间的创建者,我会收到错误:

<iq xmlns="jabber:client" type="error" id="A7F05488-4A84-4EC0-8A6C-0F1541690534" from="newroom4@conference.administrator" to="newuser229@administrator/abdbd1bc"><query xmlns="http://jabber.org/protocol/muc#admin"><item affiliation="member"/></query><error code="403" type="auth"><forbidden xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error></iq>

我还搜索了错误,发现如果用户被禁止,可能会出现错误 403。这不是这里的情况。 因此,当我尝试获取诸如 fetchConfigurationForm 或 fetchMembersList 之类的房间信息时会发生错误。

所以,这是我正在使用的代码:

- (void)testGroupButtonFunction{
    XMPPRoomMemoryStorage *roomStorage = [[XMPPRoomMemoryStorage alloc] init];
    XMPPJID *roomJID = [XMPPJID jidWithString:@"newRoom4@conference.administrator"];

    xmppRoom = [[XMPPRoom alloc] initWithRoomStorage:roomStorage
                                                 jid:roomJID                                                    
                                    dispatchQueue:dispatch_get_main_queue()];
    [xmppRoom activate:[self appDelegate].xmppStream];
    [xmppRoom addDelegate:self
            delegateQueue:dispatch_get_main_queue()];
    [xmppRoom joinRoomUsingNickname:[self appDelegate].xmppStream.myJID.user
                            history:nil
                           password:nil];
}

- (void)handleDidJoinRoom:(XMPPRoom *)room withNickname:(NSString *)nickname{

    NSLog(@"handleDidJoinRoom");

}

- (void)handleIncomingMessage:(XMPPMessage *)message room:(XMPPRoom *)room{

    NSLog(@"Incomming message: %@", message.debugDescription);

}

- (void)handleOutgoingMessage:(XMPPMessage *)message room:(XMPPRoom *)room{

    NSLog(@"Outgoing message: %@", message.debugDescription);

}

- (void)xmppRoom:(XMPPRoom *)sender didFetchMembersList:(NSArray *)items{

    NSLog(@"didFetchMembersList: %@", items.debugDescription);

}

- (void)xmppRoom:(XMPPRoom *)sender didNotFetchMembersList:(XMPPIQ *)iqError{

    NSLog(@"didNotFetchMembersList error: %@", iqError.debugDescription);

}

- (void)xmppRoomDidCreate:(XMPPRoom *)sender{

    NSLog(@"xmppRoomDidCreate");

}

- (void)xmppRoom:(XMPPRoom *)sender didConfigure:(XMPPIQ *)iqResult{

    NSLog(@"didConfigure: %@", iqResult.debugDescription);

}

- (void)xmppRoomDidJoin:(XMPPRoom *)sender {

    NSLog(@"xmppRoomDidJoin");
// I use the same code to create or join a room that's why I commented the next line
//    [xmppRoom fetchConfigurationForm];
    //Next line generates the error:
    [xmppRoom fetchMembersList];

}

- (void)xmppRoom:(XMPPRoom *)sender didFetchConfigurationForm:(NSXMLElement *)configForm{

    NSLog(@"didFetchConfigurationForm");

    NSXMLElement *newConfig = [configForm copy];
    NSArray *fields = [newConfig elementsForName:@"field"];
    for (NSXMLElement *field in fields)
    {
        NSString *var = [field attributeStringValueForName:@"var"];
        NSLog(@"didFetchConfigurationForm: %@", var);
        // Make Room Persistent
        if ([var isEqualToString:@"muc#roomconfig_persistentroom"]) {
            [field removeChildAtIndex:0];
            [field addChild:[NSXMLElement elementWithName:@"value" stringValue:@"1"]];
        }
        if ([var isEqualToString:@"muc#roomconfig_roomdesc"]) {
            [field removeChildAtIndex:0];
            [field addChild:[NSXMLElement elementWithName:@"value" stringValue:@"Apple"]];
        }
    }

    [sender configureRoomUsingOptions:newConfig];

}

- (void)xmppRoom:(XMPPRoom *)sender didNotConfigure:(XMPPIQ *)iqResult{

    NSLog(@"didNotConfigure: %@",iqResult.debugDescription);

}

我使用相同的代码来创建或加入房间,这就是我评论下一行的原因:

[xmppRoom fetchConfigurationForm];

我还想补充一下我设置的:

公共房间:1 主持:0 仅限会员:0 可邀请:1 房间密码:无 可以注册:1 canDiscoverJID : 1 日志启用:1

此外,如果我尝试从一个设备发送消息,当我在与另一个用户(该用户不是组的创建者/管理员)登录的第二个设备上检索消息时,我会在使用 LOG_LEVEL_VERBOSE 的控制台,但它不调用委托方法。 知道为什么不调用委托方法吗? (我确实在 .h 中添加了 XMPPRoomDelegate) 谁能帮我解决这个错误? 非常感谢您的耐心和支持!

【问题讨论】:

    标签: ios objective-c xmpp openfire muc


    【解决方案1】:

    是因为它没有遵循 XEP0045 指令。你应该做一个实现这个方法的类别:

    - (void)joinRoomByContact:(Contact *)contact history:(NSXMLElement *)history
    {
        dispatch_block_t block = ^{ @autoreleasepool {
    
            // Check state and update variables
    
            // <presence to='darkcave@chat.shakespeare.lit/firstwitch'>
            //   <x xmlns='http://jabber.org/protocol/muc'/>
            //     <history/>
            //     <password>passwd</password>
            //   </x>
            // </presence>
    
            NSXMLElement *x = [NSXMLElement elementWithName:@"x" xmlns:XMPPMUCNamespace];
            if (history)
            {
                [x addChild:history];
            }
    
            //XMPPPresence *presence = [XMPPPresence presenceWithType:nil to:myRoomJID];
            XMPPElement * presence = [[XMPPElement alloc] initWithName:@"presence"];
            [presence addAttributeWithName:@"to" stringValue:[NSString stringWithFormat:@"%@/%@",roomJID.bare,contact.name]];
            [presence addAttributeWithName:@"from" stringValue:contact.jid];
            [presence addChild:x];
    
    
            [xmppStream sendElement:presence];
    
    
            state |= (1 << 3);
    
        }};
    
        if (dispatch_get_specific(moduleQueueTag))
            block();
        else
            dispatch_async(moduleQueue, block);
    }
    

    希望对你有帮助;)

    【讨论】:

      猜你喜欢
      • 2015-06-24
      • 2017-03-27
      • 2016-01-29
      • 2017-03-30
      • 2015-07-14
      • 2014-06-25
      • 2012-09-13
      • 2015-02-08
      • 1970-01-01
      相关资源
      最近更新 更多