gpt4 book ai didi

ios - MUC 如何使用 XMPPFramework

转载 作者:可可西里 更新时间:2023-11-01 04:16:37 28 4
gpt4 key购买 nike

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

最重要的功能已经实现 - 发送和接收消息。基本上,我已经构建了一个基本的功能性聊天应用程序,当然还有一些花哨的东西。

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

谢谢。

最佳答案

以下是我如何解决自己的问题。请注意,此解决方案根本不涉及 XMPPRoom。首先,我创建了一个方法,根据情况创建或进入房间。 (根据 XMPP 文档,用于创建的 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];
}

接下来,在声明 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];
}
}
}

然后,我们告诉服务器我们正在创建一个“即时”类型的房间,这意味着我们将发送一个 IQ 元素告诉它房间默认值。 notifyRoomCreationOk 是在房间创建成功时在不同 View 中调用的委托(delegate)方法,毕竟我必须将房间记录在文本文件中以使其持久化,以便下次打开应用程序时,我之前创建的房间将可见。在我的 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];
}

请确保在调用上述方法的 View 上启用了 XMPPStream,否则这些方法将不起作用。这里的所有都是它的。玩得开心 XMPP!

关于ios - MUC 如何使用 XMPPFramework,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10371550/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com