如何使用iOS XMPP Robbie Hanson库获取MUC房间的成员列表



我正在使用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仅限成员:0can邀请:1房间密码:nilcan注册:1canDiscoverJID:1日志启用:1

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

Is是因为它不遵循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);
}

我希望这对你有所帮助;)

最新更新