El grupo Xmpp MultiUserChat (MUC) no permanece estable

Creé una aplicación Xmpp Chat donde implementé el chat de grupo y uno a uno. El chat en sí está funcionando bien. El problema está en el chat grupal. Creé un grupo con 2-3 miembros, nuevamente el chat está funcionando bien, pero cuando elimino la aplicación y la reinicio, no estoy recibiendo los posts de grupo de ninguno de los grupos que he creado. mientras estoy conectado al server XMPP y vuelvo a unirme a cualquier grupo, recibo los posts. Mi problema es que debo unirme nuevamente a los grupos cada vez que elimino la aplicación por completo.

Por favor, hágamelo saber Cómo puedo get los posts o unirme automáticamente en grupo cuando abro la aplicación desde estado muerto.

Debe enviar presencia al server XMPP una vez que su aplicación se inicie o salga de segundo plano. por lo que el server XMPP entiende que el group respectivo está listo para manejar el evento.

Editar : puede enviar presencia usando el siguiente código.

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

Que esto te ayude.

Tienes que unirte a todos tus grupos de unión / connection anteriores. Porque en iOS si matas a tu aplicación, saliste de tus grupos creados o unidos.

Entonces, cada vez que en esta sección del código

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

Tienes que volver a unirte a tu grupo.

A continuación se muestra el código de demostración para ello:

 XMPPRoomHybridStorage *xmppRoomStorage1 = [XMPPRoomHybridStorage shanetworkingInstance]; 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]; 

Agregando a la respuesta de Presencia, también verificaré cosas más básicas:

  1. ¿Las habitaciones (chat grupal) que crea persisten? ¿O tiene que volver a crear la habitación cada vez que se conecta? (observe la diferencia entre 'abrir' y 'crear').
    En algunos serveres, las habitaciones son temporales de forma pnetworkingeterminada; puede verificar esto conectándose con 2 clientes separados, enviar algunos posts, desconectar solo uno de ellos y volver a conectar, si ve los posts que se enviaron en su cliente reconectado, esto podría sea ​​tu problema, ¿puedes mostrar los parameters que pasas al server cuando creas la habitación ?.

  2. ¿El server que está configurado está configurado para enviar posts de historial de forma pnetworkingeterminada y, en caso afirmativo, cuántos, de nuevo, pueden variar las implementaciones del server, podría compartir información sobre el server que está utilizando (openfire, ejabbenetworking, prosody)? o un fragment de su file de configuration?

  3. ¿Es posible que reciba los posts, pero no los muestre correctamente, tal vez no actualice la pantalla \ vista al ingresar por primera vez a una habitación? cualquier post de logging?

También me enfrento a este problema desde hace una semana y busco una solución y después de muchas búsquedas en Google y el desbordamiento de stack obtuve una pista que resuelve este problema.

En mi caso, el grupo se creó con éxito y el chat funciona bien con los miembros y los miembros también pueden enviarme el chat, pero cuando algún miembro del grupo desconecta o cancela la aplicación y luego vuelve a iniciar session, no puede enviar posts. Este grupo y grupo solo responden Los ocupantes pueden enviar posts a la conferencia .

En mi caso, cuando el usuario toca el grupo para entrar en el grupo y comenzar a chatear, llamo a este método para unirme al grupo.

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

Espero que esto también funcione para ti.

Por defecto, un MUCRoom enviará un historial al usuario recién ingresado, el número está determinado por la configuration, en mod_muc: history_size: O necesita solicitar explícitamente cierta cantidad de historial mientras envía la Presencia, doc :

 <presence from='hag66@shakespeare.lit/pda' id='n13mt3l' to='coven@chat.shakespeare.lit/thirdwitch'> <x xmlns='http://jabber.org/protocol/muc'> <history maxstanzas='20'/> </x> </presence>