修改消息
从 5.26.0 版本开始,IMLib 支持消息修改功能,支持所有存储类型消息(文本、图片(包含 GIF)、语音(高清、普通)、视频、引用、文件、自定义消息)的内容修改。
消息修改
开发者可通过 modifyMessageWithParams:completionHandler: 接口修改消息。
| 参数 | 类型 | 说明 |
|---|---|---|
| params | RCModifyMessageParams | 消息修改参数 |
| completionHandler | Block | 结果回调 |
在接口中,params 是对修改信息的封装 RCModifyMessageParams,其内容如下:
| 参数 | 类型 | 说明 |
|---|---|---|
| messageUId | NSString | 消息唯一 ID |
| messageContent | RCMessageContent | 修改后的消息体 |
RCTextMessage *messageContent = (RCTextMessage *)message.content;
messageContent.content = @"modified_text";
RCModifyMessageParams *params = [[RCModifyMessageParams alloc] init];
params.messageUId = message.messageUId;
params.messageContent = messageContent;
[[RCCoreClient sharedCoreClient] modifyMessageWithParams:params completionHandler:^(RCMessage * _Nonnull message, RCErrorCode code) {
// TODO code
}];
消息修改回调
消息修改后,多端或其他用户会收到消息修改的回调,会通过 RCIMClientReceiveMessageDelegate 协议中的 onMessagesModified: 和 onModifiedMessageSyncCompleted 方法进行回调。
// 在初始化时注册代理。
[[RCCoreClient sharedCoreClient] setReceiveMessageDelegate:self object:nil];
// 在业务逻辑中实现回调方法。
- (void)onMessagesModified:(NSArray<RCMessage *> *)messages {
// 消息被修改。
}
- (void)onModifiedMessageSyncCompleted {
// 每次连接成功后,会同步远端修改信息。
}
刷新引用消息
开发者可通过 refreshReferenceMessageWithParams:localMessageBlock:remoteMessageBlock:errorBlock: 接口刷新引用消息。
| 参数 | 类型 | 说明 |
|---|---|---|
| params | RCRefreshReferenceMessageParams | 消息修改参数 |
| localMessageBlock | Block | 本地结果回调 |
| remoteMessageBlock | Block | 远端结果回调 |
| errorBlock | Block | 错误回调 |
在接口中,params 是对刷新信息的封装 RCRefreshReferenceMessageParams,其内容如下:
| 参数 | 类型 | 说明 |
|---|---|---|
| messageUIds | NSArray | 消息唯一 ID 列表,最多 20 个 |
| conversationIdentifier | RCConversationIdentifier | 会话标识 |
RCRefreshReferenceMessageParams *params = [[RCRefreshReferenceMessageParams alloc] init];
RCConversationIdentifier *identifier = [[RCConversationIdentifier alloc] init];
identifier.type = message.conversationType;
identifier.targetId = message.targetId;
identifier.channelId = message.channelId;
params.conversationIdentifier = identifier;
params.messageUIds = @[message.messageUId];
params.messageContent = messageContent;
[[RCCoreClient sharedCoreClient] refreshReferenceMessageWithParams:params
localMessageBlock:^(NSArray<RCMessageResult *> * _Nonnull results) {
// TODO 本地消息
} remoteMessageBlock:^(NSArray<RCMessageResult *> * _Nonnull results) {
// TODO 远端消息
} errorBlock:^(RCErrorCode code) {
// TODO 错误处理
}];
消息修改草稿
SDK 从 5.28.0 版本开始提供该接口。
当用户修改已发送的消息时,输入框会保留当前要修改的消息内容。为了提升用户体验,SDK 提供了保存、获取、清除会话草稿的能力,确保用户在切换会话或退出应用后能够恢复编辑状态。
保存消息修改草稿
您可以使用 saveEditedMessageDraft:identifier:completion: 方法保存当前会话中消息修改草稿的最新内容。当用户暂时离开编辑界面时,可以保存草稿以便后续恢复。
接口原型
- (void)saveEditedMessageDraft:(RCEditedMessageDraft *)draft
identifier:(RCConversationIdentifier *)identifier
completion:(nullable void(^)(RCErrorCode code))completion;
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
draft | RCEditedMessageDraft | 草稿模型,包含消息 UID 和草稿内容 |
identifier | RCConversationIdentifier | 会话标识,支持单聊、群聊、超级群类型,targetId 为必填参数,channeld 为可选参数 |
completion | Block | 操作完成回调 |
RCEditedMessageDraft 属性说明
| 属性 | 类型 | 说明 |
|---|---|---|
messageUId | NSString | 消息唯 一标识(必填参数),用于标识要编辑的消息 |
content | NSString | 草稿内容(可选参数),用户当前编辑的文本 |
示例代码
// 创建草稿对象
RCEditedMessageDraft *draft = [[RCEditedMessageDraft alloc] init];
draft.content = @"用户正在编辑的内容";
draft.messageUId = @"CP50-A35I-P026-DHHT";
// 创建会话标识(以单聊为例)
RCConversationIdentifier *identifier = [[RCConversationIdentifier alloc] init];
identifier.type = ConversationType_PRIVATE;
identifier.targetId = @"user_target_id";
// 保存编辑草稿
[[RCCoreClient sharedCoreClient] saveEditedMessageDraft:draft
identifier:identifier
completion:^(RCErrorCode code) {
if (code == RC_SUCCESS) {
NSLog(@"编辑草稿保存成功");
} else {
NSLog(@"编辑草稿保存失败,错误码:%ld", (long)code);
}
}];
获取消息修改草稿
当用户重新进入会话时,您可以使用 getEditedMessageDraft:completion: 方法获取已保存的消息草稿内容,以便恢复用户的编辑状态。
接口原型
- (void)getEditedMessageDraft:(RCConversationIdentifier *)identifier
completion:(nullable void(^)(RCErrorCode code, RCEditedMessageDraft * _Nullable draft))completion;
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
identifier | RCConversationIdentifier | 会话标识,支持单聊、群聊、超级群类型,targetId 为必填参数,channeld 为可选参数 |
completion | Block | 结果回调,返回错误码和草稿对象 |
示例代码
// 创建会话标识(以单聊为例)
RCConversationIdentifier *identifier = [[RCConversationIdentifier alloc] init];
identifier.type = ConversationType_PRIVATE;
identifier.targetId = @"user_target_id";
// 获取编辑草稿
[[RCCoreClient sharedCoreClient] getEditedMessageDraft:identifier completion:^(RCErrorCode code, RCEditedMessageDraft * _Nullable draft) {
if (code == RC_SUCCESS) {
if (draft) {
// 成功获取草稿,恢复编辑内容
NSLog(@"获取草稿成功,消息 UID:%@,内容:%@", draft.messageUId, draft.content);
// 在 UI 中恢复草稿内容
} else {
NSLog(@"该会话暂无编辑草稿");
}
} else {
NSLog(@"获取编辑草稿失败,错误码:%ld", (long)code);
}
}];
清除消息修改草稿
当用户完成消息编辑或不再需要已保存的草稿时,您可以使用 clearEditedMessageDraft:completion 方法清除消息修改草稿,释放存储空间。
接口原型
- (void)clearEditedMessageDraft:(RCConversationIdentifier *)identifier
completion:(nullable void(^)(RCErrorCode code))completion;
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
identifier | RCConversationIdentifier | 会话标识,支持单聊、群聊、超级群类型,targetId 为必填参数,channeld 为可选参数 |
completion | Block | 结果回调,返回错误码 |
示例代码
// 创建会话标识(以单聊为例)
RCConversationIdentifier *identifier = [[RCConversationIdentifier alloc] init];
identifier.type = ConversationType_PRIVATE;
identifier.targetId = @"user_target_id";
// 清除编辑草稿
[[RCCoreClient sharedCoreClient] clearEditedMessageDraft:identifier completion:^(RCErrorCode code) {
if (code == RC_SUCCESS) {
NSLog(@"编辑草稿清除成功");
} else {
NSLog(@"编辑草稿清除失败,错误码:%ld", (long)code);
}
}];