MUC如何使用XMPPFramework

Ten*_* Go 5 xmpp objective-c ios xmppframework

我正在开发一个使用Robbie Hanson的XMPPFramework的iOS XMPP聊天应用程序.

已经实现了最重要的功能 - 发送和接收消息.基本上,我已经构建了一个基本的功能聊天应用程序,当然还有点眼睛.

现在,我遇到的问题是关于MUC.我从其他网站看到的代码表明,有一种方法initWithRoomNameXMPPRoom.但是,我克隆的git repo中没有这种方法.那么,替代方案是什么呢?或者,如果没有,我如何使用XMPPFramework创建房间?

谢谢.

Ten*_* Go 11

以下是我如何解决自己的问题.请注意,此解决方案根本不涉及XMPPRoom.首先,我创建了一种方法,根据情况,创建或进入房间.(根据XMPP文档,创建的XML请求与您发送进入房间的XML请求相同;也就是说,如果房间在您输入时尚不存在,则服务将为您创建.)

开始了.这是创建/进入房间的方法.此方法的作用是向您打算创建/输入的房间发送状态.如果您是第一个进入房间并且尚未创建房间的人,您将自动成为其所有者和管理员.

- (void)createOrEnterRoom:(NSString *)roomName
{
//here we enter a room, or if the room does not yet exist, this method creates it
//per XMPP documentation: "If the room does not yet exist, the service SHOULD create the room"
//this method accepts an argument which is what you would baptize the room you wish created
NSXMLElement *presence = [NSXMLElement elementWithName:@"presence"];
NSString *room = [roomName stringByAppendingString:@"@conference.jabber.com/iMac"];
[presence addAttributeWithName:@"to" stringValue:room];
 NSXMLElement *x = [NSXMLElement elementWithName:@"x" xmlns:@"http://jabber.org/protocol/muc"];
NSXMLElement *history = [NSXMLElement elementWithName:@"history"];
 [history addAttributeWithName:@"maxstanzas" stringValue:@"50"];
 [x addChild:history];
 [presence addChild:x];
 [[self xmppStream] sendElement:presence];
}
Run Code Online (Sandbox Code Playgroud)

接下来,在声明了XMPPStream方法的AppDelegate中,我们通过检查服务器发送的状态代码来过滤我们在didReceivePresence方法中收到的XML响应.如果状态代码是201,宾果游戏!房间的创建很顺利.除了201之外的状态代码意味着不同的东西,但为了我们的目的,我们将重点放在201上.

- (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence
{
     NSXMLElement *x = [presence elementForName:@"x" xmlns:@"http://jabber.org/protocol/muc#user"];
    for (NSXMLElement *status in [x elementsForName:@"status"])
    {
        switch ([status attributeIntValueForName:@"code"])
        {
            case 201: [self notifyRoomCreationOk:room];
        }
    }
 }
Run Code Online (Sandbox Code Playgroud)

然后,我们告诉服务器我们正在创建一个类型为"instant"的房间,这意味着我们将发送一个IQ元素告诉它房间默认值.notifyRoomCreationOk是在房间创建成功时在不同视图中调用的委托方法,毕竟我必须在文本文件中记录房间以使其持久化,以便下次打开应用程序时,我之前创建的房间将可见.在我的notifyRoomCreationOk方法中,我有sendDefaultRoomConfig,它基本上描述了本段第一句中所述的内容.

-(void)sendDefaultRoomConfig:(NSString *)room
{
NSXMLElement *x = [NSXMLElement elementWithName:@"x" xmlns:@"jabber:x:data"];
[x addAttributeWithName:@"type" stringValue:@"submit"];
NSXMLElement *query = [NSXMLElement elementWithName:@"query" xmlns:@"http://jabber.org/protocol/muc#owner"];
[query addChild:x];
XMPPIQ *iq = [XMPPIQ iq];
[iq addAttributeWithName:@"id" stringValue:[NSString stringWithFormat:@"inroom-cr%@", room]];
[iq addAttributeWithName:@"to" stringValue:room];
[iq addAttributeWithName:@"type" stringValue:@"set"];
[iq addChild:query];
[[self xmppStream ] sendElement:iq];
}
Run Code Online (Sandbox Code Playgroud)

确保在调用上述方法的视图上启用了XMPPStream,否则这些将无效.这里的所有都是它的.玩得开心XMPP!