iOS环信3.0发送文字,语音,位置,图片封装代码

因为项目要求,花了快一个月的时间都在做环信的即时聊天,中间也是查查找找,看看别人的代码,看看环信的文档,所以现在打算整合一份给大家参考。

项目中只做了文字,语音,位置,图片发送。看这篇文章的时候默认读者已经阅读了解环信3.0文档。

以下代码都是封装好的,可以直接调用

发送文字

/**
 *  @param txtStr 消息文字
 *  @param chatBossTel 接收方
 */
#pragma mark 环信-发送文字动作
-(void)sendMessage:(NSString *)txtStr
{
  //加入子线程,不会造成卡顿
   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //生成消息
        EMTextMessageBody *body=[[EMTextMessageBody alloc]initWithText:txtStr];
        //消息发送方
        NSString *from=[[EMClient sharedClient]currentUsername];
        
        //消息的接收方
        EMMessage *message=[[EMMessage alloc]initWithConversationID:self.chatBossTel from:from to:self.chatBossTel body:body ext:nil];
        //消息类型是单聊
        message.chatType=EMChatTypeChat;
        
        //发送消息
        [[EMClient sharedClient].chatManager asyncSendMessage:message progress:^(int progress) {
        } completion:^(EMMessage *message, EMError *error) {
            CLog(@"发送的消息错误原因%@",error);
            if (!error)
            {
                //把消息加入数组
                [self.messArr addObject:message];
                //计算高度
                [self.messHeightArr addObjectsFromArray:[self calculateMesseageHeightWithCell:@[message]]];
                //滑动到最后一行
                dispatch_async(dispatch_get_main_queue(), ^{
                    [self tableViewScrollToBottom];
                });
            }
        }];
    });
}

发送语音

#pragma mark环信-发送语音
/**
 *  @param localPath   语音地址
 *  @param duration    语音秒数
 */
-(void)sendVoiceWithLocalPath:(NSString*)localPath
               andDisplayName:(NSString*)displayName
                  andDuration:(int)duration
{
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        //生成语音
        EMVoiceMessageBody *body=[[EMVoiceMessageBody alloc]initWithLocalPath:localPath displayName:displayName];
        //语音的秒数
        body.duration=self.recordV.duration;
        NSString *from=[[EMClient sharedClient]currentUsername];
        //生成Mes
        EMMessage *message=[[EMMessage alloc]initWithConversationID:self.chatBossTel from:from to:self.chatBossTel body:body ext:nil];
        //设为单聊
        message.chatType=EMChatTypeChat;
        
        if (duration>1)//大于1秒
        {
            [[EMClient sharedClient].chatManager asyncSendMessage:message progress:^(int progress) {
            } completion:^(EMMessage *message, EMError *error) {
                //加入tab
                [self.messArr addObject:message];
                [self.messHeightArr addObjectsFromArray:[self calculateMesseageHeightWithCell:@[message]]];
                dispatch_async(dispatch_get_main_queue(), ^{
                    [self tableViewScrollToBottom];
                });
            }];
        }
        else
        {
            //停止录音
            [self.recordV stopRecordVocie];
            //删除录音
            [self.recordV deleteVoice];
            dispatch_async(dispatch_get_main_queue(), ^{
                //录音时间太短请重新
                [WarnWindow HUD:self.view andWarnText:@"录音时间太短请重新" andXoffset:0 andYoffset:0];
            });
        }
    });
}

发送位置

#pragma mark 环信-发送位置
/**
 *  @param latitude  纬度
 *  @param longitude 经度
 *  @param location  位置
 */
-(void)sendLocationWithLatitude:(CGFloat)latitude
                   andLongitude:(CGFloat)longitude
                    andLocation:(NSString*)location
{
     dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
         //生成位置
         EMLocationMessageBody *body=[[EMLocationMessageBody alloc]initWithLatitude:latitude longitude:longitude address:location];
         NSString *from=[[EMClient sharedClient]currentUsername];
         
         //生成Mes
         EMMessage *message=[[EMMessage alloc]initWithConversationID:self.chatBossTel from:from to:self.chatBossTel body:body ext:nil];
         //设为单聊
         message.chatType=EMChatTypeChat;
         //发送语音
         [[EMClient sharedClient].chatManager asyncSendMessage:message progress:^(int progress) {
         } completion:^(EMMessage *message, EMError *error) {
             CLog(@"发送位置的错误%@",error);
             if (!error)
             {
                 //加入tab
                 [self.messArr addObject:message];
                //计算高度
                 [self.messHeightArr addObjectsFromArray:[self calculateMesseageHeightWithCell:@[message]]];
                 dispatch_async(dispatch_get_main_queue(), ^{
                     [self tableViewScrollToBottom];
                 });
             }
         }];
    });
}

发送图片

#pragma mark 相册代理 发送图片
//从相册中获取图片进行发送,正在发送时带了一个菊花
-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    //从字典中获取原始对象
    UIImage *imgV=info[UIImagePickerControllerOriginalImage];
    NSData *data=UIImageJPEGRepresentation(imgV, 0.5);
    //生成图片的data
    EMImageMessageBody *body=[[EMImageMessageBody alloc]initWithData:data displayName:@"image.png"];
    NSString *from=[[EMClient sharedClient] currentUsername];
    
    EMMessage *message=[[EMMessage alloc]initWithConversationID:self.chatBossTel from:from to:self.chatBossTel body:body ext:nil];
    message.chatType=EMChatTypeChat;
    [self creatHud];//显示菊花
    //发送图片
    [[EMClient sharedClient].chatManager asyncSendMessage:message progress:^(int progress) {
        if (progress==100)
        {
            [hud hide:YES];//隐藏菊花
        }
    } completion:^(EMMessage *message, EMError *error) {
        CLog(@"发送图片Error%@",error);
        if (!error)
        {   //存入数组
            [self.messArr addObject:message];
            [self.messHeightArr addObjectsFromArray:[self calculateMesseageHeightWithCell:@[message]]];
            [self tableViewScrollToBottom];
        }
    }];
    [picker dismissViewControllerAnimated:YES completion:nil];//模态视图
}
以上就是发送文字,语音,位置,图片的封装,可以直接调用。一些常用类下一次会给你们列出来。
使用到的方法:

环信3.0项目中用到的一些封装的类方法

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,142评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,298评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,068评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,081评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,099评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,071评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,990评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,832评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,274评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,488评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,649评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,378评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,979评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,625评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,643评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,545评论 2 352

推荐阅读更多精彩内容