即使您之前有自定义消息,升级2.7.1及以下版本后不想修改方式,仍然可根据之前的逻辑处理,SDK兼容之前的版本。
即使您使用的是2.7.1日后的版本,请根据详细流程里的方式来做(注:融云的开源项目SealTalk中,有自定义消息的举例,RCDTestMessage和对应的cell,可以成为参考。)
您必须继承RCMessageContent实现自定义消息类,并在SDK初始化以后,注册自定义消息。
RCMessageContent是消息内容类,是所有消息的基类。您可以继承这些,并推动其中的协议,来推动自定义消息。
RCMessageContent主要有三个协议:
其中,RCMessageCoding主要有三个用途:提供消息唯一标志符、消息发送时将消息中的所有信息编码为JSON数据存储、消息接收时将JSON数据解码还原为消息对象。
RCMessagePersistentCompatible用于确认消息内容的传输思路,指明此消息类别在本地能否存储、是否计入未读消息数,说明如下:
枚举值说明
MessagePersistent_NONE
在本地不存储,不计入未读数。
MessagePersistent_ISCOUNTED
表示客户端收到消息后,要进行存储并计入未读消息计数(未读消息数减少1),所有内容型消息都需要修改此值。非内容类消息暂不支持消息计数。
MessagePersistent_ISPERSISTED
表示客户端收到消息后,要进行存储,不计入未读消息数,并在以后可以借助接口查询。
MessagePersistent_STATUS
在本地不存储,不计入未读数,并且即使别人不,服务器会直接抛弃该消息,对方既然以后再上线也不会再收到此消息(类别除外,此类消息会视为普通消息)。
RCMessageContentView用于在会话列表和本地通知中显示消息的摘要。您可以借助继承RCMessageContent实现其中的协议,将您的消息内容编解码为JSON数据,即可实现存放任何数据的消息。

// RCMessageContent Class
/*!
消息内容的编解码协议
@discussion 用于标示消息内容的类型,进行消息的编码和解码。
所有自定义消息必须实现此协议,否则将无法正常传输和使用。
*/
@protocol RCMessageCoding <NSObject>
@required
/*!
将消息内容序列化,编码成为可传输的json数据
@discussion 消息内容通过此方法,将消息中的所有数据,编码成为json数据,返回的json数据将用于网络传输。
*/
- (NSData *)encode;
/*!
将json数据的内容反序列化,解码生成可用的消息内容
@param data 消息中的原始json数据
@discussion 网络传输的json数据,会通过此方法解码,获取消息内容中的所有数据,生成有效的消息内容。
*/
- (void)decodeWithData:(NSData *)data;
/*!
返回消息的类型名
@return 消息的类型名
@discussion 您定义的消息类型名,需要在各个平台上保持一致,以保证消息互通。
@warning 请勿使用@"RC:"开头的类型名,以免和SDK默认的消息名称冲突
*/
+ (NSString *)getObjectName;
@end
/*!
消息内容的存储协议
@discussion 用于确定消息内容的存储策略。
所有自定义消息必须实现此协议,否则将无法正常存储和使用。
*/
@protocol RCMessagePersistentCompatible <NSObject>
@required
/*!
返回消息的存储策略
@return 消息的存储策略
@discussion 指明此消息类型在本地是否存储、是否计入未读消息数。
*/
+ (RCMessagePersistent)persistentFlag;
@end
/*!
消息内容摘要的协议
@discussion 用于在会话列表和本地通知中显示消息的摘要。
*/
@protocol RCMessageContentView
@optional
/*!
返回在会话列表和本地通知中显示的消息内容摘要
@return 会话列表和本地通知中显示的消息内容摘要
@discussion 如果您使用IMKit,当会话的最后一条消息为自定义消息时,需要通过此方法获取在会话列表展现的内容摘要;
当App在后台收到消息时,需要通过此方法获取在本地通知中展现的内容摘要。
*/
- (NSString *)conversationDigest;
@end
在推动了下面的自定义消息类后,您必须在SDK初始化以后,注册该自定义消息类。只有注册了该消息类型以后,SDK才能辨别和编码、解码该类别的消息。
// RCIM Class
/*!
注册自定义的消息类型
@param messageClass 自定义消息的类,该自定义消息需要继承于RCMessageContent
@discussion 如果您需要自定义消息,必须调用此方法注册该自定义消息的消息类型,否则SDK将无法识别和解析该类型消息。
@warning 如果您使用IMKit,请使用此方法注册自定义的消息类型;
如果您使用IMLib,请使用RCIMClient中的同名方法注册自定义的消息类型,而不要使用此方法。
*/
- (void)registerMessageType:(Class)messageClass;
IMKit消息cell都继承自RCMessageBaseCell,RCMessageCell是在继承RCMessageBaseCell的基础上提高显示头像和名字。自定义消息cell可以按照业务场景选取继承于RCMessageCell或者RCMessageBaseCell。
RCMessageCell:

RCMessageBaseCell:

自定义消息cell继承于RCMessageCell
您的控件必须添加在messageContentView上,根据您自己的需求在画cell视图布局的之后微调messageContentView的frame,如果是接收方,您只应该设置messageContentView的width和height,如果是发送方,您必须设置messageContentView的x,width和height
自定义消息cell继承于RCMessageBaseCell
您的控件必须添加在baseContentView上,建议在baseContentView上方预留10
请在初始化方式中推动cell的布局,并重写上面步骤来返回cell的Size:
/*!
自定义消息 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和消息:
//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的定义与注册后,调用RCIM的sendMessage方法,来发送自定义消息。如果是server端来发送,须定义相同的消息类别。请留意,自定义的消息,需要您自己设定pushContent来定义推送内容,否则将不会进行远程推送。
融云SDK的IM红包功能是由一路魔方技术提供的服务,集成模式请查看
到下载融云动态表情SDK,将RongSticker文件夹拖入项目中即可,融云自制表情SDK依赖于IMKit。
关于表情自定义
即使您想自定义其他表情,详细查看。
从SDK2.8.29版本开始支持小视频功能,详细查看
从2.6.8版本开始,群组中支持@功能,满足您@指定客户或@所有人的需求,在RCIM.h中借助修改enableMessageMentioned开启@消息功能,默认为关闭状况。
//RCIM Class
/*!
是否开启消息@提醒功能(只支持群组),默认值是 NO。
*/
@property(nonatomic, assign) BOOL enableMessageMentioned;
RCIM.h中定义了提供@选择客户展现的群组成员数据的代理,需要推动如下代理,提供数据给选择客户的列表。
//RCIM Class
/*!
群组成员列表提供者
*/
@protocol RCIMGroupMemberDataSource <NSObject>
@optional
/*!
获取当前群组成员列表的回调
@param groupId 群ID
@param resultBlock 获取成功 [userIdList:群成员ID列表]
*/
- (void)getAllMembersOfGroup:(NSString *)groupId
result:(void (^)(NSArray<NSString *> *userIdList))resultBlock;
@end
通过修改RCMentionInfo中的RCMentionedType实现@所有人的功能,RCMentionInfo定义如下:(注sendmessage)
//RCMentionedInfo Class
/*!
消息中的 @ 提醒信息
*/
@interface RCMentionedInfo : NSObject
/*!
@提醒的类型,设置 @ 指定用户,还是 @ 所有人
*/
@property(nonatomic, assign) RCMentionedType type;
/*!
@的用户ID列表
@discussion 如果 type 是 @所有人,则可以传 nil
*/
@property(nonatomic, strong) NSArray *userIdList;
/*!
包含 @ 提醒的消息,本地通知和远程推送显示的内容
*/
@property(nonatomic, strong) NSString *mentionedContent;
/*!
初始化 @ 提醒信息
@param type @提醒的类型
@param userIdList @的用户 ID 列表
@return @提醒信息的对象
*/
- (instancetype)initWithMentionedType:(RCMentionedType)type
userIdList:(NSArray *)userIdList
mentionedContent:(NSString *)mentionedContent;
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/bofangqi/article-121563-6.html
宝宝