美文网首页iOS开发技能推送iOS开发
iOS环信3.0发送文字,语音,位置,图片封装代码

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

作者: 离离离离 | 来源:发表于2016-07-21 22:17 被阅读2276次

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

项目中只做了文字,语音,位置,图片发送。看这篇文章的时候默认读者已经阅读了解环信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项目中用到的一些封装的类方法

相关文章

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

    因为项目要求,花了快一个月的时间都在做环信的即时聊天,中间也是查查找找,看看别人的代码,看看环信的文档,所以现在打...

  • 环信3.0功能性代码封装(一)

    以下代码都是封装好的,可以直接调用 发送文字#### 发送语音#### 发送位置#### 发送图片####

  • RN 聊天功能 使用环信 发送 消息

    发送 语音问题 RN 环信 官方已经不再维护 目前的 代码 集成 只能实现文字和图片 使用的是webIm SDK的...

  • node.js + socket.io 的聊天程序 服务器端+

    即时通讯聊天程序包含三端代码:包含功能: 1>发送文字2>发送图片3>发送短语音4>发送地理位置5>视频聊天 服务...

  • 欢信社交不仅仅是单纯意义的网络虚拟呼机

    欢信支持文字消息、语音消息、文件传输、语音通话、位置共享、分享图片和视频、召唤好友、链接预览、名片发送 等多项功能...

  • 关于自定义聊天功能(理论篇)

    先上效果图 实现的功能, 发送文字,发送系统的emoji,发送图片,发送语音,消息的重发。 控件封装思路 整体采用...

  • 微信群的功能测试点

    1.发送消息测试 可发类型:语音、文字(语音文字可互转)、图片、照片、视频、文件、拍摄、位置、红包、转账、接龙名片...

  • iOS 环信集成

    1、流程类: 最新环信V3.3.7单聊集成与使用 iOS环信3.0集成 (三)单聊集成有视频 iOS 环信3.0D...

  • 自定义语音录制按钮

    之前做了一个聊天室模块,除了能发送文字、图片,还需要发送语音,就涉及到了语音的手势,手势就和微信的是一样的,现在大...

  • 自定义语音录制按钮

    之前做了一个聊天室模块,除了能发送文字、图片,还需要发送语音,就涉及到了语音的手势,手势就和微信的是一样的,现在大...

网友评论

  • 苜蓿鬼仙:请问这个 录音的路径是如何获取的呀?
    离离离离:@苜蓿鬼仙 你应该自己是有定义录音的格式,我这边是用wav的,保存的时候肯定也有一个文件名,通过这2个参数进行获取
    苜蓿鬼仙:@离离离离 通过这种方式获取,是需要传文件名和文件的后缀吧,但是刚录音的文件,如何知道这两个参数呢?
    离离离离:NSString *directory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)lastObject];;
    NSString* fileDirectory = [[[directory stringByAppendingPathComponent:fileName]
    stringByAppendingPathExtension:type]
    stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    CLog(@"文件路径%@",fileDirectory);
    return fileDirectory;
  • ce4c10d6271a:大神,我现在手上有一个新版的和一个旧版的app,目的是和客服交流!旧版的是继承EaseMessageViewController实现的,新版的全部手写的。新版的我可以接收到客服消息(虽然并不是那么完整),但是发生的时候返回来成功了,但是客服收不到。我特意去对比发送成功后返回来的message 里面的from和to,新版和旧版都是对应一样的。
    离离离离:@名字什么的不重要 你查查代码吧,你这样描述我也不知道是哪里出现了问题
    ce4c10d6271a:@离离离离 注册了,我在客服上发消息给app,app可以收到!app发消息,显示发送成功,但是客服收不到
    离离离离:你的客服账号在环信注册了吗,如果没有注册是收不到消息。然后查一下获取消息的时候客服账号是否为登录状态
  • 野地里的程序员怎么:大神修改录音时小话筒的图片咋修改??
    野地里的程序员怎么:@离离离离 好的谢谢
    离离离离:@_倥鯎丶唸舊仒
    在播放录音的时候获取录音的音量,代理返回。
    [self.recorder updateMeters];//刷新音量数据
    double lowPassResults=pow(10, (0.05 * [self.recorder peakPowerForChannel:0]));
    CLog(@"%lf",lowPassResults);
    [self.delegate sendDetectionVoice:lowPassResults];

    #pragma mark 音量代理-改变音量视图
    -(void)sendDetectionVoice:(double)lowPassResults
    {
    if (0<lowPassResults&&lowPassResults<=0.25)
    {
    self.recordStatusImgV.image=Image(@"sendAudio_1@2x");
    }
    else if(lowPassResults>0.25&&lowPassResults<=0.5)
    {
    self.recordStatusImgV.image=Image(@"sendAudio_2@2x");
    }
    else if (lowPassResults>0.5&&lowPassResults<=0.75)
    {
    self.recordStatusImgV.image=Image(@"sendAudio_3@2x");
    }
    else
    {
    self.recordStatusImgV.image=Image(@"sendAudio_4@2x");
    }
    }
    这个image就是播放语音那三个弯曲线图片,或者弄一张gif图片也可以。
  • figure_ai:是否是自己实现录音,然后把录的音存到本地,环信发送语音的时候,把存放语音的路径丢进去?
    figure_ai:@离离离离 好的,谢谢
    离离离离:@figure_ai 是的 思路就是这样
  • figure_ai:请问一下录音需要自己实现吗
    离离离离:对,自己录音,看大家都需要这个,过一段时间我整理一下上传上来吧
  • Thinkdifferents:发语音时传的路径 具体是什么呀?
    Thinkdifferents:@离离离离 OK
    离离离离:@ThinkDifferents 把语音存在本地 再传
  • listen_to:请我有demo吗?:smile:
    离离离离:@listen_to 没有哦 这是从项目里抽离出来的
  • 哎呦我去叫什么呢:大神求助攻啊,为什么发语音消息的时候一直告诉的没有找到文件啊
    /var/mobile/Containers/Data/Application/4DB78406-26E0-4C0F-B996-135E7D07A25A/voiceFile505460825.wav not exist
    离离离离:@哎呦我去叫什么呢 现在解决了吗?
    哎呦我去叫什么呢:@离离离离 生成了啊,可以放出来的
    离离离离:@哎呦我去叫什么呢 你生成了语音文件了吗
  • d30cd884f3cf:请问 self.recordV这个是什么在哪赋值的是哪个类的对象需要引入环信的哪个头文件吗?
    离离离离:@恋水的鱼 这个不是 是自己封装的语音
  • 木头Lee:大神,self.chatBossTel是什么属性?还有ConversationID怎么获取,刚接触环信小白,求指教 :pray:
    离离离离:@木头Lee 不好意思今天才上,self.chatBossTel是与你聊天的对方对话,ConversationID是通过Conversation获取

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

本文链接:https://www.haomeiwen.com/subject/adwbjttx.html