2

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

また、私が設定したことを追加したい:

publicRoom: 1 モデレート: 0 membersOnly: 0 canInvite: 1 roomPassword: nil canRegister: 1 canDiscoverJID: 1 logEnabled: 1

また、あるデバイスからメッセージを送信しようとすると、別のユーザー (そのユーザーはグループの作成者/管理者ではない) でログに記録されている 2 番目のデバイスでメッセージを取得すると、LOG_LEVEL_VERBOSE を使用してコンソールに着信メッセージが表示されます。 、しかしデリゲートメソッドを呼び出しません。デリゲート メソッドが呼び出されない理由はありますか? (そして、.h に XMPPRoomDelegate を追加します) 誰でもこのエラーを解決できますか? 忍耐とサポートをよろしくお願いします!

4

1 に答える 1