跳到主要内容

自定义信令

在音视频通话过程中,您可以通过自定义信令功能,在房间内发送自定义消息,用于实现白板、投票、答题等业务场景。

本文介绍如何创建、注册、发送和接收自定义信令。

实现流程

实现自定义信令的完整流程如下:

  1. 创建信令类:创建一个继承自 RCMessageContent 的自定义消息类,并实现其协议方法。
  2. 注册信令类:在初始化 SDK 后,向 SDK 注册您自定义的信令类。
  3. 发送信令:加入房间后,调用 sendRTCMessage 方法在房间内发送信令。
  4. 接收信令:通过 RCRTCRoomEventDelegatedidReceiveMessage 代理回调接收房间中的信令。
提示

自定义消息的具体实现请参考如何实现自定义消息

创建信令类

创建信令类需要继承 RongIMLibCore 库中的 RCMessageContent 类,并实现以下方法。这些方法定义了消息的序列化、反序列化、存储策略和唯一标识。

代码示例

Objective C
- (NSData *)encode {
NSData *data = [NSJSONSerialization dataWithJSONObject:self.whiteBoardDict
options:NSJSONWritingPrettyPrinted
error:nil];
return data;
}

- (void)decodeWithData:(NSData *)data {
if (data) {
self.messageDict = [NSJSONSerialization JSONObjectWithData:data
options:NSJSONReadingMutableContainers
error:nil];
}
}

+ (RCMessagePersistent)persistentFlag {
// 必须为 MessagePersistent_STATUS 的状态消息,否则会导致消息发送失败
return MessagePersistent_STATUS;
}

+ (NSString *)getObjectName {
return @"唯一的消息 Key 值";
}

注册消息

在发送和接收前,必须向 SDK 注册您自定义的消息。建议在 didFinishLaunchingWithOptions 中,初始化 IM SDK 后立即注册。

接口原型

Objective C
- (void)registerMessageType:(Class)messageClass;

参数说明

参数类型是否必填说明
messageClassClass需要注册的自定义消息类。

代码示例

Objective C

// 在初始化 RTCLib SDK 后注册自定义信令类
[[RCCoreClient sharedCoreClient] registerMessageType:yourmessage.class];

发送信令

成功加入房间后,可以调用 RCRTCRoomsendRTCMessage 方法,向房间内的所有用户发送信令。

接口原型

Objective C
- (nullable RCMessage *)sendMessage:(RCMessageContent *)content
success:(nullable void (^)(long messageId))successBlock
error:(nullable void (^)(NSInteger nErrorCode, long messageId))errorBlock;

参数说明

参数类型是否必填说明
contentRCMessageContent发送的信令内容,即您自定义的消息类的实例。
successBlock(void (^)(long messageId))发送成功的回调。messageId 为消息的唯一 ID。
errorBlock(void (^)(RCErrorCode nErrorCode, long messageId))发送失败的回调。nErrorCode 为错误码,messageId 为消息的唯一 ID。

返回值

类型说明
RCMessage发送的消息实体。如果发送失败,可能返回 nil

代码示例

Objective C
[self.room sendMessage:message
success:^(long messageId) {}
error:^(RCErrorCode nErrorCode, long messageId) {

}];

接收信令

设置房间事件代理 RCRTCRoomEventDelegate 后,可通过 didReceiveMessage: 回调接收房间内其他用户发送的信令。

接口原型

Objective C
- (void)didReceiveMessage:(RCMessage *)message;

参数说明

参数类型说明
messageRCMessage接收到的消息实体。您可以通过 message.content 获取具体的信令内容。

代码示例

Objective C
#import <RongRTCLib/RongRTCLib.h>

// 设置代理
self.room.delegate = self;

#pragma mark - RCRTCRoomEventDelegate

- (void)didReceiveMessage:(RCMessage *)message {
NSLog(@"接收到一条消息,类型为: %@", message.objectName);

if ([message.content isKindOfClass:[WhiteBoardMessage class]]) {
WhiteBoardMessage *whiteBoardMessage = (WhiteBoardMessage *)message.content;
NSLog(@"接收到白板信令: %@", whiteBoardMessage.whiteBoardDict);
// 在此处理您的业务逻辑
}
}