XMPP系列(四)---发送和接收文字消息,获取历史消息功能

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

先上到目前为止的效果图:

 
     
    

首先是要在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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-25 18:19:58

XMPP系列(四)---发送和接收文字消息,获取历史消息功能的相关文章

C#微信公众号开发系列教程五(接收事件推送与消息排重)

微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C#微信公众号开发系列教程四(接收普通消息) C#微信公众号开发系列教程五(接收事件推送与消息排重) 在上一篇的博文中讲到,微信的消息可以大体分为两种类型,一种是包括:文本,语音,图片等的普通消息,另一种就是本篇要将的事件类型.包括:关注/取消关注事件,扫描带参数二维码事件,上报地理位置事件,自定义菜

MPTCP 源码分析(四) 发送和接收数据

简述: MPTCP在发送数据方面和TCP的区别是可以从多条路径中选择一条 路径来发送数据.MPTCP在接收数据方面与TCP的区别是子路径对无序包 进行重排后,MPTCP的mpcb需要多所有子路径的包进行排序.查看图1可知. +-------------------------------+ | Application | +---------------+ +-------------------------------+ | Application | | MPTCP | +---------

如何在微信的自定义菜单上实现“历史消息”功能?

最近在开发微信的接口发现可以通过菜单实现微信的历史消息(历史消息是指订阅号或者服务号每次群发的消息),拿出来与大家分享,操作方法如下: 1.首先进入到您维护的微信订阅号或者服务号,点击帐号详情(右上的小人像). 2.进入帐号详情,找到“查看消息”并点击进入. 3.进入到历史消息页面后,点击右上角的“更多按钮”(三个竖排的点),找到复制链接,复制这个链接,这个链接就是我们要找的历史消息链接. 4.在微信中增加一个”历史消息“菜单,设置为视图类型,将菜单试图地址设置为刚才复制的链接,然后保存生效.

Chromium的IPC消息发送、接收和分发机制分析

由于Chromium采用多进程架构,因此会涉及到进程间通信问题.通过前面一文的学习,我们知道Browser进程在启动Render进程的过程中会建立一个以UNIX Socket为基础的IPC通道.有了IPC通道之后,接下来Browser进程与Render进程就以消息的形式进行通信.我们将这种消息称为IPC消息,以区别于线程消息循环中的消息.本文就分析Chromium的IPC消息发送.接收和分发机制. 老罗的新浪微博:http://weibo.com/shengyangluo,欢迎关注! Chrom

《C#微信开发系列(4)-接收 / 返回文本消息》

4.0接收 / 返回文本消息 ①接收/返回文本消息原理说明 当普通微信用户向公众账号发消息时,微信服务器将POST消息的XML数据包到开发者填写的URL上,着手开发之前先行阅读微信公众平台接收普通消息微信开发文档,对微信的这种消息处理机制有一定了解之后再着手开发(微信开发接收普通消息开发文档) 注意点: 1.关于重试的消息排重,推荐使用msgid排重. 2.微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次.假如服务器无法保证在五秒内处理并回复,可以直接回复空串,微信服务器不

Android深入四大组件(四)广播的注册、发送和接收过程

相关文章 Android深入理解四大组件系列 前言 我们接着来学习Android四大组件中的BroadcastReceiver,广播主要就是分为注册.接收和发送过程.建议阅读此文前请先阅读Android深入理解四大组件系列的文章,知识重复的部分,本文不再赘述. 1.广播的注册过程 BroadcastReceiver的注册分为两种,分别是静态注册和动态注册,静态注册在应用安装时由PackageManagerService来完成注册过程,关于这一过程,我会在后续的介绍PackageManagerSe

蓝牙通信第2篇:建立通信和发送文字消息,文件消息

一:简介 当两台android设备正常连接后,搜索与连接文章在这里(蓝牙搜索与连接),各自需要开启一个服务端和客户端接收消息(类似于socket),两台设备需要邦定同一个通信标识,通常是一个uuid.如:00001101-0000-1000-8000-00805F9B34FB 二:创建蓝牙服务端 1)在已配对的蓝牙列表,选择需要通信的蓝牙设备 bondDevicesListView.setOnItemClickListener(new AdapterView.OnItemClickListene

Unity3D 研究院之IOS高级界面发送消息与Unity3D消息的接收

今天和盆友们讨论IOS的高级界面与unity3d游戏引擎的交互,这个在开发中是非常重要的,unity3d 毕竟是一个面向多平台的一个游戏引擎,它不可能全部为IOS 考虑的面面俱到,引擎中也不存在针对IOS的高级界面的控件的使用. 本例实现游戏背景是Unity3D 的游戏世界,前面添加4个IOS的高级界面的按钮,并且点击这些按钮可以将消息传递给背景的Unity3D ,让它做一些事情. 上一章介绍了触摸IOS屏幕 移动摄像机的位置,下面有盆友问我说他不想移动摄像机的位置,就想移动物体的位置,我在这里

DICOM医学图像处理:DIMSE消息发送与接收“大同小异”之DCMTK fo-dicom mDCM

背景: 从DICOM网络传输一文开始,相继介绍了C-ECHO.C-FIND.C-STORE.C-MOVE等DIMSE-C服务的简单实现,博文中的代码给出的实例都是基于fo-dicom库来实现的,原因只有一个:基于C#的fo-dicom库具有高封装性.对于初学者来说实现大多数的DIMSE-C.DIMSE-N服务几乎都是"傻瓜式"操作--构造C-XXX-RQ.N-XXX-RQ然后绑定相应的OnResponseReceived处理函数即可.本博文希望在前几篇预热的基础上,对比DCMTK.fo