iOS SDK 2.0 语音及图片消息详解
本文档将详细介绍融云的语音及图片消息接口功能及使用说明。阅读本文前,我们假设您已经阅读了融云 iOS 开发指南,并掌握融云 SDK 的基本用法。

语音消息
用来发送语音片段消息,您可以通过融云客户端 IMLib 接口或 Server API 接口发送语音消息。如果您使用的是融云 IMKit 则该功能已经在 SDK 中封装好,直接使用即可。以下为通过融云 IMLib 及 Server API 发送语音消息的方法。

从客户端发送消息
获取要发送的语音数据 wavData,并获得语音时长,通过 sendMessage 方法,传入相应的参数即可发送语音消息,方法说明参见 API 文档链接。

消息类名:RCVoiceMessage

代码示例:

- (void)sendVoiceMessage:(NSData *)wavData duration:(long)duration targetId:(NSString *)targetId conversationType:(RCConversationType)conversationType {
 //语音消息实体
 RCVoiceMessage *voiceMessage = [RCVoiceMessage messageWithAudio:wavData duration:duration];

[[RCIMClient sharedRCIMClient] sendMessage:conversationType targetId:targetId content:voiceMessage pushContent:nil pushData:nil success:^(long messageId) {
    //NSLog(@"发送语音消息成功");
 } error:^(RCErrorCode nErrorCode, long messageId) {
    //NSLog(@"发送语音消息失败,错误码是(%ld)", (long)nErrorCode);
 }];
}
建议录音参数如下:

rcVoiceRecorderHandler.recordSettings = @{
 AVFormatIDKey : @(kAudioFormatLinearPCM),
 AVSampleRateKey : @8000.00f,
 AVNumberOfChannelsKey : @1,
 AVLinearPCMBitDepthKey : @16,
 AVLinearPCMIsNonInterleaved : @NO,
 AVLinearPCMIsFloatKey : @NO,
 AVLinearPCMIsBigEndianKey : @NO
 };
注意:建议语音消息时长最小为 1 秒,最长不能超过 60 秒。语音格式为 WAV,在消息通讯过程中语音消息都是通过转码成 AMR 格式,在 Base64 编码后进行传输。
从服务端发送消息
如果您需要从服务端发送语音消息,融云也提供了 Server API 接口,下面以发送单聊消息为例,说明如何发送语音消息。

调用 Server API 接口发送语音消息前,您需要需要将语音内容进行 Base64 编码 Encode 后,需要将所有 \r\n 替换成空,否则无法进行正确解析。

消息 ObjectName:RC:VcMsg

消息的结构:{"content":"bhZPzJXimRwrtvc=","duration":7,"extra":""}

其中 content 为语音消息录制转码成 AMR 格式后,进行 Base64 编码 Encode 后的结果值,duration 为语音消息的时长(单位:秒),extra 可以放置任意的数据内容,也可以去掉此属性。

注意:在对内容进行 Base64 编码 Encode 后,需要将所有 \r\n 替换成空,否则无法进行正确解析。建议语音消息时长最小为 1 秒,最长不能超过 60 秒。语音格式为 AMR。
代码示例:

Request:

POST /message/private/publish.json HTTP/1.1
Host: api.cn.ronghub.com
App-Key: uwd1c0sxdlx2
Timestamp: 1408706337
Nonce: 14314
Signature: 890b422b75c1c5cb706e4f7921df1d94e69c17f4
Content-Type: Application/x-www-form-urlencoded

content={"content":"IyFBTVIKPJEXFr5meeHgAeev8","duration":3,"extra":"helloExtra"}&fromUserId=2191&toUserId=2191&toUserId=2192&objectName=RC:TxtMsg&pushContent=thisisapush&pushData={\"pushData\":\"hello\"}&count=1
Response:

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8

{"code":200}
发送单聊消息方法参数说明,请参见文档。

接收语音消息解析
融云 SDK 接收到语音消息时,会按以下方式进行解析:

- (void)decodeWithData:(NSData *)data {
#if 1
  __autoreleasing NSError *__error = nil;
  if (!data) {
    return;
  }
  NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data
                                                       options:kNilOptions
                                                         error:&__error];
    RCDictionary *json = [[RCDictionary alloc] initWithDictionary:dictionary];
#else
  NSString *jsonStream =
      [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
  NSDictionary *json = [RCJSONConverter dictionaryWithJSONString:jsonStream];
#endif
  if (json) {
    NSString *base64Audio = [json stringObjectForKey:@"content"];

self.extra = [json stringObjectForKey:@"extra"];

if (base64Audio) {
      NSData *audioData = nil;
      if (class_getInstanceMethod(
              [NSData class],
              @selector(initWithBase64EncodedString:options:))) {
        audioData = [[NSData alloc] initWithBase64EncodedString:base64Audio
                                                        options:kNilOptions];
      } else {
        audioData = [RCUtilities dataWithBase64EncodedString:base64Audio];
      }

NSData *decodedData = [[RCAMRDataConverter sharedAMRDataConverter]
          dcodeAMRToWAVE:audioData];
      self.wavAudioData = decodedData;
    }

self.duration = [[json numberObjectForKey:@"duration"] longValue];

}
}
图片消息
用来发送图片类消息,您可以通过融云客户端 IMLib 接口或 Server API 接口发送图片消息。如果您使用的是融云 IMKit 则该功能已经在 SDK 中封装好,直接使用即可。以下为通过融云 IMLib 及 Server API 发送图片消息的方法。

图片发送机制
图片消息包括两个主要部分:缩略图和大图,缩略图直接 Base64 编码后放入 content 中,大图首先上传到文件服务器(融云 SDK 中默认上传到七牛云存储),然后将云存储上的大图地址放入消息体中。流程示意如下:

如果,您在发送图片消息时,希望将图片上传到自已的服务器然后发送图片消息。流程示意如下:

图片缩略图机制
缩略图尺寸为:240 x 240 像素,以宽度和高度中较长的边不超过 240 像素等比压缩。

大图尺寸为:960 x 960 像素,以宽度和高度中较长的边不超过 960 像素等比压缩。

从客户端发送消息
调用 sendMessage 方法,传入相应的参数即可发送图片消息。方法说明,请参见 API 文档链接。

消息类名:RCImageMessage

代码示例:

- (void)sendImageMessage:(UIImage *)originImage targetId:(NSString *)targetId conversationType:(RCConversationType)conversationType {
 //图片消息实体
 RCImageMessage *imageMessage = [RCImageMessage messageWithImage:originImage];

//设置full为YES,会发送原图。不设置默认发送经过压缩的图片。
 //imageMessage.full = YES;

[[RCIMClient sharedRCIMClient] sendImageMessage:conversationType targetId:targetId content:imageMessage pushContent:nil progress:^(int progress, long messageId) {
      //这里更新文件上传进度
 } success:^(long messageId) {
      //上传成功
 } error:^(RCErrorCode errorCode, long messageId) {
      //上传失败
 }];
}
如果,您在发送图片消息时,希望将图片上传到自已的服务器然后发送图片消息,代码示例如下:

- (void)sendImageMessage2AppServer:(UIImage *)originImage targetId:(NSString *)target conversationType:(RCConversationType)conversationType {
   //图片消息实体
   RCImageMessage *imageMessage = [RCImageMessage messageWithImage:originImage];

[[RCIMClient sharedRCIMClient] sendImageMessage:conversationType targetId:target content:imageMessage pushContent:nil pushData:nil uploadPrepare:^(RCUploadImageStatusListener *uploadListener) {
   //在这里上传。上传要告诉融云状态和结果
   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
     int i = 0;
     for (i = 0; i < 100; i++) {
       //上传图片到自己服务器,并通知融云进度,进度范围时0-100
       uploadListener.updateBlock(i);
       [NSThread sleepForTimeInterval:0.2];
     }
     //通知融云上传结果,参数是上传成功的url
     uploadListener.successBlock(@"http://www.rongcloud.cn/images/newVersion/bannerInner.png?0717");
   });
   } progress:^(int progress, long messageId) {
        //在这里更新UI进度。
   } success:^(long messageId) {
        //消息发送成功
   } error:^(RCErrorCode errorCode, long messageId) {
        //消息发送失败
   }];
}
sendImageMessage 方法说明,请参见 API 文档链接。

从服务端发送消息
如果您需要从服务端发送图片消息,融云也提供了 Server API 接口,下面以发送单聊消息为例,说明如何发送图片消息。

消息 ObjectName:RC:ImgMsg

消息的结构:{"content":"bhZPzJXimRwrtvc=","imageUri":"http://p1.cdn.com/fds78ruhi.jpg","extra":""}

其中 content 为图片内容进行 Base64 编码的结果值,imageUri 为图片上传到图片存储服务器后的地址,extra 可以放置任意的数据内容,也可以去掉此属性。

代码示例:

Request:

POST /message/private/publish.json HTTP/1.1
Host: api.cn.ronghub.com
App-Key: uwd1c0sxdlx2
Timestamp: 1408706337
Nonce: 14314
Signature: 890b422b75c1c5cb706e4f7921df1d94e69c17f4
Content-Type: Application/x-www-form-urlencoded

content={"content":"bhZPzJXimRwrtvc=","icon":"http://www.demo.com/p1.png","imageUri":"http://www.demo.com/1.jpg","extra":"helloExtra"}&fromUserId=2191&toUserId=2191&toUserId=2192&objectName=RC:TxtMsg&pushContent=thisisapush&pushData={\"pushData\":\"hello\"}&count=1
Response:

HTTP/1.1 200 OK
Content-Type: application/json; charset=utf-8

{"code":200}
发送单聊消息方法参数说明,请参见文档。

iOS - 语音云通讯的更多相关文章

  1. 开源企业IM,免费企业即时通讯软件-ENTBOOST云通讯平台Windows(r174)版本号公布

    经过恩布团队全体成员的不懈努力,依照原定计划,最终在今天(5月14日)公布第二个开源版本号,恩布企业互联IM,ENTBOOST 0.2.0(r174beta)Windows版本号:主要功能支持文本.表 ...

  2. Atitit s2018.2 s2 doc list on home ntpc.docx  \Atiitt uke制度体系 法律 法规 规章 条例 国王诏书.docx \Atiitt 手写文字识别 讯飞科大 语音云.docx \Atitit 代码托管与虚拟主机.docx \Atitit 企业文化 每日心灵 鸡汤 值班 发布.docx \Atitit 几大研发体系对比 Stage-Gat

    Atitit s2018.2 s2 doc list on home ntpc.docx \Atiitt uke制度体系  法律 法规 规章 条例 国王诏书.docx \Atiitt 手写文字识别   ...

  3. PaaSoo云通讯-印度市场机遇与挑战并存

    2019年4月16日,由白鲸出海举办的2019中印互联网大会(Global Connects India)在印度新德里举行,这次的大会主要涵盖了出海主题峰会.B2B展会.中印互联网高层圆桌等模块. 众 ...

  4. python-在python3中使用容联云通讯发送短信验证码

    容联云通讯是第三方平台,能够提供短信验证码和语音通信等功能,这里只测试使用短信验证码的功能,因此只需完成注册登录(无需实名认证等)即可使用其短信验证码免费测试服务,不过免费测试服务只能给控制台中指定的 ...

  5. Android讯飞语音云语音听写学习

    讯飞语音云语音听写学习         这几天两个舍友都买了iPhone 6S,玩起了"Hey, Siri",我依旧对我的Nexus 5喊着"OK,Google" ...

  6. 容联云通讯_提供网络通话、视频通话、视频会议、云呼叫中心、IM等融合通讯能力开放平台。

    容联云通讯_提供网络通话.视频通话.视频会议.云呼叫中心.IM等融合通讯能力开放平台. undefined

  7. 基于科大讯飞语音云windows平台开发

    前记: 前段时间公司没事干,突发奇想想做一个语音识别系统,看起来应该非常easy的,但做起来却是各种问题,这个对电气毕业的我,却是挺为难的.谷姐已经离我们而去,感谢度娘,感谢CSDN各位大神,好歹也做 ...

  8. Luffy之注册认证(容联云通讯短信验证)

    用户的注册认证 前端显示注册页面并调整首页头部和登陆页面的注册按钮的链接. 注册页面Register,主要是通过登录页面进行改成而成. 先构造前端页面 <template> <div ...

  9. 【转+修改】容联云通讯api调用短信发送调用

    转自   https://my.oschina.net/u/1995134/blog/814540 需要荣联云通讯 的 相对应SDKjar包. CCP_REST_SMS_SDK_JAVA_v2.6.3 ...

随机推荐

  1. Entity Framework做IN查询

    开发中遇到的Too high level of nesting for select错误 项目使用了Entity Framework结合Mysql, 遇到了一个非常奇怪的性能问题,一个看起来非常简单的 ...

  2. Effective Java 42 Use varargs judiciously

    Implementation theory The varargs facility works by first creating an array whose size is the number ...

  3. python基本数据结构-字典-方法

  4. linux动态网络和静态网络和克隆后的网络配置

    建议设置网卡NAT模式 动态网络配置:1.一定要开启本地DHCP服务 2.在虚拟网络编辑器中选择NAT模式选中DHCP项如下图 3.ifup eth0 静态网络配置 : 注释:ifcfg-eth0部分 ...

  5. R语言与数据分析

    K最近邻(k-Nearest Neighbor,KNN)分类算法 R语言实现包:R语言中有kknn package实现了weighted k-nearest neighbor. 决策树: R语言实现决 ...

  6. linux—【绝对路径与相对路径】与【【文件基本操作】】(4)

    [绝对路径与相对路径] 绝对路径:我们在获得一个文件的时候,从根目录到二级到更多级目录都写全了, 终才找到这个文件,这种方式就是“绝对路径” 相对路径:目标文件与我本身文件的相对位置 当前目录:./  ...

  7. 开发一个App要多少钱?APP开发报价单,APP开发外包有哪些注意事项-广州达到信息www.ddapp.com.cn

    来源:广州达到信息著作权归广州达到信息所有.商业转载请联系作者获得授权,非商业转载请注明出处. 作为一个APP开发从业者,经常会有人问到:开发一个App要多少钱?下面针对这个问题来好好解答解答正经的谈 ...

  8. function [ binary,decimal ] = num2binary16( number )

    function [ binary,decimal ] = num2binary16( number ) %The IEEE 754 standard specifies a binary16 as ...

  9. 《TCP/IP详解 卷一》读书笔记-----TCP persist &Keeplive timer

    1.persist timer:当接收方建议的窗口大小为0时,发送方就会停止发送,直到接收方有缓存空间时再用一个窗口值非零的ACK提示发送方可以继续发送.但是这个称为window update的ACK ...

  10. fontAwesome代替网页icon小图标

    引言 奥森图标(Font Awesome)提供丰富的矢量字体图标—通过CSS可以任意控制所有图标的大小 ,颜色,阴影. 网页小图标到处可见,如果一个网页都是干巴巴的文字和图片,而没有小图标,会显得非常 ...