iphone - ¿Almacenar mensajes usando XMPPFramework para iOS?
core-data storage (3)
Las respuestas que indican que XMPP Framework no guarda el historial son incorrectas.
Para integrar resultados en una vista de tabla, use:
XMPPMessageArchivingCoreDataStorage *storage = [XMPPMessageArchivingCoreDataStorage sharedInstance];
NSManagedObjectContext *moc = [storage mainThreadManagedObjectContext];
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"XMPPMessageArchiving_Contact_CoreDataObject"
inManagedObjectContext:moc];
NSFetchRequest *request = [[NSFetchRequest alloc]init];
[request setEntity:entityDescription];
_contactsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:moc sectionNameKeyPath:nil cacheName:@"MessagesContactListCache"];
NSError *error;
BOOL rval = [_contactsController performFetch:&error];
No estoy seguro de cómo usar los datos centrales de XMPPFramework para almacenar los mensajes entrantes. ¿Alguien tiene tutoriales sobre cómo hacer esto? Veo objetos de usuario, que a su vez pueden tener muchos "recursos". ¿Se supone que cada mensaje recibido es un nuevo recurso que creo y persisto?
No sé qué parte es mi responsabilidad y qué parte proporciona el marco con respecto al historial de mensajes. Puedo interceptar todos los mensajes entrantes. Entonces, ¿se supone que debo crear y almacenar cada mensaje dentro de una tabla de Mensajes usando datos centrales? Tendría una entidad de mensaje. Y cada XMPPUser tendría una matriz de objetos de mensaje. Pero entonces, ¿no estaría lanzando mi propia solución, lo que estaría funcionando en contra del marco?
¡Gracias!
Sé que este es un hilo viejo, pero como actualmente estoy trabajando con XMPP en iOS, debo decir que existe un soporte integrado para archivar mensajes en XMPP.
Descargué el marco XMPP para iOS y en él hay una carpeta marcada XEP-0136. Importe las carpetas en XCode y active el archivado del lado del cliente utilizando las siguientes líneas de código en la clase en la que instancia el cliente XMPP:
xmppMessageArchivingStorage = [XMPPMessageArchivingCoreDataStorage sharedInstance];
xmppMessageArchivingModule = [[XMPPMessageArchiving alloc] initWithMessageArchivingStorage:xmppMessageArchivingStorage];
La siguiente línea de código le ahorra el envío de stanzas específicas de archivo al servidor xmpp, que probablemente responderá con servicio no implementado.
[xmppMessageArchivingModule setClientSideMessageArchivingOnly:YES];
[xmppMessageArchivingModule activate:xmppStream];
[xmppMessageArchivingModule addDelegate:self delegateQueue:dispatch_get_main_queue()];
Y estás listo. A partir de ese momento, los mensajes (salientes y entrantes) se almacenarán en una tabla creada por el marco.
Si necesita más información, coméntelo y le responderemos.
@PraviJay
Me gustó esto:
-(void)testMessageArchiving{
XMPPMessageArchivingCoreDataStorage *storage = [XMPPMessageArchivingCoreDataStorage sharedInstance];
NSManagedObjectContext *moc = [storage mainThreadManagedObjectContext];
NSEntityDescription *entityDescription = [NSEntityDescription entityForName:@"XMPPMessageArchiving_Message_CoreDataObject"
inManagedObjectContext:moc];
NSFetchRequest *request = [[NSFetchRequest alloc]init];
[request setEntity:entityDescription];
NSError *error;
NSArray *messages = [moc executeFetchRequest:request error:&error];
[self print:[[NSMutableArray alloc]initWithArray:messages]];
}
-(void)print:(NSMutableArray*)messages{
@autoreleasepool {
for (XMPPMessageArchiving_Message_CoreDataObject *message in messages) {
NSLog(@"messageStr param is %@",message.messageStr);
NSXMLElement *element = [[NSXMLElement alloc] initWithXMLString:message.messageStr error:nil];
NSLog(@"to param is %@",[element attributeStringValueForName:@"to"]);
NSLog(@"NSCore object id param is %@",message.objectID);
NSLog(@"bareJid param is %@",message.bareJid);
NSLog(@"bareJidStr param is %@",message.bareJidStr);
NSLog(@"body param is %@",message.body);
NSLog(@"timestamp param is %@",message.timestamp);
NSLog(@"outgoing param is %d",[message.outgoing intValue]);
}
}
}
Espero eso ayude :)
XMPPFramework no almacena el historial de mensajes. Por lo tanto, le sugiero que sea mejor utilizar los datos principales. Cree una tabla tomando el remitente, el receptor, el mensaje y el tiempo como columnas. Inserte el registro cuando envíe el método de mensajes y reciba el método de mensaje llamando ...
-(void)saveChatHistory:(NSString *)sender:(NSString*)receiver:(NSString*)message:(NSString*)time
{
NSManagedObjectContext *context=[[self appDelegate] managedObjectContext];
NSManagedObject *newContext=[NSEntityDescription insertNewObjectForEntityForName:@"ChatHistory" inManagedObjectContext:context];
[newContext setValue:sender forKey:@"sender"];
[newContext setValue:receiver forKey:@"receiver"];
[newContext setValue:message forKey:@"message"];
[newContext setValue:time forKey:@"time"];
NSError *error;
if(![context save:&error])
{
UIAlertView *alertView=[[UIAlertView alloc] initWithTitle:@"Error Occured" message:@"Data is not Stored in Database Try Again" delegate:self cancelButtonTitle:@"ok" otherButtonTitles:nil];
[alertView show];
}
}
Recupere el historial de chat cuando el usuario específico ha sido seleccionado de la vista de tabla .... el siguiente método muestra cómo recuperar el historial de chat ... y llama a este método desde el método didSelectRowAtIndexPath y pasa la identificación de destino como parámetro
-(void)getChatHistory:(NSString*)jidString1
{
NSManagedObjectContext *context=[[self appDelegate] managedObjectContext];
NSEntityDescription *entity=[NSEntityDescription entityForName:@"ChatHistory" inManagedObjectContext:context];
NSFetchRequest *req=[[NSFetchRequest alloc] init];
NSPredicate *predicate=[NSPredicate predicateWithFormat:@"receiver=%@",jidString1];
[req setEntity:entity];
[req setPredicate:predicate];
NSManagedObject *matchRecords=nil;
NSError *error;
NSArray *objects=[context executeFetchRequest:req error:&error];
if([objects count]==0)
{
UIAlertView *alertView=[[UIAlertView alloc] initWithTitle:@"No Record found" message:@"there is no previous chat history" delegate:self cancelButtonTitle:@"ok" otherButtonTitles:nil];
[alertView show];
}
else
{
for(int i=0;i<[objects count];i++)
{
matchRecords=[objects objectAtIndex:i ];
NSLog(@"sender is %@",[matchRecords valueForKey:@"sender"]);
NSLog(@"reciver is %@",[matchRecords valueForKey:@"receiver"]);
NSLog(@"messages is %@",[matchRecords valueForKey:@"message"]);
NSLog(@"time is %@",[matchRecords valueForKey:@"time"]);
}
}
}
Espero que ésto sea útil para ti