消息撤回
更新时间: 2024/11/20 15:33:15
NetEase IM SDK(以下简称 NIM SDK) 支持消息撤回,包括单聊消息撤回和群聊消息撤回。
本文介绍如何调用 NIM SDK 的接口实现消息撤回。
- 除通知消息(
Notification
) 类型外,其他消息类型都可被撤回。 - 撤回的消息必须是已发送成功的消息。
支持平台
本文内容适用的开发平台或框架如下表所示:
Android | iOS | macOS/Windows | Web/uni-app/小程序 | Node.js/Electron | HarmonyOS | Flutter |
---|---|---|---|---|---|---|
✔️️️ | ✔️️️ | ✔️️️ | ✔️️️ | ✔️️️ | ✔️️️ | ✔️️️ |
功能描述
云信 IM 支持两种消息撤回类型:单向撤回和双向撤回。
客户端的撤回操作默认是 双向撤回 类型,单向撤回需要通过新版服务端 API 实现,具体请参考 消息撤回。
撤回类型 | 说明 |
---|---|
双向撤回 | 可双向撤回一定时间内(默认 2 分钟,可在云信控制台配置)的单聊消息与群聊消息。撤回之后,消息接收者和发送者都将收到一条消息撤回通知,并删除对应的离线消息、漫游消息和历史消息。 |
单向撤回 | 可以单向撤回 30 天内的单聊消息和高级群消息。撤回之后,消息接收者会收到一条单向撤回的通知,并删除对应的离线消息、漫游消息和历史消息;撤回之后,消息发送者无感知,可以正常使用漫游消息和历史消息。 |
- 若撤回的消息,接收者还未读,那么对于接收者来说,应用内的总未读数会减 1。
- 单聊和群聊消息的撤回功能存在些许区别:
- 单聊:用户只能撤回自己发送的消息。支持撤回自己发送给自己的消息。
- 群聊:普通群成员只能撤回自己发送的消息。客户端 SDK 支持管理员撤回其他群成员的消息(服务端 API 不支持)。
前提条件
-
需要撤回的消息已发送成功,消息发送具体请参考 消息收发。
-
已在控制台开通消息撤回相关功能,具体请参考 配置消息功能。
- 撤回消息覆盖策略(默认不覆盖原始消息的推送)
- 消息撤回时长(默认 2 分钟)
-
已完成 SDK 初始化。
撤回消息
本节以单聊场景的交互为例,介绍消息撤回的实现流程。
API 调用时序
sequenceDiagram
par 步骤 1:发送方注册监听并登录
消息发送方 ->> NIM: 监听消息撤回<br>(addMessageListener)<br>(onMessageRevokeNotifications)
消息发送方 ->> NIM: 登录
end
par 步骤 2:接收方注册监听并登录
消息接收方 ->> NIM: 监听消息接收<br>(addMessageListener)<br>(onReceiveMessages)
消息接收方 ->> NIM: 监听消息撤回<br>(addMessageListener)<br>(onMessageRevokeNotifications)
消息接收方 ->> NIM: 登录
end
par 步骤 3:发送消息
消息发送方 ->> NIM: 构建消息<br>(createTextMessage)
消息发送方 ->> NIM: 发送消息<br>(sendMessage)
NIM ->> 消息接收方:投递消息
end
par 步骤 4:撤回消息
消息发送方 ->> NIM: 撤回消息<br>(revokeMessage)
NIM ->> 消息发送方: 投递撤回通知
NIM ->> 消息接收方: 投递撤回通知
end
实现流程
以下仅介绍主要步骤,登录,消息发送等常见步骤省略,具体请参考 登录 IM 和 消息收发 文档。
-
消息发送者和接收者在登录 IM 前监听消息撤回回调事件,消息接收者还需监听消息接收回调事件。
Android/iOS/macOS/Windows
调用
addMessageListener
方法注册消息监听器,监听消息撤回回调事件onMessageRevokeNotifications
和消息接收回调事件onReceiveMessages
。Androidjava
V2NIMMessageService v2MessageService = NIMClient.getService(V2NIMMessageService.class); V2NIMMessageListener messageListener = new V2NIMMessageListener() { @Override public void onMessageRevokeNotifications(List<V2NIMMessageRevokeNotification> revokeNotifications) { } @Override public void onReceiveMessages(List<V2NIMMessage> messages) { } }; v2MessageService.addMessageListener(messageListener);
iOSobjective-c
[[[NIMSDK sharedSDK] v2MessageService] addMessageListener:listener];
macOS/Windowscpp
V2NIMMessageListener listener; listener.onMessageRevokeNotifications = [](std::vector<V2NIMMessageRevokeNotification> revokeNotifications) { // receive message revoke notifications }; listener.onReceiveMessages = [](std::vector<V2NIMMessage> messages) { // receive messages }; messageService.addMessageListener(listener);
Web/uni-app/小程序/Node.js/Electron/HarmonyOS
调用
on("EventName")
方法注册消息相关监听器,监听消息撤回事件onMessageRevokeNotifications
和消息接收回调事件onReceiveMessages
。Web/uni-app/小程序typescript
nim.V2NIMMessageService.on("onMessageRevokeNotifications", function(revokeNotifications: V2NIMMessageRevokeNotification[]) {}) nim.V2NIMMessageService.on("onReceiveMessages", function(messages: V2NIMMessage[]) {})
Node.js/Electrontypescript
v2.messageService.on("messageRevokeNotifications", function (revokeNotifications: V2NIMMessageRevokeNotification[]) {}) v2.messageService.on("receiveMessages", function (messages: V2NIMMessage[]) {})
HarmonyOStypescript
nim.messageService.on("onMessageRevokeNotifications", function(revokeNotifications: V2NIMMessageRevokeNotification[]) {}) nim.messageService.on("onReceiveMessages", function(messages: V2NIMMessage[]) {})
Flutter
调用
add
方法注册消息监听器,监听消息撤回事件onMessageRevokeNotifications
和消息接收回调事件onReceiveMessages
。dart
subsriptions.add(NimCore .instance.messageService.onMessageRevokeNotifications .listen((event) { //do something })); subsriptions.add( NimCore.instance.messageService.onReceiveMessages.listen((event) { //do something }));
-
消息发送者在发送消息成功后,调用
revokeMessage
方法撤回该条已发送成功的消息。撤回成功后,SDK 会先触发回调通知应用上层消息撤回成功,再自动将本地的该条消息删除。如果需要在撤回后显示一条本方已撤回的提示,可自行构造一条提示消息(
createTipsMessage
)并调用insertMessageToLocal
方法在本地插入一条提示,具体可参考 插入本地消息。以下情况消息撤回会失败:
- 消息为空
- 消息未发送成功
- 消息超过撤回时限
- 消息被反垃圾(内容审核)命中
示例代码:AndroidV2NIMMessageService v2MessageService = NIMClient.getService(V2NIMMessageService.class); V2NIMMessage revokeMessage = ; // 被撤回的消息 // TODO: 根据实际情况配置 V2NIMMessageRevokeParams revokeParams = V2NIMMessageRevokeParams.V2NIMMessageRevokeParamsBuilder.builder() .withEnv() .withExtension() .withPostscript() .withPushContent() .withPushPayload() .build(); v2MessageService.revokeMessage(revokeMessage, revokeParams, new V2NIMSuccessCallback<Void>() { @Override public void onSuccess(Void unused) { // TODO: 撤回成功 } }, new V2NIMFailureCallback() { @Override public void onFailure(V2NIMError error) { // TODO: 撤回失败 } } );
iOS// 参数设置文档 V2NIMMessageRevokeParams V2NIMMessageRevokeParams *revokeParams = [[V2NIMMessageRevokeParams alloc] init]; [[[NIMSDK sharedSDK] v2MessageService] revokeMessage:message revokeParams:revokeParams success:^{ // 发送成功回调 } failure:^(V2NIMError * _Nonnull error) { // 发送失败回调, error 包含错误原因 }];
macOS/Windowscpp
V2NIMMessage message; // ... V2NIMMessageRevokeParams params; messageService.revokeMessage( message, params, []() { // revoke message succeeded }, [](V2NIMError error) { // revoke message failed, handle error } );
Web/uni-app/小程序try { await nim.V2NIMMessageService.revokeMessage(message) // todo Success } catch (err) { // todo error }
Node.js/Electrontypescript
try { await v2.messageService.revokeMessage(message, {}) // todo Success } catch (err) { // todo error }
HarmonyOStry { await nim.messageService.revokeMessage(message) // todo Success } catch (err) { // todo error }
Flutterdart
await NimCore.instance.messageService.revokeMessage(message, revokeParams);
-
撤回成功后,消息发送者和接收者会通过回调接收到消息撤回通知。
撤回消息后,云信会删除对应的离线消息、漫游消息和历史消息。
涉及接口
API | 说明 |
---|---|
addMessageListener |
注册消息相关监听器 |
removeMessageListener |
取消注册消息相关监听器 |
revokeMessage |
撤回消息 |
createTipsMessage |
创建一条提示消息 |
insertMessageToLocal |
插入一条消息到本地数据库 |
V2NIMMessageRevokeNotification |
撤回通知对象 |
API | 说明 |
---|---|
on("EventName") |
注册消息相关监听器 |
off("EventName") |
取消注册消息相关监听器 |
revokeMessage |
撤回消息 |
createTipsMessage |
创建一条提示消息 |
insertMessageToLocal |
插入一条消息到本地数据库 |
V2NIMMessageRevokeNotification |
撤回通知对象 |
API | 说明 |
---|---|
add |
注册消息相关监听器 |
cancel |
取消注册消息相关监听器 |
revokeMessage |
撤回消息 |
createTipsMessage |
创建一条提示消息 |
insertMessageToLocal |
插入一条消息到本地数据库 |
NIMMessageRevokeNotification |
撤回通知对象 |