这近正在做一个项目,我是负责里面的聊天模块,聊天分为单聊和群聊;开始做的时候时候采用的XMPP,虽然之前都没接触过,但一直都想有这么一个机会深入的了解下XMPP的通讯协议;
经过一个星期的各种GOOGLE,百度,查看XMPP协议文档(文档信息太大了,看的头疼),自己照着搭建了一个xmpp服务器,利用Adium模拟客户端通讯,简单的实现了
单聊,群聊;好友上线,下线,加人,同意加入,邀请群加入等。。。完成了2/1的功能。
服务器原因,后俩采用HTTP长连接进行聊天通讯。
长连接对于移动端来说简单多了,所有的工作都有服务器帮我们进行实现.
扯远了,改天吧我写的xmppDemo给补上,今天还是说这个qq聊天表情的实现实现吧;
这个表情聊天的实现思路: 客户端跟服务器定义通信时表情符号: 比如<sml>smile</sml> 代表(微笑)的表情,
客户端再聊天的过程中凡是遇到这个标签的信息就需要转换成微笑表情图片;<sml> 与</sml>是封装表情的特定的标签,凡是遇到这两个标签就需要提取其中的值。
比如有人发来聊天信息: 美女,你好<sml>smile</sml> 客户端应该展示的是:美女,你好 ;
怎么解析这样的标签,我的做法是这样的,一个聊天信息由 文字与表情构成,我们则把它放在一个数组中表示,
比如: 美女,你好 代表arr[0] 然后 <sml>smile</sml>代表 arr[1], 不断类似反复的解析,其实这里可以用递归实现,非常简单 ;
为了实现图文混排的效果,自己简单的对此进行的一个简单的封装,继承UITextView,复写
drawRect重画计算其中表情数据的解析和文字.结合UITableViewCell 进行表情数据的展示。
-
-
-
-
-
-
-
-
- #import <UIKit/UIKit.h>
-
- #define KFacialSizeWidth 24
- #define KFacialSizeHeight 24
-
-
- #define startTag @"[sml]"
- #define endTag @"[/sml]"
-
- @interface FaceTextView : UITextView
-
- @end
-
-
-
-
-
-
-
-
- #import "FaceTextView.h"
-
- @implementation FaceTextView
-
- - (id)initWithFrame:(CGRect)frame
- {
- self = [super initWithFrame:frame];
- if (self) {
-
- }
- return self;
- }
-
-
-
- - (void)drawRect:(CGRect)rect
- {
-
-
- NSString *text = [NSString stringWithFormat:@"%@",self.text];
- self.text =@"";
- NSLog(@"chatMessage: %@",text);
-
- if (text.length == 0) {
- return;
- }
-
-
- NSMutableArray *data=[[NSMutableArray alloc] init];
-
- [self parseChatMessage:text :data];
-
- UIFont *fon=self.font;
- CGFloat upX=0;
- if (data) {
- for (int i=0;i<[data count];i++) {
- NSString *str=[data objectAtIndex:i];
- if ([str hasPrefix: startTag ]&&[str hasSuffix: endTag ]) {
-
- NSString *imageName=[str substringWithRange:
- NSMakeRange(startTag.length, str.length-(startTag.length+endTag.length))];
-
- UIImage *img=[UIImage imageNamed:imageName];
- [img drawInRect:CGRectMake(upX, 0, KFacialSizeWidth, KFacialSizeHeight)];
-
- upX=KFacialSizeWidth+upX;
- }else {
-
- CGSize size=[str sizeWithFont:fon constrainedToSize:CGSizeMake(320, 40)];
- [str drawInRect:CGRectMake(upX, 0, size.width, self.bounds.size.height) withFont:fon];
- upX=upX+size.width;
-
- }
- }
- }
- [data release];
- }
-
-
-
-
-
-
-
-
- -(void)parseChatMessage:(NSString*)message :(NSMutableArray*)array
- {
- NSRange sRange=[message rangeOfString:startTag];
- NSRange eRange=[message rangeOfString:endTag];
-
- if (sRange.length&&eRange.length) {
-
- if (sRange.location>0) {
-
- [array addObject:[message substringToIndex:sRange.location]];
- }
- NSString *nextstr=[message substringWithRange:NSMakeRange(sRange.location, eRange.location+endTag.length-sRange.location)];
-
-
- if (![nextstr isEqualToString:@""]) {
-
- [array addObject:nextstr];
-
- NSString *str=[message substringFromIndex:eRange.location+endTag.length];
-
- [self parseChatMessage:str :array];
-
- }else {
- return;
- }
-
- }else {
- [array addObject:message];
- }
- }
- @end
简单的表情数据解析完毕,接着就是结合UITableView进行聊天信息的展现。
相信大家对UITableView非常熟悉了,自定义一个聊天Cell,这里就不在多说。
我这边自己写了一个关于的demo,本想上传Github,密码暂时找不回来,大家想要的话留个言;