自定义信令
在音视频通话过程中,您可以通过自定义信令功能,在房间内发送自定义消息,用于实现白板、投票、答题等业务场景。
本文介绍如何创建、注册、发送和接收自定义信令。
实现流程
实现自定义信令的完整流程如下:
- 创建信令类:创建一个继承自
RCMessageContent
的自定义消息类,并实现其协议方法。 - 注册信令类:在初始化 SDK 后,向 SDK 注册您自定义的信令类。
- 发送信令:加入房间后,调用
sendRTCMessage
方法在房间内发送信令。 - 接收信令:通过
RCRTCRoomEventDelegate
的didReceiveMessage
代理回调接收房间中的信令。
提示
自定义消息的具体实现请参考如何实现自定义消息。
创建信令类
创建信令类需要继承 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;
参数说明
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
messageClass | Class | 是 | 需要注册的自定义消息类。 |
代码示例
Objective C
// 在初始化 RTCLib SDK 后注册自定义信令类
[[RCCoreClient sharedCoreClient] registerMessageType:yourmessage.class];
发送信令
成功加入房间后,可以调用 RCRTCRoom 的 sendRTCMessage
方法,向房间内的所有用户发送信令。
接口原型
Objective C
- (nullable RCMessage *)sendMessage:(RCMessageContent *)content
success:(nullable void (^)(long messageId))successBlock
error:(nullable void (^)(NSInteger nErrorCode, long messageId))errorBlock;
参数说明
参数 | 类型 | 是否必填 | 说明 |
---|---|---|---|
content | RCMessageContent | 是 | 发送的信令内容,即您自定义的消息类的实例。 |
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;
参数说明
参数 | 类型 | 说明 |
---|---|---|
message | RCMessage | 接收到的消息实体。您可以通过 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);
// 在此处理您的业务逻辑
}
}