浏览 SDKs · iOS
SDKsiOS

撤回消息

撤回消息,并通过消息监听器同步撤回态。

复制

如果界面需要让其他会话成员看到“消息已撤回”,调用 revokeMessage:clientMsgID:onSuccess:onFailure:,不要用普通删除替代。删除只影响当前账号侧可见性,见删除消息;保留消息并更新其内容时,使用修改消息

撤回一条消息

参数说明

参数类型是否必填说明
conversationIDNSString *必填消息所属的会话 ID。
clientMsgIDNSString *必填要撤回的消息 ID。
[[OIMManager manager] revokeMessage:conversationID
                        clientMsgID:clientMsgID
                          onSuccess:^(NSString * _Nullable data) {
    [self markMessageRevoked:clientMsgID conversationID:conversationID];
}
                          onFailure:^(NSInteger code, NSString * _Nullable message) {
    [self showRevokeError:code message:message ?: @"撤回消息失败"];
}];

成功后,调用端可以先把当前列表中同 clientMsgID 的消息更新为撤回态。允许撤回的发送者、时间窗口和消息类型由 OpenIMServer 校验;调用失败时不要只在本地保留撤回展示。

返回结果

成功 callback 表示当前撤回请求已完成,不代表所有客户端界面已经更新。其他客户端通过撤回事件合并增量,连接恢复或重新登录后的状态再由消息同步与历史查询校准。

接收撤回事件

本页是 onRecvMessageRevoked: 的正文归属页。应用通过同一个 OIMAdvancedMsgListener 实现:

- (void)onRecvMessageRevoked:(OIMMessageRevokedInfo *)revokedInfo {
    [self markMessageRevokedByClientMsgID:revokedInfo.clientMsgID
                              sessionType:revokedInfo.sessionType];
}

如果使用 OIMCallbacker 的 closure 形式,OIMRevokedCallback 参数声明为 nullable,处理器必须先判断:

OIMRevokedCallback handleMessageRevoked =
    ^(OIMMessageRevokedInfo * _Nullable revokedInfo) {
    if (revokedInfo == nil) {
        return;
    }
    [self markMessageRevokedByClientMsgID:revokedInfo.clientMsgID
                              sessionType:revokedInfo.sessionType];
};

OIMMessageRevokedInfo 不含 conversationID。先用 clientMsgID 定位已缓存的原消息,再结合原消息所属会话和事件的 sessionType 更新撤回态;不要直接按数组位置删除。listener 应由应用强引用,并通过 addAdvancedMsgListener: 注册、用同一实例调用 removeAdvancedMsgListener: 清理,完整代码见接收消息

调用成功、其他端事件到达和重新读取历史是三个独立阶段。

相关页面