Хранение сообщений с использованием XMPPFramework для ios?
Я не уверен, как использовать основные данные XMPPFramework для хранения входящих сообщений. Есть ли у кого-нибудь учебники о том, как это сделать? Я вижу объекты User, которые, в свою очередь, могут иметь много "ресурсов". Является ли каждое полученное сообщение предполагаемым новым ресурсом, который я создаю и сохраняю?
Я не знаю, какая часть является моей ответственностью и какую часть рамки предоставляет в отношении истории сообщений. Я могу перехватить каждое входящее сообщение. Тогда я должен создавать и хранить каждое сообщение в таблице сообщений с использованием данных ядра?
У меня будет объект сообщения. И каждый XMPPUser будет иметь массив объектов Message. Но тогда я не буду откатывать свое решение, которое будет работать против рамки?
Спасибо!
Ответы
Ответ 1
Я знаю, что это старый поток, но поскольку я сейчас работаю с XMPP на iOS, я должен сказать, что есть встроенная поддержка архивирования сообщений в XMPP.
Я загрузил фреймворк XMPP для iOS, и в нем есть папка с надписью XEP-0136. Импортируйте папки в XCode и активируйте архивирование на стороне клиента, используя следующие строки кода в классе, который вы создаете клиент XMPP:
xmppMessageArchivingStorage = [XMPPMessageArchivingCoreDataStorage sharedInstance];
xmppMessageArchivingModule = [[XMPPMessageArchiving alloc] initWithMessageArchivingStorage:xmppMessageArchivingStorage];
следующая строка кода избавляет вас от отправки архивных конкретных строф на сервер xmpp
которые, скорее всего, будут отвечать не реализованным сервисом
[xmppMessageArchivingModule setClientSideMessageArchivingOnly:YES];
[xmppMessageArchivingModule activate:xmppStream];
[xmppMessageArchivingModule addDelegate:self delegateQueue:dispatch_get_main_queue()];
И вы настроены. С этого момента сообщения (исходящие и входящие) будут сохранены в таблице, созданной инфраструктурой.
Если вам нужна дополнительная информация, прокомментируйте, и я вернусь к вам.
@PraviJay
Мне понравилось:
-(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]);
}
}
}
Надеюсь, это поможет:)
Ответ 2
Ответы, которые указывают на XMPP Framework, не сохраняют историю, являются неправильными.
Чтобы интегрировать результаты в виде таблицы, используйте:
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];
Ответ 3
XMPPFramework не хранит историю сообщений, поэтому я предлагаю вам лучше использовать основные данные. Создайте таблицу, отправив отправителю, получателю, сообщению, времени в виде столбцов. Ввести запись, когда метод отправки сообщения вызывает вызов и метод приема сообщений...
-(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];
}
}
Извлечь историю чатов, когда конкретный пользователь выбирает из tableview.... метод fallowing показывает, как извлечь историю чатов... и вызвать этот метод из метода didSelectRowAtIndexPath и передать идентификатор назначения в качестве параметра
-(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"]);
}
}
}
Надеюсь, это вам полезно.