跳转至

消息发送

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]

发送消息

提示

当接收方离线并允许远程推送时,会收到远程推送。远程推送中包含两部分内容:

  1. pushContent : 用于显示。

  2. 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;

提示

上传媒体信息上传到自己服务器

  1. appUpload 设置为 YES

  2. 实现 uploadMedia:uploadListener:,需要开发者在回调中上传媒体信息(图片或文件)。

  3. 通过 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;

注意

如需上传图片或文件到自己的服务器,请使用 RCIMClientsendMessage:targetId:content:pushContent:pushData:success:error: 方法或 sendMessage:targetId:content:pushContent:success:error: 方法进行发送,不要使用上述方法。

使用 IMKit,请使用 RCIM 中的同名方法发送消息,RCIMClient 里的方法不会自动更新UI。