XMPPFramework - 如何创建一个多用户聊天室并邀请其他用户?

19

我正在使用Robbiehanson的iOS XMPPFramework。我尝试创建一个MUC房间并邀请用户加入群聊,但没有成功。

我正在使用以下代码:

XMPPRoom *room = [[XMPPRoom alloc] initWithRoomName:@"user101@conference.jabber.org/room" nickName:@"room"];
[room createOrJoinRoom];
[room sendInstantRoomConfig];
[room setInvitedUser:@"ABC@jabber.org"];
[room activate:[self xmppStream]];    
[room inviteUser:jid1 withMessage:@"hello please join."];
[room sendMessage:@"HELLO"];

用户ABC@jabber.org应该收到邀请消息,但没有任何反应。

非常感谢您的帮助。:)

3个回答

35

在探索了各种解决方案后,我决定在此处编译并分享我的实现:

  1. 创建一个XMPP房间:

    XMPPRoomMemoryStorage *roomStorage = [[XMPPRoomMemoryStorage alloc] init];
    
    /** 
     * Remember to add 'conference' in your JID like this:
     * e.g. uniqueRoomJID@conference.yourserverdomain
     */
    
    XMPPJID *roomJID = [XMPPJID jidWithString:@"chat@conference.shakespeare"];
    XMPPRoom *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];
    
  2. 检查此代理中的房间是否成功创建:

    - (void)xmppRoomDidCreate:(XMPPRoom *)sender
    
  3. 检查您是否在此委托中加入了房间:

  4. - (void)xmppRoomDidJoin:(XMPPRoom *)sender
    
  5. 创建房间后,获取房间配置表单:

    - (void)xmppRoomDidJoin:(XMPPRoom *)sender {
        [sender fetchConfigurationForm];
    }
    
  6. 配置您的房间

  7. /**
     * Necessary to prevent this message: 
     * "This room is locked from entry until configuration is confirmed."
     */
    
    - (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];
    }
    

    参考资料: XEP-0045:多用户聊天实现群组聊天

  8. 邀请用户

  9. - (void)xmppRoomDidJoin:(XMPPRoom *)sender 
    {
        /** 
         * You can read from an array containing participants in a for-loop 
         * and send multiple invites in the same way here
         */
    
        [sender inviteUser:[XMPPJID jidWithString:@"keithoys"] withMessage:@"Greetings!"];
    }
    
    那么,您已经创建了一个XMPP多用户/群聊房间,并邀请了一个用户。 :)


2
@rohitmandiwal 非常愉快!您可以通过上面的代码行创建一个密码保护的MUC房间 - [xmppRoom joinRoomUsingNickname:[self appDelegate].xmppStream.myJID.user history:nil password:@"myPassword"]; - Keith OYS
大家好,感谢各位和Stack Overflow的帮助,我已经成功创建了一个群组并且能够通过两种方式(核心数据和内存存储)向其他人发送邀请。但问题是,当我创建第二个群组时,它会从核心数据存储中删除第一个群组的数据。另外,我们如何实现自动加入其他用户? - Mangesh
@Keith - 我无法在MUC中发送或接收消息。我已经创建了一个房间并让用户加入了房间。我可以在Openfire服务器上看到加入的用户,但是我无法交换消息。 - Himanshu Mahajan
@Keith - 你能否帮我检查一下代码,并指出我的错误所在?http://stackoverflow.com/questions/35156933/unable-to-send-or-receive-messages-in-multi-user-chat-xamppframework - Himanshu Mahajan
@KeithOYS,你能帮我解决这个问题吗?https://stackoverflow.com/questions/44172852/how-to-parse-xmppmessage-element-attribute-and-node-in-xmppframework-with-swif - May Phyu
显示剩余9条评论

1

我有一种感觉,在分配初始化之后,第一件事就是将其附加到您的xmppStream上,以便它可以使用xmppStream发送/接收消息。

更确切地说:

XMPPRoom *room = [[XMPPRoom alloc] initWithRoomName:@"user101@conference.jabber.org/room" nickName:@"room"];
[room activate:[self xmppStream]];

//other things (create/config/...)

1
检查最新的XMPPMUCLight和XMPPRoomLight,它们类似于WhatsApp和其他当今流行的社交应用程序房间,即使离线或没有人在房间中,也不会被销毁或成员踢出。
请参考此文档MongooseIM的mod

你能帮我解决这个问题吗?https://stackoverflow.com/questions/44172852/how-to-parse-xmppmessage-element-attribute-and-node-in-xmppframework-with-swif ? - May Phyu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接