博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
XMPP系列(四)---发送和接收文字消息,获取历史消息功能
阅读量:6633 次
发布时间:2019-06-25

本文共 2897 字,大约阅读时间需要 9 分钟。

今天開始做到最基本的功能发送和接收消息、获取本地历史数据。

先上到眼下为止的效果图:

            

首先是要在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://www.cnblogs.com/yutingliuyl/p/7045304.html

你可能感兴趣的文章
LVS+Keepalived实现负载均衡
查看>>
linux命令:rpm软件包管理
查看>>
敏捷开发实践总结(四):职责分工
查看>>
CentOS Linux 监控安装之cacti
查看>>
编写一个日志轮询归档脚本
查看>>
supervisor学习笔记
查看>>
Apache的三种工作模式
查看>>
linux rsync远程同步(续)
查看>>
计算删除日期(二)
查看>>
迁移家目录
查看>>
win2008高级防火墙
查看>>
42. Python Queue 模块
查看>>
DOM(二)——XML DOM
查看>>
Locale Resource读取次序问题
查看>>
多功能PCIE交换机之八:窗口扩展和驱动加载的常见问题
查看>>
Android应用开发相关下载资源(2014/12/14更新)
查看>>
http协议
查看>>
数据库备份 恢复
查看>>
DXC IPS 440T 的Console连接配置与账户重置
查看>>
Chocolat.js – 响应式的 jQuery Lightbox 插件
查看>>