融云发送图片消息_iOS SDK 语音及图片消息详解

本文档深入解析融云iOS SDK中语音及图片消息的接口与使用方法,包括客户端与服务端发送语音和图片消息的示例代码,以及消息格式和接收解析过程。
摘要由CSDN通过智能技术生成

iOS SDK 语音及图片消息详解

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

语音消息

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

从客户端发送消息

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

代码示例:

- (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 中默认上传到七牛云存储,图片有效期为 6 个月。),然后将云存储上的大图地址放入消息体中。流程示意如下:

App -> RongCloud IM SDK: 调用发送图片消息接口

RongCloud IM SDK -> File Server: 上传大图,到文件服务器

RongCloud IM SDK --> App: 更新图片上传进度

File Server --> RongCloud IM SDK: 上传成功,返回上传大图的地址

RongCloud IM SDK -> RongCloud IM Server: 发送图片消息(内附缩略图内容和大图地址)

RongCloud IM Server --> RongCloud IM SDK: 返回发送成功状态

RongCloud IM SDK --> App: 返回发送成功状态

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

App -> RongCloud IM SDK: 调用发送图片消息接口

RongCloud IM SDK -> RongCloud IM SDK: 存储图片消息

RongCloud IM SDK --> App: 通过 App 上传图片到文件服务器

App -> App File Server: 上传大图,到自己的文件服务器

App -> RongCloud IM SDK: 更新图片上传进度

App File Server --> App: 上传成功,返回上传大图的地址

App -> RongCloud IM SDK: 通过融云发送消息,并附带图片地址

RongCloud IM SDK -> RongCloud IM Server: 发送图片消息(内附缩略图内容和大图地址)

RongCloud IM Server --> RongCloud IM SDK: 返回发送成功状态

RongCloud IM SDK --> App: 返回发送成功状态

图片缩略图机制

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

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

从客户端发送消息

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

代码示例:

- (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}

发送单聊消息方法参数说明,请参见文档。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值