消息更新
更新时间: 2024/09/26 11:47:03
NetEase IM SDK(以下简称 NIM SDK)支持消息更新功能。
功能简介
在部分涉及状态迁移的场景下,需要变更消息内容以满足业务场景需要,否则就需要多条消息来管理相关业务流程。为了控制消息量以及提升沟通效率,云信 IM 自 V10.4.0 起支持消息更新功能,用于消息内容的二次编辑。
您可以将消息更新功能用于以下场景:
- 协同办公场景:团队成员之间更新项目进展,调整项目计划,可以直接调整原始消息内容二次更新,减少消息量,明确管理整个项目进展。
- 客户场景:客服成员在解答完客户问题或给出相应解决方案后,更新相关消息,例如订单状态更新,发货流程进展更新。
- 文件消息场景:原始文件内容更新,可以通知接受成员同步更新文件。
技术原理
对于会话中 已发送成功 的消息,会话参与者可以对消息做二次修改,修改成功后会同步给会话的所有参与者。
- 单聊会话:只有发送者可以对已发送成功的消息进行二次编辑,更新成功后,同步给消息接受方。
- 群聊会话:只有消息发送者和群主可以对已发送成功的消息进行二次编辑,更新成功后,同步给群组所有成员。
消息体中只有以下字段支持更新:
subType
:自定义消息子类型text
:消息文本内容attachment
:消息附件serverExtension
:消息服务端扩展字段
且对于不同消息类型(消息类型不允许修改),部分字段也无法更新,具体如下表所示:
消息类型(V2NIMMessageType ) |
枚举值 | subType |
text |
attachment |
serverExtension |
---|---|---|---|---|---|
V2NIM_MESSAGE_TYPE_TEXT | 0 | ✔️ | ✔️ | ❎ | ✔️ |
V2NIM_MESSAGE_TYPE_IMAGE | 1 | ✔️ | ✔️ | ❎ | ✔️ |
V2NIM_MESSAGE_TYPE_AUDIO | 2 | ✔️ | ✔️ | ❎ | ✔️ |
V2NIM_MESSAGE_TYPE_VIDEO | 3 | ✔️ | ✔️ | ❎ | ✔️ |
V2NIM_MESSAGE_TYPE_LOCATION | 4 | ✔️ | ✔️ | ✔️ | ✔️ |
V2NIM_MESSAGE_TYPE_NOTIFICATION | 5 | ❎ | ❎ | ❎ | ❎ |
V2NIM_MESSAGE_TYPE_FILE | 6 | ✔️ | ✔️ | ❎ | ✔️ |
V2NIM_MESSAGE_TYPE_AVCHAT | 7 | ❎ | ❎ | ❎ | ❎ |
V2NIM_MESSAGE_TYPE_TIPS | 10 | ✔️ | ✔️ | ❎ | ✔️ |
V2NIM_MESSAGE_TYPE_ROBOT | 11 | ❎ | ❎ | ❎ | ❎ |
V2NIM_MESSAGE_TYPE_CALL | 12 | ✔️ | ✔️ | ❎ | ✔️ |
V2NIM_MESSAGE_TYPE_CUSTOM | 100 | ✔️ | ✔️ | ✔️ | ✔️ |
更新时可以配置反垃圾,反垃圾配置可以和原消息不一致。
前提条件
在实现消息更新之前,请确保:
实现消息更新
本文主要介绍 修改单聊场景下的文本消息 为例的消息更新实现过程。
API调用时序
实现流程
以下仅介绍主要步骤,登录以及消息收发等常见步骤省略,具体请参考 登录 IM 和 消息收发。
-
接收方注册消息监听器,监听消息接收和消息更新回调事件。
Android/iOS/Windows/macOS
调用
addMessageListener
方法注册消息监听器,监听消息接收(onReceiveMessages
)和消息更新(onReceiveMessageModified
)回调事件 。示例代码:
Androidjava
V2NIMMessageService v2MessageService = NIMClient.getService(V2NIMMessageService.class); V2NIMMessageListener messageListener = new V2NIMMessageListener() { @Override public void onReceiveMessages(List<V2NIMMessage> messages) { } @Override public void onReceiveMessagesModified(List<V2NIMMessage> messages){ } }; v2MessageService.addMessageListener(messageListener);
iOSobjective-c
[[[NIMSDK sharedSDK] v2MessageService] addMessageListener:listener]; - (void)onReceiveMessages:(NSArray<V2NIMMessage *> *)messages { }; - (void)onReceiveMessagesModified:(NSArray<V2NIMMessage *>)messages { }
Windows/macOScpp
V2NIMMessageListener listener; listener.onReceiveMessages = [](nstd::vector<V2NIMMessage> messages) { // receive messages }; istener.onReceiveMessagesModified = [](nstd::vector<V2NIMMessage> messages) { // update messages }; messageService.addMessageListener(listener);
Web/uni-app/小程序
调用
on("EventName")
方法注册消息监听器,监听消息接收(onReceiveMessages
)和消息更新(onReceiveMessageModified
)回调事件 。示例代码:
Web/uni-app/小程序typescript
nim.V2NIMMessageService.on("onReceiveMessages", function (messages: V2NIMMessage[]) {}); nim.V2NIMMessageService.on("onReceiveMessagesModified", function (messages: V2NIMMessage[]) {});
-
发送方调用
modifyMessage
方法更新已发送成功的消息的内容。本端更新消息成功后,会话参与者以及登录的其他客户端会收到消息更新回调
onReceiveMessagesModified
,回调结果中包含更新的消息列表。示例代码:
Androidjava
String newMessageText = "new message text"; int newSubType = 1; String newServerExtension = "{\"key\":\"value\"}"; boolean clientAntispamEnabled = true; String clientAntispamReplace = "replace text"; V2NIMMessageAntispamConfig antispamConfig = V2NIMMessageAntispamConfig.V2NIMMessageAntispamConfigBuilder.builder() // TODO: 根据实际情况配置 // .withAntispamBusinessId() // .withAntispamCheating() // .withAntispamCustomMessage() // .withAntispamEnabled() // .withAntispamExtension() .build(); V2NIMMessagePushConfig pushConfig = V2NIMMessagePushConfig.V2NIMMessagePushConfigBuilder.builder() // TODO: 根据实际情况配置 // .withContent() // .withForcePush() // .withForcePushAccountIds() // .withForcePushContent() // .withPayload() // .withPushEnabled() // .withPushNickEnabled() .build(); V2NIMMessageRouteConfig routeConfig = V2NIMMessageRouteConfig.V2NIMMessageRouteConfigBuilder.builder() // TODO: 根据实际情况配置 // .withRouteEnabled() // .withRouteEnvironment() .build(); V2NIMModifyMessageParams modifyMessageParams = V2NIMModifyMessageParamsBuilder.builder() .withText(newMessageText) .withSubType(newSubType) .withServerExtension(newServerExtension) //仅支持地理位置消息附件和自定义消息附件的修改 .withAttachment(createLocationMessageAttachment()) .withAntispamConfig(antispamConfig) .withRouteConfig(routeConfig) .withPushConfig(pushConfig) .withClientAntispamEnabled(clientAntispamEnabled) .withClientAntispamReplace(clientAntispamReplace) .build(); V2NIMMessageService v2MessageService = NIMClient.getService(V2NIMMessageService.class); v2MessageService.modifyMessage(getMessage(), modifyMessageParams, new V2NIMSuccessCallback<V2NIMModifyMessageResult>() { @Override public void onSuccess(V2NIMModifyMessageResult v2NIMModifyMessageResult) { if (v2NIMModifyMessageResult.getErrorCode() == 200) { //修改成功 }else{ //修改失败,可能触发的反垃圾 } } }, new V2NIMFailureCallback() { @Override public void onFailure(V2NIMError error) { //修改失败 } });
iOSobjective-c
V2NIMModifyMessageParams *params = [[V2NIMModifyMessageParams alloc] init]; // 更新消息内容 params.text = @"modified text"; // 仅位置消息和自定义消息可以更新附件 params.attachment = modifiedAttachment; // 更新消息的服务器扩展字段 params.serverExtension = @"{\"key\": \"value\"}"; [[NIMSDK sharedSDK].v2MessageService modifyMessage:message params:params success:^(V2NIMModifyMessageResult *result) { // 更新消息成功 } failure:^(V2NIMError *error) { // 更新消息失败 }];
Windows/macOScpp
auto params = V2NIMModifyMessageParams(); messageService.modifyMessage( message, params, [](V2NIMModifyMessageResult result) { // modify message succeeded }, [](V2NIMError error) { // modify message failed, handle error });
Web/uni-app/小程序typescript
let message = nim.V2NIMMessageCreator.createTextMessage("origin text") message = await nim.V2NIMMessageService.sendMessage(message, 'YOUR_CONVERSATION_ID') await nim.V2NIMMessageService.modifyMessage(message, { "text": "modified text" })