浏览 SDKs · iOS
平台
SDKsiOS商业版

修改消息

使用 OpenIM iOS SDK 修改已发送消息的内容。

复制

调用修改消息接口可以在会话中编辑一条已发送的历史消息内容。它和删除消息与撤回消息不同:删除操作仅影响当前账号侧的消息可见性,撤回会将消息展示为撤回占位符;修改则直接替换消息的正文内容并多端同步。

修改消息内容

if (message.textElem == nil || editedText.length == 0) {
    return;
}

NSString *previousText = message.textElem.content;
message.textElem.content = editedText;

[[OIMManager manager]
    modifyMessageWithConversationID:conversationID
                            message:message
                          onSuccess:^(NSString * _Nullable data) {
        // 修改成功,刷新本地界面展示
        [self replaceMessage:message
              conversationID:conversationID
                 clientMsgID:message.clientMsgID];
    }
                          onFailure:^(NSInteger code, NSString * _Nullable errorMessage) {
        // 失败时回滚本地编辑内容
        message.textElem.content = previousText;
        [self showModifyError:code message:errorMessage ?: @"修改消息失败"];
    }];

参数说明

参数类型是否必填说明
conversationIDNSString *必填消息所属的会话 ID。
messageOIMMessageInfo *必填包含修改后内容的完整消息对象;必须保留原有的 clientMsgID 与路由属性。

修改消息并非增量字段更新。应以本地当前完整的消息对象为基础修改目标属性,并严格保留原有的 clientMsgID、会话类型、发送者、发送时间和其余元素。允许修改的消息类型、可编辑时间窗口及权限由服务端校验;调用失败时应恢复原状,不可擅自在本地保留编辑结果。

返回结果

  • 成功回调仅表示当前修改请求已被服务端接受。客户端状态合并标识为 clientMsgID(必要时同时限定 conversationID)。
  • 调用成功不代表所有其他在线客户端的 UI 已瞬时刷新。其他客户端通过消息修改事件接收最新的消息对象并合并状态。

监听消息修改事件

其他成员或本端其他设备收到消息修改通知时,由 OIMAdvancedMsgListener 协议的方法派发:

- (void)onMessageModified:(OIMMessageInfo *)message {
    if (message.clientMsgID.length == 0) {
        return;
    }

    NSString *conversationID = [self conversationIDForMessage:message];
    // 依据 clientMsgID 替换已有消息
    [self replaceMessage:message
          conversationID:conversationID
             clientMsgID:message.clientMsgID];
}

事件回调中返回修改后的完整 OIMMessageInfo 对象。本地数据层应根据 clientMsgID 查找到对应的缓存项并整体替换,避免通过数组索引直接覆盖。监听器的注册与生命周期管理见接收消息。

相关页面