XMPP系列(四)---发送和接收文字消息,获取历史消息功能
时间:2015-07-24 01:28:33
收藏:1
阅读:7851
今天开始做到最主要的功能发送和接收消息、获取本地历史数据。
先上到目前为止的效果图:
首先是要在XMPPFramework.h中引入数据存储模块:
//聊天记录模块的导入 #import "XMPPMessageArchiving.h" #import "XMPPMessageArchivingCoreDataStorage.h" #import "XMPPMessageArchiving_Contact_CoreDataObject.h" //最近联系人 #import "XMPPMessageArchiving_Message_CoreDataObject.h"
然后在XMPPStream中添加数据存储模块,因为XMPP框架默认用CoreData存储数据,而且做好了数据存储,因此我们只需要在合适的地方发送通知处理信息即可。
//4.消息模块,这里用单例,不能切换账号登录,否则会出现数据问题。
_xmppMessageArchivingCoreDataStorage = [XMPPMessageArchivingCoreDataStorage sharedInstance];
_xmppMessageArchiving = [[XMPPMessageArchiving alloc] initWithMessageArchivingStorage:_xmppMessageArchivingCoreDataStorage dispatchQueue:dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 9)];
[_xmppMessageArchiving activate:self.xmppStream];在数据存储完毕后,发送通知:
在XMPPMessageArchivingCoreDataStorage的
- (void)archiveMessage:(XMPPMessage *)message outgoing:(BOOL)isOutgoing xmppStream:(XMPPStream *)xmppStream结尾处添加如下通知:
dispatch_async(dispatch_get_main_queue(), ^{
[[NSNotificationCenter defaultCenter] postNotificationName:kXMPP_MESSAGE_CHANGE object:nil];
});现在去聊天界面获取历史消息吧:
/** 查询聊天记录 */
- (void)getChatHistory
{
XMPPMessageArchivingCoreDataStorage *storage = [JKXMPPTool sharedInstance].xmppMessageArchivingCoreDataStorage;
//查询的时候要给上下文
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:storage.messageEntityName inManagedObjectContext:storage.mainThreadManagedObjectContext];
[fetchRequest setEntity:entity];
// Specify criteria for filtering which objects to fetch
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"bareJidStr = %@", self.chatJID.bare];
[fetchRequest setPredicate:predicate];
// Specify how the fetched objects should be sorted
NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"timestamp"
ascending:YES];
[fetchRequest setSortDescriptors:[NSArray arrayWithObjects:sortDescriptor, nil]];
NSError *error = nil;
NSArray *fetchedObjects = [storage.mainThreadManagedObjectContext executeFetchRequest:fetchRequest error:&error];
if (fetchedObjects != nil) {
self.chatHistory = [[NSMutableArray alloc] initWithArray:fetchedObjects];
// [NSMutableArray arrayWithArray:fetchedObjects];
}
[self.messageTableView reloadData];
[self tableViewScrollToBottom];
}
消息接收也调用getChatHistory方法即可
而消息的发送是:
/** 发送的事件 */
- (void)sendMessage{
if (_chatTextField.text.length < 1) {
return;
}
XMPPMessage *message = [XMPPMessage messageWithType:@"chat" to:self.chatJID];
[message addBody:_chatTextField.text];
[[JKXMPPTool sharedInstance].xmppStream sendElement:message];
_chatTextField.text = @"";
[self tableViewScrollToBottom];
}demo地址:https://github.com/Joker-King/ChatDemo
版权声明:本文为博主原创文章,未经博主允许不得转载。
评论(2)
lkz
2016-09-23 16:02:39
XMPPMessage *message = [XMPPMessage messageWithType:@"chat" to:self.chatJID];
[message addBody:_chatTextField.text];
终于找到了比较好的匹配我在做的项目的发送消息方法了~ 在做的项目是openfire+smark的后台,其实项目本身不是即时通讯的,硬弄了个即时通讯的框架而不用http和https。搞了好几天 烦死了??
特意注册一下来感谢~
[message addBody:_chatTextField.text];
终于找到了比较好的匹配我在做的项目的发送消息方法了~ 在做的项目是openfire+smark的后台,其实项目本身不是即时通讯的,硬弄了个即时通讯的框架而不用http和https。搞了好几天 烦死了??
特意注册一下来感谢~
hh
2017-07-07 14:55:39
你好这个demo登陆不了可以加我qq吗 376960109 谢谢了
共2条