2013-02-02 60 views
9

我可以使用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:@"[email protected]"] withMessage:@"Come Join me"]; 

用戶「abc」如何知道他已收到邀請,他如何通過接受或拒絕對此做出反應?

我在XMPPFramework中找不到任何直接處理聊天室邀請的課程。 我的研究說,每當用戶收到的聊天室邀請,xmmppStream的委託方法被調用:

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

在這種消息,我檢查是否含有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]; 
} 
+0

維沙爾嗨裏面,我陷在類似的問題,能否請您讓我知道你有沒有發現任何解決方案或方法有了這個 ?謝謝 – Mangesh

回答

12

對於聊天室邀請和拒絕,實行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; 
+0

但是我只能在創建xmpproom後實現xmpproomDelegate。 xmpproom委託方法不提供任何迴應房間邀請,我想他們只是爲了處理傳入和傳出的消息以及某個房間的其他東西。 –

+0

對於你想'XMPPMUCDelegate'。 – paulmelnikow

+0

是的,但我如何接受邀請?我如何進入該房間並處理​​該房間的所有傳入消息?我是否必須創建一個具有相同名稱的房間,然後執行其委託方法,正如我在我的問題中提到的那樣? –

-1

只需添加以下代碼

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