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

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

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

往期回顾:

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取数据的必要操作。所有代码写在这个懒加载中

- (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页面首次加载中加上一句,否则不干活

// 查询数据

[self.fetchedResultsController performFetch:NULL];

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

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

#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流 发出去。

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

/** 发送信息 */

- (void)sendMessage:(NSString *)message

{

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

[msg addBody:message];

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

}

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

// 取出当前行的消息

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里 这个模块需要用到得属性和方法有

/** xmpp流 */

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

/** 消息归档 */

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

/** 消息归档存储 */

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

+ (instancetype)sharedXMPPTools;

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

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

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

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

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

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航