跳转至

会话界面

除了融云 SDK 中内置的消息类型,开发者也可以自定义消息。

注意

自定义消息的显示,需要完成以下五步:

  1. 定义消息类型

  2. 注册消息类型

  3. 定义消息 Cell

  4. 注册消息 Cell

  5. 发送消息

融云的开源项目 SealTalk 中,有自定义消息的例子,RCDTestMessage 和对应的 cell,可以作为参考。

定义消息类型

开发者需要继承 RCMessageContent 实现自定义消息类,并在 SDK 初始化之后,注册自定义消息。

RCMessageContent 是消息内容类,是所有消息的基类。继承此类,并实现其中的协议,来实现自定义消息。

RCMessageContent 主要有三个协议:

协议 说明 是否需要实现
RCMessageCoding 编解码协议 必须
RCMessagePersistentCompatible 存储协议 必须
RCMessageContentView 内容摘要协议 可选

其中,RCMessageCoding 主要有三个功能:提供消息唯一标识符、消息发送时将消息中的所有信息编码为 JSON 数据传输、消息接收时将 JSON 数据解码还原为消息对象。

RCMessagePersistentCompatible 用于确定消息内容的存储策略,指明此消息类型在本地是否存储、是否计入未读消息数,说明如下:

枚举值 说明 是否 UI 显示
MessagePersistent_NONE 在本地不存储,不计入未读数。 不显示
MessagePersistent_ISCOUNTED 表示客户端收到消息后,要进行存储并计入未读消息计数(未读消息数增加 1),所有内容型消息都应该设置此值。非内容类消息暂不支持消息计数。 显示
MessagePersistent_ISPERSISTED 表示客户端收到消息后,要进行存储,不计入未读消息数,并在之后可以通过接口查询。 显示
MessagePersistent_STATUS 在本地不存储,不计入未读数,并且如果对方不在线,服务器会直接丢弃该消息,对方如果之后再上线也不会再收到此消息(聊天室类型除外,此类消息聊天室会视为普通消息)。 不显示

RCMessageContentView 用于在会话列表和本地通知中显示消息的摘要。 通过继承 RCMessageContent实现其中的协议,将消息内容编解码为 JSON 数据,即可实现存放任何数据的消息。

编解码协议

/*!
 消息内容的编解码协议

 @discussion 用于标示消息内容的类型,进行消息的编码和解码。
 所有自定义消息必须实现此协议,否则将无法正常传输和使用。
 */
@protocol RCMessageCoding <NSObject>

将消息内容序列化,编码成为可传输的json数据

参数 类型 说明
返回值 NSData 可传输的json数据
/*!
 @discussion 消息内容通过此方法,将消息中的所有数据,编码成为json数据,返回的json数据将用于网络传输。
 */
- (NSData *)encode;

将json数据的内容反序列化,解码生成可用的消息内容

参数 类型 说明
data NSData 消息中的原始json数据
/*!
 @discussion 网络传输的json数据,会通过此方法解码,获取消息内容中的所有数据,生成有效的消息内容。
 */
- (void)decodeWithData:(NSData *)data;

消息的类型名

参数 类型 说明
返回值 NSString 消息的类型名
+ (NSString *)getObjectName;

注意

  1. 定义的消息类型名,需要在各个平台上保持一致,以保证消息互通。
  2. 请勿使用 RC: 开头的类型名,以免和SDK默认的消息名称冲突

存储协议

/*!
 消息内容的存储协议

 @discussion 用于确定消息内容的存储策略。
 所有自定义消息必须实现此协议,否则将无法正常存储和使用。
 */
@protocol RCMessagePersistentCompatible <NSObject>

消息的存储策略

参数 类型 说明
返回值 RCMessagePersistent 消息的存储策略
/*!
 @discussion 指明此消息类型在本地是否存储、是否计入未读消息数。
 */
+ (RCMessagePersistent)persistentFlag;

内容摘要协议

/*!
 消息内容摘要的协议

 @discussion 用于在会话列表和本地通知中显示消息的摘要。
 */
@protocol RCMessageContentView

会话列表和本地通知中显示的消息内容摘要

参数 类型 说明
返回值 NSString 会话列表和本地通知中显示的消息内容摘要
/*!
 @discussion 如果您使用IMKit,当会话的最后一条消息为自定义消息时,需要通过此方法获取在会话列表展现的内容摘要;
 当App在后台收到消息时,需要通过此方法获取在本地通知中展现的内容摘要。
 */
- (NSString *)conversationDigest;

注册消息类型

在实现了上面的自定义消息类后,您需要在 SDK 初始化之后,注册该自定义消息类。只有注册了该消息类型之后,SDK 才能识别和编码、解码该类型的消息。

// RCIM.h

/*!
注册自定义的消息类型

@param messageClass    自定义消息的类,该自定义消息需要继承于RCMessageContent
@discussion 如果您需要自定义消息,必须调用此方法注册该自定义消息的消息类型,否则SDK将无法识别和解析该类型消息。
@warning 如果您使用IMKit,请使用此方法注册自定义的消息类型;
如果您使用IMLib,请使用RCIMClient中的同名方法注册自定义的消息类型,而不要使用此方法。
*/
- (void)registerMessageType:(Class)messageClass;

定义消息 cell

IMKit 消息 cell 都继承自 RCMessageBaseCellRCMessageCell 是在继承 RCMessageBaseCell 的基础上增加显示头像和昵称。 自定义消息 cell 可以根据业务场景选择继承于 RCMessageCell 或者 RCMessageBaseCell

RCMessageCell 结构图:

image

RCMessageBaseCell 结构图:

image

自定义消息 cell 继承于 RCMessageCell

控件需要添加在 messageContentView 上,根据您自己的需求在画 cell 视图布局的时候调整 messageContentViewframe ,如果是接收方,您只需要修改 messageContentViewwidthheight,如果是发送方,您需要修改 messageContentViewxwidthheight

自定义消息 cell 继承于 RCMessageBaseCell

控件需要添加在 baseContentView 上,建议在 baseContentView 上方预留 10

请在初始化方法中实现 cell 的布局,并重写下面方法来返回 cellSize

/*!
 自定义消息 Cell 的 Size

 @param model               要显示的消息model
 @param collectionViewWidth cell所在的collectionView的宽度
 @param extraHeight         cell内容区域之外的高度

 @return 自定义消息Cell的Size

 @discussion 当应用自定义消息时,必须实现该方法来返回cell的Size。
 其中,extraHeight是Cell根据界面上下文,需要额外显示的高度(比如时间、用户名的高度等)。
 一般而言,Cell的高度应该是内容显示的高度再加上extraHeight的高度。
 */
+ (CGSize)sizeForMessageModel:(RCMessageModel *)model
      withCollectionViewWidth:(CGFloat)collectionViewWidth
         referenceExtraHeight:(CGFloat)extraHeight;

提示

extraHeight 就是上面 cell 结构图中红色箭头的总高度, 返回的 cell 的 size 的高 等于 图中标注的 height + extraHeight ,size 的宽就是 collectionViewWidth

注册消息 cell

在会话界面为自定义消息注册自定义消息 cell:

//RCConversationViewController.h
/*!
 注册自定义消息的 cell

 @param cellClass 自定义cell的类,该自定义消息需要继承于RCMessageCell或者RCMessageBaseCell
 @param messageClass 自定义消息的类继承于 RCMessageContent

 @discussion 你需要在cell中重写RCMessageBaseCell基类的sizeForMessageModel:withCollectionViewWidth:referenceExtraHeight:来计算cell的高度。
 */
- (void)registerClass:(Class)cellClass forMessageClass:(Class)messageClass;

发送消息

完成了自定义消息和 cell 的定义与注册后,调用 RCIMsendMessage 方法,来发送自定义消息。

注意

  1. 如果是 server 端来发送,须定义同样的消息类型。
  2. 自定义的消息,需要您自己设置 pushContent 来定义推送内容,否则将不会进行远程推送。