xmpp整理笔记:聊天信息的发送与显示

任何一个信息的发送都需要关注两个部分,信息的发出,和信息在界面中的显示

往期回顾:

xmpp整理笔记:环境的快速配置(附安装包)  http://www.cnblogs.com/dsxniubility/p/4304570.html

xmpp整理笔记:xmppFramework框架的导入和介绍  http://www.cnblogs.com/dsxniubility/p/4307057.html

xmpp整理笔记:用户网络连接及好友管理http://www.cnblogs.com/dsxniubility/p/4307066.html

需要注意一点:

聊天界面输入框并不是textField而是textView,因为textView可以控制多行信息间的上下滚动编辑,如果微信下面的聊天框用的是普通的textField你可以想象会出现什么情况。

用模拟器程序和小鸭子聊天效果图如下:

如果你不是在董铂然博客园看到本文 请点击查看原文

一。信息的发送

首先要有一个结果调度器

这是通过coredata从SQLlite取数据的必要操作。所有代码写在这个懒加载中


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26


- (NSFetchedResultsController *)fetchedResultsController {

    // 推荐写法,减少嵌套的层次

    if (_fetchedResultsController != nil) {

        return _fetchedResultsController;

    }

    

    // 先确定需要用到哪个实体

    NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"XMPPMessageArchiving_Message_CoreDataObject"];

    

    // 排序

    NSSortDescriptor *sort = [NSSortDescriptor sortDescriptorWithKey:@"timestamp" ascending:YES];

    request.sortDescriptors = @[sort];

    

    // 每一个聊天界面,只关心聊天对象的消息

    request.predicate = [NSPredicate predicateWithFormat:@"bareJidStr = %@"self.chatJID.bare];

    

    // 从自己写的工具类里的属性中得到上下文

    NSManagedObjectContext *ctx = [SXXMPPTools sharedXMPPTools].xmppMessageArchivingCoreDataStorage.mainThreadManagedObjectContext;

    

    // 实例化,里面要填上上面的各种参数

    _fetchedResultsController = [[NSFetchedResultsController alloc]

      initWithFetchRequest:request managedObjectContext:ctx sectionNameKeyPath:nil cacheName:nil];

    _fetchedResultsController.delegate = self;

    

    return _fetchedResultsController;

}

写完了结果调度器之后要切记在viewdidload页面首次加载中加上一句,否则不干活


1

2


// 查询数据

    [self.fetchedResultsController performFetch:NULL];

发送出消息

因为textView里面没有类似textField的shouldReturn的方法 直接发送信息

所以只能对textView的《代理方法之文本改变方法》 稍加处理达到文本发送的目的


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15


#pragma mark - ******************** textView代理方法

- (BOOL)textView:(UITextView *)textView shouldChangeTextInRange:(NSRange)range replacementText:(NSString *)text

{

    // 判断按下的是不是回车键。

    if ([text isEqualToString:@"\n"]) {

        

        // 自定义的信息发送方法,传入字符串直接发出去。

        [self sendMessage:textView.text];

        

        self.textView.text = nil;

        

        return NO;

    }

    return YES;

}

在输入时如果按下回车键那触发代理方法传入的这个字符就是"\n" 就会调用自己写的 这个sendMessage方法,传入一个字符串直接发出去。

这个方法内部把传入的文本先addBody 再用自己手写的单例类的xmpp流 发出去。


1

2

3

4

5

6

7

8

9

10


#pragma mark - ******************** 发送消息方法

/** 发送信息 */

- (void)sendMessage:(NSString *)message

{

    XMPPMessage *msg = [XMPPMessage messageWithType:@"chat" to:self.chatJID];

    

    [msg addBody:message];

    

    [[SXXMPPTools sharedXMPPTools].xmppStream sendElement:msg];

}

二。信息在tableView中的显示

是在tableView的数据源方法中,先从数据库中取出当前的信息,再判断是发出去的还是接收的。取到不同的可重用标识符,然后赋值


1

2

3

4

5

6


    // 取出当前行的消息

    XMPPMessageArchiving_Message_CoreDataObject *message = [self.fetchedResultsController objectAtIndexPath:indexPath];

// 判断是发出消息还是接收消息

    NSString *ID = ([message.outgoing intValue] == 1) ? @"SendCell" : @"ReciveCell" ;

    SXChatCell *cell = [tableview dequeueReusableCellWithIdentifier:ID];

    cell.messageLabel.text = message.body;

其中sx开的的类名都是我自定义的类,里面都是常规写法。

关于上面提到的工具类SXXmppTools里 这个模块需要用到得属性和方法有


1

2

3

4

5

6

7

8

9


/** xmpp流 */

@property(nonatomic,strong,readonly) XMPPStream * xmppStream;

/** 消息归档 */

@property (nonatomic, strong, readonly) XMPPMessageArchiving *xmppMessageArchiving;

/** 消息归档存储 */

@property (nonatomic, strong, readonly) XMPPMessageArchivingCoreDataStorage *xmppMessageArchivingCoreDataStorage;

+ (instancetype)sharedXMPPTools;

这里有一点需要注意,

因为默认情况下你一进入一位好友的聊天页面,你和所有好友的聊天记录都会显示。因为都是存在同一个数据表里的啊,因此需要做一层过滤,就是懒加载中的这行代码


1

2


// 每一个聊天界面,只关心聊天对象的消息

    request.predicate = [NSPredicate predicateWithFormat:@"bareJidStr = %@"self.chatJID.bare];

如果你不是在董铂然博客园看到本文 请点击查看原文

正在整理音频文件和图片文件的发送方法,有兴趣的可以关注我。

时间: 2024-10-10 17:52:52

xmpp整理笔记:聊天信息的发送与显示的相关文章

xmpp整理笔记:发送图片信息和声音信息

图片和音频文件发送的基本思路就是: 先将图片转化成二进制文件,然后将二进制文件进行base64编码,编码后成字符串.在即将发送的message内添加一个子节点,节点的stringValue(节点的值)设置这个编码后的字符串.然后消息发出后取出消息文件的时候,通过messageType 先判断是不是图片信息,如果是图片信息先通过自己之前设置的节点名称,把这个子节点的stringValue取出来,应该是一个base64之后的字符串, 往期回顾: xmpp整理笔记:聊天信息的发送与显示  http:/

xmpp整理笔记:用户网络连接及好友的管理

xmpp中的用户连接模块包括用户的上线与下线信息展现,用户登录,用户的注册: 好友模块包括好友的添加,好友的删除,好友列表的展示. 在xmpp中 负责数据传输的类是xmppStream,开发的过程中,针对不同的传输内容,会调用不同的代理方法,在使用XMPPFramework开发时,只需要在不同的代理方法中,填写相同的代码即可. 往期回顾: xmpp整理笔记:xmppFramework框架的导入和介绍  http://www.cnblogs.com/dsxniubility/p/4307057.h

xmpp整理笔记:xmppFramework框架的导入和介绍

一个将要开发xmpp的项目,建议在项目刚创建就导入框架,这样可以避免一些自己操作失误造成不必要的损失. xmpp中最常用的框架就是 xmppFrameWork 往期回顾: xmpp整理笔记:环境的快速配置(附安装包)  http://www.cnblogs.com/dsxniubility/p/4304570.html 如果你不是在董铂然博客园看到本文请 点击查看原文 第一种方法直接拖 1> 拖入文件夹 在网盘链接的xmppFramework文件夹 :http://pan.baidu.com/s

xmpp整理笔记:环境的快速配置(附安装包)

现在虽然环信的xmpp框架很火,但是也有一些弊端.环信的框架部分代码不开源,而且收费模式不科学,用户量一直低于免费线则好,一旦超过,收费极高. xmpp感觉还是从xmppFramework框架学起比较科学.能够更清楚的了解即时通讯里各个操作的api,就算以后出了新的框架底层也要这么用的.主要用到的工具软件有Openfire,mysql,javajdk,phpMyAdmin,Adium等 将本文拉到最下面能看到配置完成之后的聊天效果. 附:需要用到的软件地址是 http://pan.baidu.c

sk_buff整理笔记(二、操作函数)

承接上一篇:sk_buff整理笔记(一.数据结构)这一篇要讲的是内核为sk_buff结构提供的一些操作函数. 第一.首先要讲的是sk_buff中的四大指针: 四大指针分别是:head.data.tail.end:这四个指针都是指向了数据区的,数据区中存放的是协议头和数据.head和end指针是每个数据包一样的,也是有这两个指针来确定数据区的大小的.最开始的时候head.data.tail三个指针都是指向一起的,当有协议数据加进来时才更改. 再来说下包的形成,首先是应用层的数据,然后到四层加上四层

jQuery整理笔记七----几个经典表单应用

1.文本框获得(失去)焦点 当文本框获得输入焦点时,将该文本框高亮显示,算不得一个应用,仅仅是一个小技巧,能够提高用户体验. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/

jQuery整理笔记八----jQuery的Ajax

Ajax,我一直读的是"阿贾克斯",据当时大学老师讲该读音出处是根据当年风靡欧洲的荷兰足球俱乐部阿贾克斯的名字来的,我觉得说法挺靠谱的. jQuery封装了Ajax的交互过程,用户不需要考虑XMLHttpRequest对象的兼容性问题以及使用XMLHttpRequest建立连接.发送请求.发送方式.接收方式等细节,利用jQuery定义 的几个简单方法,即可轻松实现客户端与服务端异步通信的问题,从而帮助开发人员从繁琐的技术细节中解脱出来,专心于业务层开发工作. 最初始的JavaScrip

jQuery整理笔记九----功能性表格开发

示例中用到的一些图片.插件.样式文件等下载地址:点我进入下载 过去在开发过程中关于table方面的jquery应用仅仅是局限于使用jquery操作table增加一行.删除一列等等操作.今天整理的跟过去用的不一样. 1.uiTableFilter uiTableFilter是一款表格数据行过滤插件,使用很简单,具体用法如下: $.uiTableFilter(table,phrase)  该函数包含两个参数,其中第一个参数为jQuery对象,即为jQuery方法匹配的表格,或者也可以是jQuery匹

iOS 整理笔记 获取手机信息(UIDevice、NSBundle、NSLocale)

/*    iOS的APP的应用开发的过程中,有时为了bug跟踪或者获取用反馈的需要自动收集用户设备.系统信息.应用信息等等,这些信息方便开发者诊断问题,当然这些信息是用户的非隐私信息,是通过开发api可以获取到的.那么通过那些api可以获取这些信息呢,iOS的SDK中提供了UIDevice,NSBundle,NSLocale.    UIDevice        UIDevice提供了多种属性.类函数及状态通知,帮助我们全方位了解设备状况.从检测电池电量到定位设备与临近感应,UIDevice