浏览 SDKs · iOS
平台
SDKsiOS

撤回消息

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

复制

如果需要在会话中向所有成员展示“消息已撤回”状态,应调用撤回消息接口,而不能使用普通删除替代。删除操作仅影响当前账号侧可见性,见删除消息;若需要保留消息并更新其文字内容,见修改消息。

撤回一条消息

[[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 ?: @"撤回消息失败"];
}];

参数说明

参数类型是否必填说明
conversationIDNSString *必填消息所属的会话 ID。
clientMsgIDNSString *必填要撤回的目标消息客户端 ID。

成功回调表示当前撤回请求已被服务端处理完成。允许撤回的发送者权限、时间窗口和消息类型由服务端统一校验;调用失败时切勿仅在本地擅自保留撤回状态。

返回结果

  • 成功回调仅代表本端向服务端发起的撤回请求处理成功,并不代表所有其他客户端已全部完成更新。
  • 客户端状态合并标识为 clientMsgID(必要时同时限定 conversationID)。

接收撤回事件

其他成员或本端其他已登录设备收到撤回通知时,由 OIMAdvancedMsgListener 协议的撤回消息方法推送:

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

如果使用 OIMCallbacker 的闭包形式,回调参数可能为空,处理前应校验判空:

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

OIMMessageRevokedInfo 中不直接携带 conversationID,本地应先以 clientMsgID 检索已缓存的原始消息,再结合其会话与事件中提供的 sessionType 刷新对应气泡展示为撤回状态。完整的监听器生命周期管理见接收消息。

撤回接口调用成功、其他端事件到达和重新拉取历史消息是三个独立的业务阶段。

相关页面