消息变更

功能描述

对于会话里已经发送成功的消息,会话参与者可以对消息做二次修改,修改成功后会同步给会话的所有参与者。
说明
消息变更功能仅增强版 6.2 及以上版本支持。

效果展示

您可以通过消息变更的 API,修改消息的 cloudCustomData,实现如下图所示的消息回复、引用等功能:




接口说明

变更消息

会话参与者可以调用 modifyMessage(Java / Swift / Objective-C / C++) 接口对会话里的消息做二次修改。 修改消息时,IM SDK 仅限制了会话参与者才能修改,如果您需要更多限制,例如限制只有消息发送者才能修改,可以自行在业务层处理。
目前消息支持修改的信息如下:
cloudCustomData (Java / Swift / Objective-C / C++)
V2TIMTextElem (Java / Swift / Objective-C / C++)
V2TIMCustomElem (Java / Swift / Objective-C / C++)
V2TIMLocationElem (Java / Swift / Objective-C / C++)
V2TIMFaceElem (Java / Swift / Objective-C / C++)
示例代码如下:
Java
Swift
Objective-C
C++
// 会话里面原始消息对象为 originMessage
// 修改消息对的 cloudCustomData 信息
originMessage.setCloudCustomData("modify_cloud_custom_data".getBytes());
// 如果是文本消息,修改文本消息内容
if (V2TIMMessage.V2TIM_ELEM_TYPE_TEXT == originMessage.getElemType()) {
originMessage.getTextElem().setText("modify_text");
}
V2TIMManager.getMessageManager().modifyMessage(originMessage, new V2TIMCompleteCallback<V2TIMMessage>() {
@Override
public void onComplete(int code, String desc, V2TIMMessage message) {
// 修改消息完成,message 为修改之后的消息对象
}
});
// 会话里面原始 message 对象
var originMessage: V2TIMMessage!
// 修改消息的 cloudCustomData 信息
originMessage.cloudCustomData = "modify_cloud_custom_data".data(using: .utf8)
// 如果是文本消息,修改文本消息内容
if originMessage.elemType == .V2TIM_ELEM_TYPE_TEXT {
originMessage.textElem?.text = "modify_text"
}
// 修改消息
V2TIMManager.shared.modifyMessage(msg: originMessage) { code, desc, msg in
// 修改消息完成,msg 为修改之后的消息对象
}
// 会话里面原始 message 对象
V2TIMMessage *originMessage;
// 修改消息的 cloudCustomData 信息
originMessage.cloudCustomData = [@"modify_cloud_custom_data" dataUsingEncoding:NSUTF8StringEncoding];
// 如果是文本消息,修改文本消息内容
if (V2TIM_ELEM_TYPE_TEXT == originMessage.elemType) {
originMessage.textElem.text = @"modify_text";
}
[[V2TIMManager sharedInstance] modifyMessage:originMessage completion:^(int code, NSString *desc, V2TIMMessage *msg) {
// 修改消息完成,msg 为修改之后的消息对象;
}];
template <class T>
class CompleteCallback final : public V2TIMCompleteCallback<T> {
public:
using InternalCompleteCallback =
std::function<void(int, const V2TIMString&, const T&)>;

CompleteCallback() = default;
~CompleteCallback() override = default;

void SetCallback(InternalCompleteCallback complete_callback) { complete_callback_ = std::move(complete_callback); }

void OnComplete(int error_code, const V2TIMString& error_message, const T& value) override {
if (complete_callback_) {
complete_callback_(error_code, error_message, value);
}
}

private:
InternalCompleteCallback complete_callback_;
};

V2TIMMessage originMessage = 原始消息;
std::string str = u8"modify_cloud_custom_data";
// 修改消息对的 cloudCustomData 信息
originMessage.cloudCustomData = {reinterpret_cast<const uint8_t*>(str.data()), str.size()};
if (originMessage.elemList.Size() == 1) {
V2TIMElem* elem = originMessage.elemList[0];
if (elem->elemType == V2TIMElemType::V2TIM_ELEM_TYPE_TEXT) {
// 如果是文本消息,修改文本消息内容
auto textElem = static_cast<V2TIMTextElem*>(elem);
textElem->text = "modify_text";
}
}

auto callback = new CompleteCallback<V2TIMMessage>{};
callback->SetCallback([=](int error_code, const V2TIMString& error_message, const V2TIMMessage& message) {
// 修改消息完成,message 为修改之后的消息对象
delete callback;
});

V2TIMManager::GetInstance()->GetMessageManager()->ModifyMessage(originMessage, callback);

监听消息变更回调

会话的参与者调用 addAdvancedMsgListener (Java / Swift / Objective-C / C++) 添加高级消息监听器。
当会话里的消息被修改后,会话的参与者都会收到 onRecvMessageModified(Java / Swift / Objective-C / C++) 回调,回调里面会携带修改之后的消息对象。
示例代码如下:
Java
Swift
Objective-C
C++
V2TIMAdvancedMsgListener advancedMsgListener = new V2TIMAdvancedMsgListener() {
// 消息内容被修改通知
@Override
public void onRecvMessageModified(V2TIMMessage msg) {
// msg 为被修改之后的消息对象
}
};
// 添加消息监听
V2TIMManager.getMessageManager().addAdvancedMsgListener(advancedMsgListener);
// 添加消息监听
V2TIMManager.sharedInstance().addAdvancedMsgListener(self)
// 消息内容被修改通知
func onRecvMessageModified(_ msg: V2TIMMessage) {
// msg 为被修改之后的消息对象
}
// 添加消息监听
[[V2TIMManager sharedInstance] addAdvancedMsgListener:self];
/// 消息内容被修改通知
- (void)onRecvMessageModified:(V2TIMMessage *)msg {
// msg 为被修改之后的消息对象
}
class AdvancedMsgListener final : public V2TIMAdvancedMsgListener {
public:
// 消息内容被修改通知
void OnRecvNewMessage(const V2TIMMessage& message) override {
// message 为被修改之后的消息对象
}
// 其他成员 ...
};

// 添加高级消息的事件监听器,注意在移除监听器之前需要保持 advancedMsgListener 的生命期,以免接收不到事件回调
AdvancedMsgListener advancedMsgListener;
V2TIMManager::GetInstance()->GetMessageManager()->AddAdvancedMsgListener(&advancedMsgListener);