一、功能描述
注意:说明:
注意:消息变更功能仅增强版 6.2 及以上版本支持。
二、变更消息
会话参与者可以调用 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++)
示例代码如下:
JavaSwiftObjective-CC++// 会话里面原始消息对象为 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);
注意:1. 如果在修改消息过程中,消息已经被其他人修改,completion 会返回 ERR_SDK_MSG_MODIFY_CONFLICT 错误,此时需要上层 App 处理冲突,例如界面给出提示或者重试等。
注意:2. 无论修改消息成功或失败,completion 都会返回最新的消息对象。
三、监听消息变更回调
会话的参与者调用 addAdvancedMsgListener (Java / Swift / Objective-C / C++) 添加高级消息监听器。
当会话里的消息被修改后,会话的参与者都会收到 onRecvMessageModified(Java / Swift / Objective-C / C++) 回调,回调里面会携带修改之后的消息对象。
示例代码如下:
JavaSwiftObjective-CC++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);