Принятие приглашения в чат

Я могу создать MUC с помощью XMPPFramework и отправить пользователям запросы на приглашение присоединиться к этой комнате, используя приведенный ниже код.

// 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

В этом сообщении я проверяю, содержит ли он NSXMLElement с именем «пригласить», и если он содержит, то я отправляю пользователю обратный вызов. Затем я создаю чат с тем же именем, что и чат, из которого пользователь получил приглашение, и вхожу в эту вновь созданную комнату. Работает нормально, но тихо долго и не тихо эффективно. Я хочу знать, есть ли класс в XMPPFramework, доступный здесь, который мог бы отдельно обрабатывать приглашение в чат. Например, обнаружение, принятие и отклонение приглашений в комнату.

Мой код для извлечения имени комнаты:

- (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];
}

person Vishal Singh    schedule 02.02.2013    source источник
comment
Привет, Вишал, я застрял в аналогичной проблеме, не могли бы вы сообщить мне, нашли ли вы какое-либо решение или подход к этому? Спасибо   -  person Mangesh    schedule 03.10.2014


Ответы (2)


Для приглашений и отклонений комнаты реализуйте XMPPMUCDelegate< /a> и его методы -xmppMUC:didReceiveRoomInvitation: и -xmppMUC:didReceiveRoomInvitationDecline:.

Чтобы получить JID комнаты, вызовите [message from];

Чтобы присоединиться к комнате, создайте экземпляр XMPPRoom и вызовите -joinRoomUsingNickname:history:.

Затем реализуйте класс делегата вашей комнаты XMPPRoomDelegate и реализуйте некоторые из методы делегирования для обработки получения сообщений в комнате.

Похоже, в настоящее время не существует более автоматического способа отвечать на приглашения.

Обновление. Обратные вызовы делегата теперь получают JID комнаты в качестве параметра, что немного проясняет семантику.

- (void)xmppMUC:(XMPPMUC *)sender roomJID:(XMPPJID *) roomJID didReceiveInvitation:(XMPPMessage *)message;
- (void)xmppMUC:(XMPPMUC *)sender roomJID:(XMPPJID *) roomJID didReceiveInvitationDecline:(XMPPMessage *)message;
person paulmelnikow    schedule 02.02.2013
comment
Но я могу реализовать xmpproomDelegate только после создания xmpproom. Методы делегата xmpproom не обеспечивают никакого обратного вызова для приглашения в комнату, я думаю, они предназначены только для обработки входящих и исходящих сообщений и некоторых других вещей конкретной комнаты. - person Vishal Singh; 02.02.2013
comment
Для этого вам нужно XMPPMUCDelegate. - person paulmelnikow; 02.02.2013
comment
да, но как мне принять приглашение?? как мне войти в эту комнату и обрабатывать все входящие сообщения этой комнаты? Должен ли я создать комнату с тем же именем, а затем реализовать ее методы делегирования, как я упоминаю в своем вопросе ?? - person Vishal Singh; 03.02.2013
comment
да. Кажется, я наконец понял ваш вопрос. Если вы опубликуете свой код для извлечения имени комнаты, я попытаюсь составить запрос на вытягивание более автоматическим способом. - person paulmelnikow; 03.02.2013
comment
я отредактировал свой вопрос. пожалуйста, проверьте .. в методе createAndEnterRoom:Message я создаю комнату с названием комнаты, из которой я получил приглашение, потому что я не смог найти никакого метода, который позволяет мне войти в комнату, из которой я получил приглашение напрямую, а также обрабатывать метод делегата этой комнаты, например xmppRoom:didJoin и т. д. - person Vishal Singh; 03.02.2013
comment
хорошо, спасибо за конформацию. Мне было интересно, выбираю ли я длинный маршрут, чтобы преодолеть небольшое расстояние, но если это единственный маршрут, то я счастлив. :) - person Vishal Singh; 03.02.2013

просто добавьте ниже код

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
person Awais Mobeen    schedule 10.04.2014