消息发送
IM 的实现是基于 socket
的长链接,开发者可以使用各种类型的消息来实现 App 之间的通信。
SDK 内提供两种类型的发送方法
发送类型 | 包含的消息类型 |
---|---|
普通类型消息发送 | 文本消息、语音消息、位置消息、图文(富文本)消息 |
媒体类型消息发送 | 图片消息、文件消息 |
SDK内有三个类提供了发送消息的方法。
类名 | 是否会自动刷新UI视图 |
---|---|
RCConversationViewController | 会 |
RCIM | 会 |
RCIMClient | 不会 |
上传到指定的服务器:
提示
SDK 中 (图片消息、图文消息、文件消息) 默认上传文件存储有效期为 6 个月,不支持文件迁移。
文本消息¶
提示
在 IMKit 会话界面中,为保证 UI 体验的流畅度,单条文本消息的显示高度限制为 8000pt,当消息内容较多时将截取显示,不会将内容全部显示出来,如需要查看全部内容可在消息的双击事件中实现展示处理。详细查看
参数 | 类型 | 说明 |
---|---|---|
content | NSString | 文本消息的内容 |
返回值 | 本类对象 | 文本消息对象 |
/*!
初始化文本消息 [RC:TxtMsg]
@param content 文本消息的内容
@return 文本消息对象
*/
RCTextMessage *txtMsg = [RCTextMessage messageWithContent:content];
语音消息¶
注意
语音参数必须是 wav 格式的,RCIMClient
中有相关的方法来转换语音数据格式。
参数 | 类型 | 说明 |
---|---|---|
audioData | NSData | wav格式的音频数据 |
duration | long | 语音消息的时长(单位:秒) |
返回值 | 本类对象 | 语音消息对象 |
/*!
初始化语音消息
@discussion
如果您不是使用IMKit中的录音功能,则在初始化语音消息的时候,需要确保以下几点。
1. audioData必须是单声道的wav格式音频数据;
2. audioData的采样率必须是8000Hz,采样位数(精度)必须为16位。
参考IMKit中的录音参数:
NSDictionary *settings = @{AVFormatIDKey: @(kAudioFormatLinearPCM),
AVSampleRateKey: @8000.00f,
AVNumberOfChannelsKey: @1,
AVLinearPCMBitDepthKey: @16,
AVLinearPCMIsNonInterleaved: @NO,
AVLinearPCMIsFloatKey: @NO,
AVLinearPC'MIsBigEndianKey: @NO};
*/
RCVoiceMessage *rcVoiceMessage = [RCVoiceMessage messageWithAudio:audioData duration:duration]
图片消息¶
参数 | 类型 | 说明 |
---|---|---|
image | UIImage | 原始图片 |
返回值 | 本类对象 | 图片消息对象 |
/*!
初始化图片消息
@param image 原始图片
@return 图片消息对象
*/
+ (instancetype)messageWithImage:(UIImage *)image;
参数 | 类型 | 说明 |
---|---|---|
imageURI | NSString | 图片的本地路径 |
返回值 | 本类对象 | 图片消息对象 |
/*!
初始化图片消息
@param imageURI 图片的本地路径
@return 图片消息对象
*/
+ (instancetype)messageWithImageURI:(NSString *)imageURI;
参数 | 类型 | 说明 |
---|---|---|
imageData | NSData | 图片的原始数据 |
返回值 | 本类对象 | 图片消息对象 |
/*!
初始化图片消息
@param imageData 图片的原始数据
@return 图片消息对象
*/
+ (instancetype)messageWithImageData:(NSData *)imageData;
代码示例:
/*!
初始化图片消息
@param image 原始图片
@return 图片消息对象
*/
RCImageMessage *imageMessage = [RCImageMessage messageWithImage:image]
注意
图片消息发送方的 imageUrl
里面是图片的本地 url
,接收方的 imageUrl
是网络 url
图片缩略图机制:
类型 | 尺寸 ( 像素 ) | 压缩方式 |
---|---|---|
缩略图 | 240 x 240 | 以宽度和高度中较长的边不超过 240 像素等比压缩 |
大图 | 960 x 960 | 以宽度和高度中较长的边不超过 960 像素等比压缩 |
图文消息¶
参数 | 类型 | 说明 |
---|---|---|
title | NSString | 图文消息的标题 |
digest | NSString | 图文消息的内容摘要 |
imageURL | NSString | 图文消息的图片URL |
url | NSString | 图文消息中包含的需要跳转到的URL |
extra | NSString | 图文消息的扩展信息 |
返回值 | 本类对象 | 图文消息对象 |
RCRichContentMessage *richMsg = [RCRichContentMessage messageWithTitle:title digest:digest imageURL:imageurl url:url extra:nil];
位置消息¶
参数 | 类型 | 说明 |
---|---|---|
image | UIImage | 地理位置的缩略图 |
location | CLLocationCoordinate2D | 地理位置的二维坐标 |
locationName | NSString | 地理位置的名称 |
返回值 | 本类对象 | 地理位置消息的对象 |
/*!
初始化地理位置消息
@param image 地理位置的缩略图
@param location 地理位置的二维坐标
@param locationName 地理位置的名称
@return 地理位置消息的对象
*/
RCLocationMessage *locationMessage = [RCLocationMessage messageWithLocationImage:image location:location locationName:locationName];
文件消息¶
参数 | 类型 | 说明 |
---|---|---|
localPath | NSString | 文件的本地路径 |
返回值 | 本类对象 | 文件消息对象 |
/*!
初始化文件消息
@param localPath 文件的本地路径
@return 文件消息对象
*/
+ (instancetype)messageWithFile:(NSString *)localPath
RCFileMessage *fileMessage = [RCFileMessage messageWithFile:filePath]
发送消息¶
提示
当接收方离线并允许远程推送时,会收到远程推送。远程推送中包含两部分内容:
-
pushContent
: 用于显示。 -
pushData
: 用于携带不显示的数据.
SDK 内置的消息类型,将 pushContent
置为 nil
,会使用默认的推送格式进行远程推送。
自定义类型的消息,需要开发者设置 pushContent
来定义推送内容,否则将不进行远程推送。
普通类型¶
参数 | 类型 | 说明 |
---|---|---|
messageContent | RCMessageContent | 消息的内容 |
pushContent | NSString | 接收方离线时需要显示的远程推送内容 |
/*!
RCConversationViewController Class
如果您需要设置发送的pushData,可以使用RCIM的发送消息接口。
*/
- (void)sendMessage:(RCMessageContent *)messageContent pushContent:(NSString *)pushContent;
参数 | 类型 | 说明 |
---|---|---|
conversationType | RCConversationType | 发送消息的会话类型 |
targetId | NSString | 发送消息的目标会话ID |
content | RCMessageContent | 消息的内容 |
pushContent | NSString | 接收方离线时需要显示的远程推送内容 |
pushData | NSString | 接收方离线时需要在远程推送中携带的非显示数据 |
successBlock | void | 消息发送成功的回调 |
errorBlock | void | 消息发送失败的回调 |
返回值 | RCMessage | 发送的消息实体 |
/*!
RCIM Class
发送消息(除图片消息、文件消息外的所有消息)
*/
- (RCMessage *)sendMessage:(RCConversationType)conversationType
targetId:(NSString *)targetId
content:(RCMessageContent *)content
pushContent:(NSString *)pushContent
pushData:(NSString *)pushData
success:(void (^)(long messageId))successBlock
error:(void (^)(RCErrorCode nErrorCode, long messageId))errorBlock;
提示
使用 RCIM
里的方法发送消息,SDK 会自动更新 UI。
参数 | 类型 | 说明 |
---|---|---|
conversationType | RCConversationType (枚举) | 发送消息的会话类型 |
targetId | NSString | 发送消息的目标会话ID |
content | RCMessageContent | 消息的内容 |
pushContent | NSString | 接收方离线时需要显示的远程推送内容 |
pushData | NSString | 接收方离线时需要在远程推送中携带的非显示数据 |
option | RCSendMessageOption (枚举) | 消息的相关配置 |
successBlock | void | 消息发送成功的回调 |
errorBlock | void | 消息发送失败的回调 |
返回值 | RCMessage | 发送的消息实体 |
/*!
RCIMClient Class
*/
- (RCMessage *)sendMessage:(RCConversationType)conversationType
targetId:(NSString *)targetId
content:(RCMessageContent *)content
pushContent:(NSString *)pushContent
pushData:(NSString *)pushData
success:(void (^)(long messageId))successBlock
error:(void (^)(RCErrorCode nErrorCode, long messageId))errorBlock;
- (RCMessage *)sendMessage:(RCConversationType)conversationType
targetId:(NSString *)targetId
content:(RCMessageContent *)content
pushContent:(NSString *)pushContent
pushData:(NSString *)pushData
option:(RCSendMessageOption *)option
success:(void (^)(long messageId))successBlock
error:(void (^)(RCErrorCode nErrorCode, long messageId))errorBlock;
注意
使用上述方法发送图片,需要开发者自己实现图片的上传,构建一个 RCImageMessage
对象,并将 RCImageMessage
中的 imageUrl
字段设置为上传成功的 URL
地址,然后进行发送。
使用上述方法发送文件消息,需要开发者自己实现文件的上传,构建一个 RCFileMessage
对象,并将 RCFileMessage
中的 fileUrl
字段设置为上传成功的 URL
地址,然后进行发送。
使用 IMKit
,请使用 RCIM
中的同名方法发送消息,RCIMClient
里的方法不会自动更新UI。
代码示例:
RCTextMessage *rcTextMessage = [RCTextMessage messageWithContent:@"文本内容"];
//RCConversationViewController
[self sendMessage:rcTextMessage pushContent:nil];
//RCIM
[[RCIM sharedRCIM] sendMessage:self.conversationType
targetId:self.targetId
content:rcTextMessage
pushContent:nil
pushData:nil
success:^(long messageId) {
} error:^(RCErrorCode nErrorCode, long messageId) {
NSLog(@"error");
}];
媒体类型¶
参数 | 类型 | 说明 |
---|---|---|
messageContent | RCMessageContent | 消息的内容 |
pushContent | NSString | 接收方离线时需要显示的远程推送内容 |
appUpload | BOOL | 是否上传到App指定的服务器 |
/*!
发送媒体消息(上传图片或文件到App指定的服务器)
@discussion
此方法用于上传媒体信息到您自己的服务器,此时需要将appUpload设置为YES,并实现uploadMedia:uploadListener:回调。
需要您在该回调中上传媒体信息(图片或文件),并通过uploadListener监听通知SDK同步显示上传进度。
如果appUpload设置为NO,将会和普通媒体消息的发送一致,上传到融云默认的服务器并发送。
*/
- (void)sendMediaMessage:(RCMessageContent *)messageContent
pushContent:(NSString *)pushContent
appUpload:(BOOL)appUpload;
提示
上传媒体信息上传到自己服务器
-
将
appUpload
设置为YES
。 -
实现
uploadMedia:uploadListener:
,需要开发者在回调中上传媒体信息(图片或文件)。 -
通过
uploadListener
来通知 SDK 同步显示上传进度。
参数 | 类型 | 说明 |
---|---|---|
message | RCMessage | 媒体消息(图片消息或文件消息)的实体 |
uploadListener | RCUploadMediaStatusListener | SDK图片上传进度监听 |
/*!
上传媒体信息到App指定的服务器的回调
@discussion 如果您通过sendMediaMessage:pushContent:appUpload:接口发送媒体消息,则必须实现此回调。
您需要在此回调中通过uploadListener将上传媒体信息的进度和结果通知SDK,SDK会根据这些信息,自动更新UI。
*/
- (void)uploadMedia:(RCMessage *)message uploadListener:(RCUploadMediaStatusListener *)uploadListener;
注意
通过 sendMediaMessage:pushContent:appUpload:
接口发送媒体消息,则必须实现上述回调。需要在此回调中通过 uploadListener
将上传媒体信息的进度和结果通知 SDK ,SDK 会根据这些信息,自动更新 UI。
参数 | 类型 | 说明 |
---|---|---|
conversationType | RCConversationType (枚举) | 发送消息的会话类型 |
targetId | NSString | 发送消息的目标会话ID |
content | RCMessageContent | 消息的内容 |
pushContent | NSString | 接收方离线时需要显示的远程推送内容 |
pushData | NSString | 接收方离线时需要在远程推送中携带的非显示数据 |
uploadPrepareBlock | void | 媒体文件上传进度更新的IMKit监听 |
progressBlock | void | 消息发送进度更新的回调 |
successBlock | void | 消息发送成功的回调 |
errorBlock | void | 消息发送失败的回调 |
cancelBlock | void | 用户取消了消息发送的回调 |
返回值 | 发送的消息实体 |
/*!
RCIM Class
*/
- (RCMessage *)sendMediaMessage:(RCConversationType)conversationType
targetId:(NSString *)targetId
content:(RCMessageContent *)content
pushContent:(NSString *)pushContent
pushData:(NSString *)pushData
progress:(void (^)(int progress, long messageId))progressBlock
success:(void (^)(long messageId))successBlock
error:(void (^)(RCErrorCode errorCode, long messageId))errorBlock
cancel:(void (^)(long messageId))cancelBlock;
提示
使用 RCIM
里的方法发送消息,SDK 会自动更新 UI。
/*!
RCIMClient Class
发送媒体消息(图片消息或文件消息)
*/
- (RCMessage *)sendMediaMessage:(RCConversationType)conversationType
targetId:(NSString *)targetId
content:(RCMessageContent *)content
pushContent:(NSString *)pushContent
pushData:(NSString *)pushData
progress:(void (^)(int progress, long messageId))progressBlock
success:(void (^)(long messageId))successBlock
error:(void (^)(RCErrorCode errorCode, long messageId))errorBlock
cancel:(void (^)(long messageId))cancelBlock;
/*!
发送媒体消息(上传图片或文件等媒体信息到指定的服务器)
@discussion 此方法仅用于IMKit。
*/
- (RCMessage *)sendMediaMessage:(RCConversationType)conversationType
targetId:(NSString *)targetId
content:(RCMessageContent *)content
pushContent:(NSString *)pushContent
pushData:(NSString *)pushData
uploadPrepare:(void (^)(RCUploadMediaStatusListener *uploadListener))uploadPrepareBlock
progress:(void (^)(int progress, long messageId))progressBlock
success:(void (^)(long messageId))successBlock
error:(void (^)(RCErrorCode errorCode, long messageId))errorBlock
cancel:(void (^)(long messageId))cancelBlock;
注意
如需上传图片或文件到自己的服务器,请使用 RCIMClient
的 sendMessage:targetId:content:pushContent:pushData:success:error:
方法或 sendMessage:targetId:content:pushContent:success:error:
方法进行发送,不要使用上述方法。
使用 IMKit
,请使用 RCIM
中的同名方法发送消息,RCIMClient
里的方法不会自动更新UI。