【问题标题】:Accepting chatroom invitation接受聊天室邀请
【发布时间】:2013-01-17 21:47:23
【问题描述】:

我可以使用 XMPPFramework 创建一个 MUC,并使用以下代码向用户发送加入该房间的邀请请求。

// Creating
AppDelegate *dele =(AppDelegate *) [[UIApplication sharedApplication]delegate];

xmppRoom = [[XMPPRoom alloc] initWithRoomStorage:dele jid:[XMPPJID jidWithString:self.roomName] dispatchQueue:dispatch_get_main_queue()];
[xmppRoom addDelegate:dele delegateQueue:dispatch_get_main_queue()];
[xmppRoom activate:dele.xmppStream];
[xmppRoom joinRoomUsingNickname:self.myNick history:nil];

// Inviting
[xmppRoom inviteUser:[XMPPJID jidWithString:@"abc@host"] withMessage:@"Come Join me"];

用户“abc”如何知道他收到了邀请,以及他如何通过接受或拒绝对邀请做出反应?

我在 XMPPFramework 中找不到任何直接处理聊天室邀请的类。 我的研究表明,每当用户收到聊天室邀请时,都会调用 xmmppStream 的委托方法:

- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message

在该消息中,我检查它是否包含名称为“invite”的 NSXMLElement,如果包含则我向用户发送回调。然后我创建与用户收到邀请的聊天室名称同名的聊天室,然后进入新创建的房间。它工作正常,但安静冗长,效率不高。 我想知道 XMPPFramework 中是否有一个可用的类here 可以单独处理聊天室邀请。例如,检测、接受和拒绝房间邀请。

我提取房间名称的代码:

- (void)xmppStream:(XMPPStream *)sender didReceiveMessage:(XMPPMessage *)message
{
    NSXMLElement * x = [message elementForName:@"x" xmlns:XMPPMUCUserNamespace];
    NSXMLElement * invite  = [x elementForName:@"invite"];
    NSXMLElement * decline = [x elementForName:@"decline"];
    NSXMLElement * directInvite = [message elementForName:@"x" xmlns:@"jabber:x:conference"];
    NSString *msg = [[message elementForName:@"body"]stringValue];
    NSString *from = [[[message attributeForName:@"from"]stringValue];
    if (invite || directInvite)
    {
        [self createAndEnterRoom:from Message:msg];
        return;
    }
    [self.delegate newMessageRecieved:msg];
}

【问题讨论】:

  • 嗨 Vishal,我遇到了类似的问题,请告诉我您是否找到任何解决方案或方法?谢谢

标签: ios objective-c xmpp xmppframework multiuserchat


【解决方案1】:

对于房间邀请和拒绝,实现XMPPMUCDelegate及其方法-xmppMUC:didReceiveRoomInvitation:-xmppMUC:didReceiveRoomInvitationDecline:

要获取房间 JID,请调用 [message from]

要加入房间,请实例化 XMPPRoom 并调用 -joinRoomUsingNickname:history:

然后让您的房间委托类实现XMPPRoomDelegate,并实现一些delegate methods 来处理房间中的接收消息。

目前似乎没有更自动的方式来响应邀请。

更新:委托回调现在接收房间 JID 作为参数,稍微澄清了语义。

- (void)xmppMUC:(XMPPMUC *)sender roomJID:(XMPPJID *) roomJID didReceiveInvitation:(XMPPMessage *)message;
- (void)xmppMUC:(XMPPMUC *)sender roomJID:(XMPPJID *) roomJID didReceiveInvitationDecline:(XMPPMessage *)message;

【讨论】:

  • 但是我只能在创建xmpproom后才能实现xmpproomDelegate。 xmpproom 委托方法不为房间邀请提供任何回调,我猜它们只是用于处理传入和传出消息以及特定房间的一些其他内容。
  • 你想要的XMPPMUCDelegate
  • 是的,但我如何接受邀请?如何进入该房间并处理​​该房间的所有传入消息?我是否必须创建一个同名的房间,然后按照我在问题中提到的那样实现其委托方法??
  • 是的。我想我终于明白你的问题了。如果您发布用于提取房间名称的代码,我将尝试以更自动的方式组合一个拉取请求。
  • 我编辑了我的问题。请检查..在 createAndEnterRoom:Message 方法中,我用我收到邀请的房间的名称创建房间,因为我找不到任何方法可以让我进入我直接收到邀请的房间,并处理该房间的委托方法,如 xmppRoom:didJoin 等。
【解决方案2】:

只需添加以下代码

if  ([presenceType isEqualToString:@"subscribe"]) {

     [_chatDelegate newBuddyOnline:[NSString stringWithFormat:@"%@@%@", presenceFromUser, @"localhost"]];
     NSLog(@"presence user wants to subscribe %@",presenceFromUser);

     [xmppRoster acceptPresenceSubscriptionRequestFrom:[presence from] andAddToRoster:YES];

 //For reject button
//     [xmppRoster rejectPresenceSubscriptionRequestFrom:[tmpPresence from]];          
}

方法内部

 - (void)xmppStream:(XMPPStream *)sender didReceivePresence:(XMPPPresence *)presence ;
method

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-16
    • 2018-03-22
    • 1970-01-01
    • 2018-11-15
    • 2019-07-03
    相关资源
    最近更新 更多