XMPP无法获得Rosters iOS

时间:2016-02-25 04:28:04

标签: ios xmpp

我发送了一个IQ请求,但是我没有得到正确的结果。后面的IQ是错误

<error code="403" type="auth"><forbidden xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/></error>

我的代码是:

- (void)queryRoster {
    NSXMLElement *query = [NSXMLElement elementWithName:@"query" xmlns:@"jabber:iq:roster"];
    NSXMLElement *iq = [NSXMLElement elementWithName:@"iq"];
    XMPPJID *myJID = self.stream.myJID;
    [iq addAttributeWithName:@"from" stringValue:@"admin@127.0.0.1"];
    [iq addAttributeWithName:@"to" stringValue:@"127.0.0.1"];
    [iq addAttributeWithName:@"id" stringValue:@"1993"];
    [iq addAttributeWithName:@"type" stringValue:@"get"];
    [iq addChild:query];
    [self.stream sendElement:iq];
}

2 个答案:

答案 0 :(得分:0)

根据RFC 6121 §2.1.3,要获得自己的名单,您需要将iq发送到您自己的JID。在您的代码中,您将iq发送到服务器的JID。

- (void)queryRoster {
    NSXMLElement *query = [NSXMLElement elementWithName:@"query" xmlns:@"jabber:iq:roster"];
    NSXMLElement *iq = [NSXMLElement elementWithName:@"iq"];
    XMPPJID *myJID = self.stream.myJID;
    // Don't add a "from" attribute, it is not necessary
    [iq addAttributeWithName:@"to" stringValue:@"admin@127.0.0.1"];
    // Probably better:
    // [iq addAttributeWithName:@"to" stringValue:[myJID bare]];
    [iq addAttributeWithName:@"id" stringValue:@"1993"];
    [iq addAttributeWithName:@"type" stringValue:@"get"];
    [iq addChild:query];
    [self.stream sendElement:iq];
}

不允许为他人检索名单,因此未经授权&#34;错误。

答案 1 :(得分:-1)

我认为可能存在身份验证问题。请再次检查您的配置文件。还有一种可能性,如果您的配置文件是正确的,那么您需要检查您是否在Ejabbered管理主页上提供了正确的访问规则。

转到您的Ejabbered管理主页 - &gt;使用管理员凭据登录 - &gt;在Leftside菜单中,您将找到“访问规则”选项卡。

您可以在下页找到有关访问规则的更多信息。

Access Rules for Ejabbered XMPP

检查完所有细节后,请尝试以下代码: -

- (void)FetchFriends 
{
    NSError *error = [[NSError alloc] init];
    NSXMLElement *query = [[NSXMLElement alloc] initWithXMLString:@"<query xmlns='jabber:iq:roster'/>"error:&error];
    NSXMLElement *iq = [NSXMLElement elementWithName:@"iq"];
[iq addAttributeWithName:@"type" stringValue:@"get"];
    [iq addAttributeWithName:@"id" stringValue:@"ID_NAME"];
    [iq addAttributeWithName:@"from" stringValue:@"yourid_name@***.com"]; // Try with name in-place of ip like 127.0.0.1
[iq addChild:query];
    [xmppStream sendElement:iq];
}

并在Delegate方法中检查服务器响应

- (BOOL)xmppStream:(XMPPStream *)sender didReceiveIQ:(XMPPIQ *)iq
{
    NSXMLElement *queryElement = [iq elementForName: @"query" xmlns: @"jabber:iq:roster"];
    if (queryElement) 
    {
        NSArray *itemElements = [queryElement elementsForName: @"item"];
        for (int i=0; i<[itemElements count]; i++)
        {
            NSLog(@"Friend: %@",[[itemElements[i] attributeForName:@"jid"]stringValue]);

        }
    }
    return NO;
}