2015-05-21 3 views
4

Я создал приложение Xmpp Chat, в котором я реализовал индивидуальный и групповой чат. Сам чат отлично работает. Проблема в групповом чате. Я создал группу с 2-3 членами, снова чат работает нормально, но когда я убиваю приложение и перезапускаю его, я не получаю групповые сообщения из какой-либо из групп, которые я создал. , когда я подключен к серверу XMPP и повторно присоединяюсь к любой группе, я получаю сообщения. Моя проблема в том, что я должен снова присоединяться к группам каждый раз после того, как я полностью убью приложение.Группа XMPp MultiUserChat (MUC) Не остается стабильной

Пожалуйста, дайте мне знать Как я могу получить сообщения или присоединиться автоматически в группе, когда я открываю приложение из убитого состояния.

+0

пожалуйста, вы можете помочь мне. почти такая же проблема, с которой я столкнулся. но во время создания создается сама группа. и если никто не находится в сети, группа автоматически удаляется. Как я могу сделать комнату стойкой быстро. какую конфигурацию вы отправляете при создании группы –

+0

У вас есть решение для этого? У меня такая же проблема. Теперь я планирую получить имена всех групп и повторно присоединиться к группам, использующим цикл for. Это идеальное решение? @ Tarun – Harin

ответ

1

Вам необходимо отправить присутствие на сервер XMPP после того, как ваше приложение запустилось или вышло из фона. поэтому сервер XMPP понимает, что соответствующий group готов к обработке события.

Редактировать: вы можете отправить свое присутствие, используя следующий код.

- (void)goOnline { 


    NSXMLElement *presence = [NSXMLElement elementWithName:@"presence"]; 
    NSXMLElement *show = [NSXMLElement elementWithName:@"show" 
              stringValue:@"dnd"]; 
    NSXMLElement *status = [NSXMLElement elementWithName:@"status" stringValue:@"available"]; 
    NSXMLElement *priority = [NSXMLElement elementWithName:@"priority" stringValue:@"24"]; 

    [presence addChild:show]; 
    [presence addChild:status]; 
    [presence addChild:priority]; 

    [_xmppStream sendElement:presence]; 

    [self createOrJoinRoom]; 

} 
- (void)createOrJoinRoom { 
    if ([appDelegate.xmppStream isConnected]) { 

     NSString *myJID = [[NSUserDefaults standardUserDefaults] stringForKey:@"XMPPUserId"]; 

     NSXMLElement *presence = [NSXMLElement elementWithName:@"presence"]; 
     [presence addAttributeWithName:@"from" stringValue:[[appDelegate.xmppStream myJID]full]]; 
     [presence addAttributeWithName:@"to" stringValue:[NSString stringWithFormat:@"%@@%@/%@", @"newone", GroupChatRoomName,myJID]]; 
     NSXMLElement *xelement = [NSXMLElement elementWithName:@"x" xmlns:XMPPMUCNamespace]; 
     [presence addChild:xelement]; 
     [appDelegate.xmppStream sendElement:presence]; 
    } 

} 

Это может вам помочь.

+0

, какое присутствие мне нужно отправить? можете ли вы сообщить мне о наличии xml? –

+0

@TarunKhosla, проверил мой отредактированный ответ –

+0

Это значит, мне просто нужно отправить присутствие в XMPP с идентификатором группы, вместо того чтобы создавать комнату и снова присоединиться к этой комнате, правда? –

0

Добавление к ответу присутствия, я хотел бы также проверить более простые вещи -

  1. являются номера (групповой чат) вы создаете настойчивый? или вам нужно постоянно создавать комнату каждый раз, когда вы подключаетесь? (обратите внимание на разницу между «открытием» и «созданием»).
    На некоторых серверах номера временно по умолчанию - вы можете проверить это, соединившись с 2 отдельными клиентами, отправить некоторые сообщения, отключить только один из них и повторно подключиться - если вы видите сообщения, отправленные в повторно подключенном клиент - это может быть вашей проблемой, можете ли вы показать параметры, которые вы передаете на сервер при создании комнаты ?.

  2. Используется ли сервер, для которого вы отправляете сообщения истории, по умолчанию, и если да, то сколько вариантов реализации сервера может отличаться, вы можете поделиться какой-либо информацией на используемом вами сервере (openfire, ejabbered, prosody) ? или фрагмент из вашего конфигурационного файла?

  3. Возможно ли, что вы получаете сообщения, но не показываете их правильно, возможно, не обновляете экран \ вид при первом входе в комнату? любые сообщения журнала?

1

Вы должны присоединиться ко всем своим предыдущим группам соединения/присоединения. Потому что в iOS, если вы убьете свое приложение, вы покинули свои созданные или объединенные группы.

Таким образом, каждый раз в этом разделе кода

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 

Вы должны присоединиться к вашей группе снова.

Ниже демонстрационный код для него:

XMPPRoomHybridStorage *xmppRoomStorage1 = [XMPPRoomHybridStorage sharedInstance]; 
xmppRoom = [[XMPPRoom alloc] initWithRoomStorage:xmppRoomStorage1 jid:RoomName]; 
[xmppRoom addDelegate:self delegateQueue:dispatch_get_main_queue()]; 
[xmppRoom activate:appDelegate.Obj_xmppManager.xmppStream]; 
NSXMLElement *history = [NSXMLElement elementWithName:@"history"]; 
[history addAttributeWithName:@"maxstanzas" stringValue:@"1"]; 
[xmppRoom joinRoomUsingNickname:self.xmppStream.myJID.user history:nil]; 
0

Я также сталкиваюсь с этой проблемой, так как неделя и ищу решения и после того, как много поиска на Google и переполнении стека я получил ключ, который решить эту проблему ,

В моем случае группа создана успешно, и чат работает хорошо с членами, и участники могут отправлять мне чат, но когда любой член группы выходит из системы или убивает приложение, а затем снова заходит, он не может отправить сообщение, это группа и группа говорит в ответе Только пассажирам разрешено отправлять сообщения на конференцию.

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

NSString *roomJID = [NSString stringWithFormat:@"%@@conference.yourHostName", roomJid]; 
XMPPJID *jid = [XMPPJID jidWithString:roomJID]; 

_xmppRoom = [[XMPPRoom alloc] initWithRoomStorage:xmppRoomCoreDataStorage jid:jid dispatchQueue:dispatch_get_main_queue()]; 
[_xmppRoom activate:stream]; 
[_xmppRoom addDelegate:self delegateQueue:dispatch_get_main_queue()]; 
[_xmppRoom joinRoomUsingNickname:stream.myJID.bare history:nil]; 

Надеется, что это будет работать для вас слишком

0

По умолчанию, MUCRoom будет пересылаться историей вновь присоединились к пользователю, номер определяется конфигурацией под mod_muc: history_size:. Или вам нужно явно запросить некоторое количество истории при отправке Присутствия, doc:

<presence 
    from='[email protected]/pda' 
    id='n13mt3l' 
    to='[email protected]/thirdwitch'> 
    <x xmlns='http://jabber.org/protocol/muc'> 
    <history maxstanzas='20'/> 
    </x> 
</presence> 
Смежные вопросы