自定义消息收发
更新时间: 2024/03/15 16:12:31
如果您的应用需要 SDK 预定义的几种消息类型以外的更多类型(如图文消息和红包消息),可通过自定义消息实现。
功能介绍
自定义消息附件的原型是NIMCustomObject
类。SDK 只负责发送和接收由其参数attachment
序列化和反序列化后的字节流。
在发送端,SDK 将attachment
序列化后得到的字节流发送出去;在接收端,SDK 读取字节流,并通过您设置的反序列化对象进行解析。
参数 | 类型 | 说明 |
---|---|---|
attachment | id<NIMCustomAttachment> |
用户自定义的附件类封装,需要实现NIMCustomAttachment 的encodeAttachment 方法。在发送自定义消息时将自定义附件对象赋值到这个参数。SDK 负责透传attachment 经encodeAttachment 接口序列化后的结果 |
前提条件
- 已完成 SDK 初始化。
- (如发送的为群聊消息)已创建群组。
实现流程
本节以发送一条商品信息(含商品名与链接)消息为例,介绍自定义消息的序列化与发送流程。
您也可以参照 视频教程:自定义消息集成 了解实现方法。
序列化与发送
步骤1:创建商品信息消息封装类
objc// Attachment.h
@interface Attachment : NSObject<NIMCustomAttachment>
// 商品名
@property (nonatomic,copy) NSString *goodsName;
// 商品链接
@property (nonatomic,copy) NSString *goodsURL;
@end
// Attachment.m
@implementation Attachment
// 实现 NIMCustomAttachment 的 encodeAttachment 方法
- (NSString *)encodeAttachment
{
// 商品信息内容以字典封装
NSDictionary *dict = @{
@"goodsName" : self.goodsName,
@"goodsURL" : self.goodsURL,
};
// 进一步序列化得到 content 并返回
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:0 error:nil];
NSString *content = nil;
if (jsonData) {
content = [[NSString alloc] initWithData:jsonData
encoding:NSUTF8StringEncoding];
}
return content;
}
@end
此外,NIMCustomAttachment
还提供附件上传下载相关接口,详见API 参考。
步骤2:发送商品信息消息
objc// 构造出具体会话,以发给用户user为例
NIMSession *session = [NIMSession session:@"user" type:NIMSessionTypeP2P];
// 构造自定义消息附件
NIMCustomObject *object = [[NIMCustomObject alloc] init];
Attachment *attachment = [[Attachment alloc] init];
object.attachment = attachment;
// 构造出具体消息并注入附件
NIMMessage *message = [[NIMMessage alloc] init];
message.messageObject = object;
// 错误反馈对象
NSError *error = nil;
// 发送消息
[[NIMSDK sharedSDK].chatManager sendMessage:message toSession:session error:&error];
反序列化与接收
从本地数据库中读取自定义消息与接收方收到自定义消息等情况下,都需要解析数据才能获取自定义消息附件的具体内容。
步骤1:创建自定义消息反序列解码类
objc// CustomAttachmentDecoder.h
@interface CustomAttachmentDecoder : NSObject<NIMCustomAttachmentCoding>
@end
// CustomAttachmentDecoder.m
@implementation CustomAttachmentDecoder
// 所有的自定义消息都会调用这个解码方法,如有多种自定义消息请在该方法中扩展,并自行实现自定义消息类型判断和版本兼容。
- (id<NIMCustomAttachment>)decodeAttachment:(NSString *)content{
id<NIMCustomAttachment> attachment;
NSData *data = [content dataUsingEncoding:NSUTF8StringEncoding];
if (data) {
NSDictionary *dict = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil];
if ([dict isKindOfClass:[NSDictionary class]]) {
NSString *goodsName = dict[@"goodsName"];
NSString *goodsURL = dict[@"goodsURL"];
Attachment *myAttachment = [[Attachment alloc] init];
myAttachment.goodsName = goodsName;
myAttachment.goodsURL = goodsURL;
attachment = myAttachment;
}
}
return attachment;
}
@end
步骤2:注册自定义消息的解析器
在 - (BOOL)application: didFinishLaunchingWithOptions:
中注入解析器。
objc- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
...
// NIM SDK初始化
[NIMCustomObject registerCustomDecoder:[[CustomAttachmentDecoder alloc] init]];
...
}
步骤3:接收自定义消息
接收消息时,需要判断是否是自定义消息,并进一步判断自定义消息类型,然后获取对应的内容。
objcif (message.messageType == NIMMessageTypeCustom) {
NIMCustomObject *object = message.messageObject;
if ([object.attachment isKindOfClass:[Attachment class]]) {
Attachment *attachment = (Attachment *)object.attachment;
// 通过 attachment.goodsName 与 attachment.goodsURL 获取到的内容,在UI上做进一步展示。
...
}
}
参考文档
本文档介绍的是不含 UI 的自定义消息收发实现流程,若需要实现含 UI 的自定义消息收发,请参考 UIKit 相关文档:实现自定义消息收发
此文档是否对你有帮助?