美文网首页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项目中用到的一些封装的类方法

    相关文章

      网友评论

      • 苜蓿鬼仙:请问这个 录音的路径是如何获取的呀?
        离离离离:@苜蓿鬼仙 你应该自己是有定义录音的格式,我这边是用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