iOS

自定义消息收发

更新时间: 2024/03/15 16:12:31

如果您的应用需要 SDK 预定义的几种消息类型以外的更多类型(如图文消息和红包消息),可通过自定义消息实现。

功能介绍

自定义消息附件的原型是NIMCustomObject类。SDK 只负责发送和接收由其参数attachment序列化和反序列化后的字节流。

在发送端,SDK 将attachment序列化后得到的字节流发送出去;在接收端,SDK 读取字节流,并通过您设置的反序列化对象进行解析。

参数 类型 说明
attachment id<NIMCustomAttachment> 用户自定义的附件类封装,需要实现NIMCustomAttachmentencodeAttachment方法。在发送自定义消息时将自定义附件对象赋值到这个参数。SDK 负责透传attachmentencodeAttachment接口序列化后的结果

前提条件

  • 已完成 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 相关文档:实现自定义消息收发

此文档是否对你有帮助?
有帮助
去反馈
  • 功能介绍
  • 前提条件
  • 实现流程
  • 序列化与发送
  • 步骤1:创建商品信息消息封装类
  • 步骤2:发送商品信息消息
  • 反序列化与接收
  • 步骤1:创建自定义消息反序列解码类
  • 步骤2:注册自定义消息的解析器
  • 步骤3:接收自定义消息
  • 参考文档