自定义消息
提示
- 融云官方 demo 中有自定义消息的示范类,即
RCDTestMessage
类,可以参考该类中的代码实现。 - 自定义消息需要继承
RCMessageContent
,请仔细阅读该头文件中的相关注释。
注册方法¶
参数 | 类型 | 说明 |
---|---|---|
messageClass | Class | 自定义消息的类 |
- (void)registerMessageType:(Class)messageClass;
注意
如果您需要自定义消息,必须调用此方法注册该自定义消息的消息类型,否则 SDK 将无法识别和解析该类型消息。
示范类¶
RCDTestMessage.h¶
// RCDTestMessage.h
#import <RongIMLib/RongIMLib.h>
/*!
测试消息的类型名
*/
#define RCDTestMessageTypeIdentifier @"RCD:TstMsg"
/*!
Demo测试用的自定义消息类
@discussion Demo测试用的自定义消息类,此消息会进行存储并计入未读消息数。
*/
@interface RCDTestMessage : RCMessageContent <NSCoding>
/*!
测试消息的内容
*/
@property(nonatomic, strong) NSString *content;
/*!
测试消息的附加信息
*/
@property(nonatomic, strong) NSString *extra;
/*!
初始化测试消息
@param content 文本内容
@return 测试消息对象
*/
+ (instancetype)messageWithContent:(NSString *)content;
@end
RCDTestMessage.m¶
// RCDTestMessage.m
#import "RCDTestMessage.h"
@implementation RCDTestMessage
///初始化
+ (instancetype)messageWithContent:(NSString *)content {
RCDTestMessage *text = [[RCDTestMessage alloc] init];
if (text) {
text.content = content;
}
return text;
}
///消息是否存储,是否计入未读数
+ (RCMessagePersistent)persistentFlag {
return (MessagePersistent_ISPERSISTED | MessagePersistent_ISCOUNTED);
}
/// NSCoding
- (instancetype)initWithCoder:(NSCoder *)aDecoder {
self = [super init];
if (self) {
self.content = [aDecoder decodeObjectForKey:@"content"];
self.extra = [aDecoder decodeObjectForKey:@"extra"];
}
return self;
}
/// NSCoding
- (void)encodeWithCoder:(NSCoder *)aCoder {
[aCoder encodeObject:self.content forKey:@"content"];
[aCoder encodeObject:self.extra forKey:@"extra"];
}
///将消息内容编码成json
- (NSData *)encode {
NSMutableDictionary *dataDict = [NSMutableDictionary dictionary];
[dataDict setObject:self.content forKey:@"content"];
if (self.extra) {
[dataDict setObject:self.extra forKey:@"extra"];
}
if (self.senderUserInfo) {
NSMutableDictionary *userInfoDic = [[NSMutableDictionary alloc] init];
if (self.senderUserInfo.name) {
[userInfoDic setObject:self.senderUserInfo.name forKeyedSubscript:@"name"];
}
if (self.senderUserInfo.portraitUri) {
[userInfoDic setObject:self.senderUserInfo.portraitUri forKeyedSubscript:@"portrait"];
}
if (self.senderUserInfo.userId) {
[userInfoDic setObject:self.senderUserInfo.userId forKeyedSubscript:@"id"];
}
[dataDict setObject:userInfoDic forKey:@"user"];
}
NSData *data = [NSJSONSerialization dataWithJSONObject:dataDict options:kNilOptions error:nil];
return data;
}
///将json解码生成消息内容
- (void)decodeWithData:(NSData *)data {
if (data) {
__autoreleasing NSError *error = nil;
NSDictionary *dictionary = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error];
if (dictionary) {
self.content = dictionary[@"content"];
self.extra = dictionary[@"extra"];
NSDictionary *userinfoDic = dictionary[@"user"];
[self decodeUserInfo:userinfoDic];
}
}
}
/// 会话列表中显示的摘要
- (NSString *)conversationDigest {
return self.content;
}
///消息的类型名
+ (NSString *)getObjectName {
return RCDTestMessageTypeIdentifier;
}
@end