自定义消息类型
除了使用 SDK 内置消息外,还可以创建自定义消息类型。
您需要根据业务需求来选择自定义消息类型继承的消息基类:
RCMessageContent
,即普通类型消息内容。例如在 SDK 内置消息类型中的文本消息和位置消息。RCMediaMessageContent
,即多媒体类型消息。多媒体类型消息内容继承自RCMessageContent
,并在其基础上增加了对多媒体文件的处理逻辑。在发送和接收消息时,SDK 会判断消息类型是否为多媒体类型消息,如果是多媒体类型,则会触发上传或下载多媒体文件流程。
关于消息实体类与消息内容的更多介绍,可参见消息介绍。
创建自定义消息类型
自定义消息类型类遵守下面三个协议:
- 编解码协议(必须遵守):
RCMessageCoding
指定消息类型名称、消息收发过程中的编码与解码行为,以及提供消息搜索所需的关键词。该协议是所有自定义消息类型必须实现的协议,否则将无法正常传输和使用。 - 存储协议(必须遵守):
RCMessagePersistentCompatible
指定此消息类型在客户端与服务端是否计入未读消息数、是否存储的行为。 - 内容摘要协议(非必须遵守):
RCMessageContentView
设置如何显示该类型消息的摘要。
编解码协议
提示
任何自定义消息类型都必须实现 RCMessageCoding
协议,否则将无法正常传输和使用。
协议原型:
@protocol RCMessageCoding <NSObject>
编解码协议(RCMessageCoding
)主要有以下功能:
- 提供该自定义消息类型的唯一 ID。
- 在消息发送时,将消息中的所有信息编码为 JSON 数据传输。
- 在消息接收时,将 JSON 数据解码还原为消息对象。
- 提供消息搜索数 据。
遵守编解码协议需实现下面的方法:
-
序列化:消息内容通过此方法,将消息中的所有数据,编码成为 JSON 数据,返回的 JSON 数据将用于网络传输。
- (NSData *)encode;
-
反序列化:网络传输的 JSON 数据,会通过此方法解码,获取消息内容中的所有数据,生成有效的消息内容。
- (void)decodeWithData:(NSData *)data;
-
定义消息类型名:定义的消息类型名,需要在各个平台上保持一致,否则消息无法互通。为避免和 SDK 默认的消息类型名称冲突,请勿使用
RC:
开头的类型名。+ (NSString *)getObjectName;
-
提供消息搜索数据:如果需要自定义消息需要被搜索,需要将关键字返回。如果不需要被搜索,可直接返回 nil。
- (NSArray<NSString *> *)getSearchableWords;
存储协议
存储协议(RCMessagePersistentCompatible
)为必须遵守的协议。
协议原型:
@protocol RCMessagePersistentCompatible <NSObject>
存储协议主要有两个功能:
- 指明此消息类型在本地和服务端是否存储
- 指明此消息类是否计入未读消息数
遵守存储协议需实现控制消息的存储计数策略的方法:
+ (RCMessagePersistent)persistentFlag;
persistentFlag 属性说明 | 客户端是否存储 | 服务端是否存储 | 是否计入消息未读数 |
---|---|---|---|
MessagePersistent_NONE | 客户端不存储 | 支持离线消息?机制 | 不计入未读消息数 |
MessagePersistent_ISCOUNTED | 客户端存储 | 支持离线消息?机制,且存入服务端历史消息 | 计入未读消息数 |
MessagePersistent_ISPERSISTED | 客户端存储 | 支持离线消息?机制,且存入服务端历史消息 | 不计入未读消息数 |
MessagePersistent_STATUS | 客户端不存储 | 服务端不存储 | 不计入未读消息数 |
提示
MessagePersistent_NONE
一般用于需要确保收到,但不需要展示的消息,例如运营平台向终端发送的指令信息。如果消息接收方不在线,再次上线时可通过离线消息收到。MessagePersistent_STATUS
用于状态消息。状态消息表示的是即时的状态,例如输入状态。因为状态消息在客户端与服务端均不会存储,如果接收方不在线,则无法再收到该状态消息。
内容摘要协议
内容摘要协议(RCMessageContentView
)为非必须遵守的协议。
协议原型:
@protocol RCMessageContentView
消息的内容摘要显示在以下几处:
- 在会话列表中
- 本地通知中
遵守内容摘要协议需实现设置消息摘要的方法:
- (NSString *)conversationDigest;