消息撤回
撤回用于在发送后短时间内收回消息:发送者调用撤回接口,服务端校验时限与身份后,把撤回事件推送给会话内所有端。客户端应把原消息替换为“已撤回”占位,而不是直接删除(保留会话上下文与可追溯性)。
规则
| 项 | 规则 |
|---|---|
| 谁可以撤回 | 仅消息发送者本人 |
| 时限 | 默认 2 分钟(可在控制台调整);超时返回 1022 |
| 双方可见性 | 单聊双方、群聊全体成员都会收到撤回事件 |
| 多端 | 同账号其它端同步替换为撤回占位 |
| 重复撤回 | 幂等:已撤回的消息再次撤回返回 1023 |
| 删除 vs 撤回 | 删除只影响本端视图;撤回影响所有端 |
recallMessage
撤回消息(仅发送者、撤回时限内)。成功后本地与对端收到 MESSAGE_RECALLED。
| 项 | 值 |
|---|---|
| Swift | func recallMessage(messageId: String) async -> RcResult<IMPMessage> |
| Objective-C | - (void)recallMessageWithMessageId:(NSString *)messageId completion:(void (^)(IMPOSResult *result))completion |
| 传输 | 长连接(WebSocket) |
| 幂等 | 否 |
参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
messageId | string | 是 | 消息 ID(服务端生成) |
返回
Message:消息实体(messageId、seq、发送状态)
示例(Swift / Objective-C)
let res = await client.recallMessage(messageId: "m_10001")
if res.code != 0 { print(res.msg ?? "") }[client recallMessageWithMessageId:@"m_10001" completion:^(IMPOSResult *result) {
if (result.code != 0) { NSLog(@"IM 调用失败:%ld %@", (long)result.code, result.msg); }
}];错误码
| 错误码 | 名称 | 分类 | HTTP | 可重试 | 说明 |
|---|---|---|---|---|---|
1001 | INVALID_PARAMETER | 客户端 / 参数 / 权限 | 400 | 否 | 参数错误 |
1003 | FORBIDDEN | 客户端 / 参数 / 权限 | 403 | 否 | 无权限 |
1004 | USER_NOT_FOUND | 客户端 / 参数 / 权限 | 404 | 否 | 用户不存在 |
1022 | RECALL_EXPIRED | 客户端 / 参数 / 权限 | 400 | 否 | 超过撤回时限 |
1023 | MESSAGE_ALREADY_RECALLED | 客户端 / 参数 / 权限 | 400 | 否 | 消息已撤回 |
3001 | SDK_NOT_CONNECTED | SDK 本地 | 0 | 是 | 长连接未就绪 |
事件与 UI
- 成功后本端立即替换为撤回占位(乐观更新),并以服务端事件为准校正。
- 对端通过 `MESSAGE_RECALLED` 事件收到 `{messageId, operatorId, ...}`,按 messageId 定位替换。
- 撤回后原消息内容不再展示;搜索与引用应跳过已撤回消息。
- 失败时按错误码提示:1022 超时、1023 已撤回、1003 无权限、3001 连接未就绪。
Swift
let recallStatus = client.getConnectionStatus()
print(recallStatus)