tencent cloud

即时通信 IM

动态与公告
产品动态
公告
产品简介
产品概述
基本概念
应用场景
功能介绍
账号系统
用户资料与关系链
消息管理
群组相关
公众号系统
音视频通话 Call
使用限制
购买指南
计费概述
价格说明
购买指引
续费指引
停服说明
退费说明
开发指引
Demo 专区
开通服务
体验 Demo
快速跑通
下载中心
SDK & Demo 源码
更新日志
聊天互动(含 UI)
TUIKit 组件介绍
快速开始
全功能接入
单功能接入
AI 集成
构建基础界面
更多特性
定义外观
国际化界面语言
推送服务(Push)
服务概述
名词解释
开通服务
快速跑通
厂商通道
数据统计
排查工具
客户端 API
服务端 API
推送回调
高级功能
更新日志
错误码
常见问题
智能客服
功能概述
快速入门
集成指引
管理员操作手册
客服操作手册
更多实践
直播间搭建
AI 聊天机器人方案
超大娱乐协作社群
Discord 实现指南
游戏内集成 Chat 指南
类 WhatsApp Channel 搭建方案
发送红包
Chat 应对防火墙限制相关
无 UI 集成
快速开始
集成 SDK
初始化
登录登出
消息相关
会话相关
群组相关
社群话题
用户管理
离线推送
云端搜索
本地搜索
公众号
客户端 API
JavaScript
Android
iOS & macOS
Swift
Flutter
Electron
Unity
React Native
C 接口
C++
服务端 API
生成 UserSig
REST API
第三方回调
控制台指南
新版控制台介绍
创建并升级应用
基本配置
功能配置
账号管理
群组管理
公众号管理
回调配置
用量统计
资源包查看指南
实时监控
开发辅助工具
访问管理
高级功能
常见问题
uni-app 常见问题
购买相关问题
SDK 相关问题
账号鉴权相关问题
用户资料与关系链相关问题
消息相关问题
群组相关问题
直播群相关问题
昵称头像相关问题
协议与认证
服务等级协议
安全合规认证
IM 政策
隐私政策
数据隐私和安全协议
平滑迁移方案
平滑迁移完整版
平滑迁移简化版
错误码
联系我们

Android&iOS&Windows&Mac

PDF
聚焦模式
字号
最后更新时间: 2025-01-03 10:45:13

功能描述

如果您想实现合并转发功能,需要进行以下步骤:
1. 根据原始消息列表创建一条合并消息。
2. 把合并消息发送到对端。
3. 对端收到合并消息后解析出原始消息列表。
合并消息的展示还需要标题和摘要信息,如下图所示:
合并转发
合并消息展示
点击合并消息下载合并消息列表展示










合并转发消息

创建并发送合并转发消息

我们在创建一条合并消息的时候不仅要设置合并消息列表,还要设置标题和摘要信息,实现流程如下:
1. 调用 createMergerMessage (Java / Swift / Objective-C / C++) 接口创建一条合并消息,创建合并消息的时候需要设置原始消息列表,合并消息标题、合并消息摘要等信息。



属性
含义
说明
messageList
原始消息列表
合并转发的原始消息列表。
title
标题
合并消息的标题,如上图所示 “xixiyah 和 Hello 的聊天记录”。
abstractList
摘要列表
合并消息的摘要信息,如上图所示,合并消息需要预先展示原始消息的摘要信息,当用户点击 Cell 后才去展示完整消息内容。
compatibleText
兼容文本信息
低版本 SDK 如果不支持合并消息,默认会收到一条文本消息,文本消息的内容为 compatibleText。
示例代码如下:
Java
Swift
Objective-C
C++
// 需要被转发的消息列表,消息列表里可以包含合并消息,不能包含群 Tips 消息
List<V2TIMMessage> msgs = new ArrayList<>();
msgs.add(message1);
msgs.add(message2);
// 合并消息标题
String title = "vinson 和 lynx 的聊天记录";
// 合并消息摘要列表
List<String> abstactList = new ArrayList<>();
msgs.add("abstract1");
msgs.add("abstract2");
msgs.add("abstract3");
// 合并消息兼容文本,低版本 SDK 如果不支持合并消息,默认会收到一条文本消息,文本消息的内容为 compatibleText
String compatibleText = "请升级最新版本查看合并消息";
// 创建合并消息
V2TIMMessage mergeMessage = V2TIMManager.getMessageManager().createMergerMessage(msgs, title, abstractList, compatibleText);
// 需要被转发的消息列表,消息列表里可以包含合并消息,不能包含群 Tips 消息
let msgs: [V2TIMMessage] = [message1, message2 /* ... */]
// 合并消息标题
let title = "vinson 和 lynx 的聊天记录"
// 合并消息摘要列表
let abstractList = ["abstract1", "abstract2", "abstract3"]
// 合并消息兼容文本,低版本 SDK 如果不支持合并消息,默认会收到一条文本消息,文本消息的内容为 compatibleText
let compatibleText = "请升级最新版本查看合并消息"
// 创建合并消息
let mergeMessage = V2TIMManager.sharedInstance().createMergerMessage(messageList: msgs, title: title, abstractList: abstractList, compatibleText: compatibleText) {
}
// 需要被转发的消息列表,消息列表里可以包含合并消息,不能包含群 Tips 消息
NSArray *msgs = @[message1,message2...];
// 合并消息标题
NSString *title = @"vinson 和 lynx 的聊天记录";
// 合并消息摘要列表
NSArray *abstactList = @[@"abstract1",@"abstract2",@"abstract3"];
// 合并消息兼容文本,低版本 SDK 如果不支持合并消息,默认会收到一条文本消息,文本消息的内容为 compatibleText
NSString *compatibleText = @"请升级最新版本查看合并消息";
// 创建合并消息
V2TIMMessage *mergeMessage = [[V2TIMManager sharedInstance] createMergerMessage:msgs title:title
abstractList:abstactList compatibleText:compatibleText];
// 需要被转发的消息列表,消息列表里可以包含合并消息,不能包含群 Tips 消息
V2TIMMessageVector messageList;
messageList.PushBack(message1);
messageList.PushBack(message2);
// 合并消息标题
V2TIMString title = "vinson 和 lynx 的聊天记录";
// 合并消息摘要列表
V2TIMStringVector abstractList;
abstractList.PushBack("abstract1");
abstractList.PushBack("abstract2");
abstractList.PushBack("abstract3");
// 合并消息兼容文本,低版本 SDK 如果不支持合并消息,默认会收到一条文本消息,文本消息的内容为 compatibleText
V2TIMString compatibleText = "请升级最新版本查看合并消息";
// 创建合并消息
V2TIMMessage mergerMessage = V2TIMManager::GetInstance()->GetMessageManager()->CreateMergerMessage(
messageList, title, abstractList, compatibleText);
2. 调用 sendMessage (Java / Swift / Objective-C / C++) 接口发送合并消息。
示例代码如下:
Java
Swift
Objective-C
C++
// 发送合并消息给用户 "denny"
V2TIMManager.getMessageManager().sendMessage(mergeMessage, "denny", null, V2TIMMessage.V2TIM_PRIORITY_NORMAL, false, null, new V2TIMSendCallback<V2TIMMessage>() {
@Override
public void onProgress(int progress) {}

@Override
public void onSuccess(V2TIMMessage v2TIMMessage) {}

@Override
public void onError(int code, String desc) {}
})
// 发送合并消息给用户 "denny"
V2TIMManager.shared.sendMessage(message: msg, receiver: "denny", groupID: nil, priority: .V2TIM_PRIORITY_DEFAULT, onlineUserOnly: false,
offlinePushInfo: nil) { progress in
//
}succ: {
print("success")

}fail: { code, desc in
print("failure, code: \\(code), desc: \\(desc)")
}
// 发送合并消息给用户 "denny"
[[V2TIMManager sharedInstance] sendMessage:mergeMessage receiver:@"denny" groupID:nil
priority:V2TIM_PRIORITY_NORMAL onlineUserOnly:NO offlinePushInfo:nil progress:nil succ:nil fail:nil];
class SendCallback final : public V2TIMSendCallback {
public:
using SuccessCallback = std::function<void(const V2TIMMessage&)>;
using ErrorCallback = std::function<void(int, const V2TIMString&)>;
using ProgressCallback = std::function<void(uint32_t)>;

SendCallback() = default;
~SendCallback() override = default;

void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback,
ProgressCallback progress_callback) {
success_callback_ = std::move(success_callback);
error_callback_ = std::move(error_callback);
progress_callback_ = std::move(progress_callback);
}

void OnSuccess(const V2TIMMessage& message) override {
if (success_callback_) {
success_callback_(message);
}
}
void OnError(int error_code, const V2TIMString& error_message) override {
if (error_callback_) {
error_callback_(error_code, error_message);
}
}
void OnProgress(uint32_t progress) override {
if (progress_callback_) {
progress_callback_(progress);
}
}

private:
SuccessCallback success_callback_;
ErrorCallback error_callback_;
ProgressCallback progress_callback_;
};

auto callback = new SendCallback{};
callback->SetCallback([=](const V2TIMMessage& message) { delete callback; },
[=](int error_code, const V2TIMString& error_message) { delete callback; },
[=](uint32_t progress) {});

V2TIMManager::GetInstance()->GetMessageManager()->SendMessage(
mergerMessage, "denny", {}, V2TIMMessagePriority::V2TIM_PRIORITY_NORMAL, false, {}, callback);

接收合并转发消息

添加监听器

接收方调用 addAdvancedMsgListener (Java / Swift / Objective-C / C++) 添加高级消息监听器。 一般建议在比较靠前的时间点调用,例如例如聊天消息界面初始化后,确保 App 能及时收到消息。
示例代码如下:
Java
Swift
Objective-C
C++
V2TIMManager.getMessageManager().addAdvancedMsgListener(advancedMsgListener);
// self 实现 V2TIMAdvancedMsgListener 协议
V2TIMManager.shared.addAdvancedMsgListener(listener: self)
// self 为 id<V2TIMAdvancedMsgListener>
[[V2TIMManager sharedInstance] addAdvancedMsgListener:self];
class AdvancedMsgListener final : public V2TIMAdvancedMsgListener {
// 成员 ...
};

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

解析消息

添加监听器后,接收方会在 onRecvNewMessage 中收到合并消息 V2TIMMessage。 可以先通过合并消息元素 V2TIMMergerElem (Java / Swift / Objective-C / C++) 获取 titleabstractList UI 展示。 当用户点击合并消息的时候再调用 downloadMergerMessage(Java / Swift / Objective-C / C++) 接口下载合并消息列表 UI 展示。
示例代码如下:
Java
Swift
Objective-C
C++
@Override
public void onRecvNewMessage(V2TIMMessage msg) {
if (msg.getElemType() == V2TIMMessage.V2TIM_ELEM_TYPE_MERGER) {
// 获取合并消息 elem
V2TIMMergerElem mergerElem = msg.getMergerElem();
// 获取 title
String title = mergerElem.getTitle();
// 获取摘要列表
List<String> abstractList = mergerElem.getAbstractList();
// 用户点击合并消息的时候下载合并消息列表
mergerElem.downloadMergerMessage(new V2TIMValueCallback<List<V2TIMMessage>>() {
@Override
public void onSuccess(List<V2TIMMessage> v2TIMMessages) {
// 下载成功,v2TIMMessages 即为合并消息列表
for (V2TIMMessage subMsg : v2TIMMessages) {
// 如果合并消息列表里面还有合并消息,可以继续解析
if (subMsg.getElemType() == V2TIMMessage.V2TIM_ELEM_TYPE_MERGER) {
V2TIMMergerElem mergerElem = subMsg.getMergerElem();
// 获取 title
String title = mergerElem.getTitle();
// 获取摘要列表
List<String> abstractList = mergerElem.getAbstractList();
// 用户点击合并消息的时候下载合并消息列表
......
}
}
}

@Override
public void onError(int code, String desc) {
// 下载失败
}
});
}
func onRecvNewMessage(_ msg: V2TIMMessage) {
if msg.elemType == .V2TIM_ELEM_TYPE_MERGER {
// 获取合并消息 elem
let mergerElem = msg.mergerElem
// 获取 title
let title = mergerElem?.title
// 获取摘要列表
let abstractList = mergerElem?.abstractList
// 用户点击合并消息的时候下载合并消息列表
mergerElem?.downloadMergerMessage { msgs in
// 下载成功,msgs 即为合并消息列表
for subMsg in msgs {
// 如果合并消息列表里面还有合并消息,可以继续解析
if subMsg.elemType == .V2TIM_ELEM_TYPE_MERGER {
let subMergerElem = subMsg.mergerElem
// 获取 title
let subTitle = subMergerElem?.title
// 获取摘要列表
let subAbstractList = subMergerElem?.abstractList
// 用户点击合并消息的时候下载合并消息列表
subMergerElem?.downloadMergerMessage(succ: { msgs in
}, fail: { code, desc in
})
}
}
} fail: { code, desc in
// 下载失败
}
}
}
- (void)onRecvNewMessage:(V2TIMMessage *)msg {
if (msg.elemType == V2TIM_ELEM_TYPE_MERGER) {
// 获取合并消息 elem
V2TIMMergerElem *mergerElem = msg.mergerElem;
// 获取 title
NSString *title = mergerElem.title;
// 获取摘要列表
NSArray *abstractList = mergerElem.abstractList;
// 用户点击合并消息的时候下载合并消息列表
[msg.mergerElem downloadMergerMessage:^(NSArray<V2TIMMessage *> *msgs) {
// 下载成功,msgs 即为合并消息列表
for (V2TIMMessage *subMsg in msgs) {
// 如果合并消息列表里面还有合并消息,可以继续解析
if (subMsg.elemType == V2TIM_ELEM_TYPE_MERGER) {
V2TIMMergerElem *mergerElem = subMsg.mergerElem;
// 获取 title
NSString *title = mergerElem.title;
// 获取摘要列表
NSArray *abstractList = mergerElem.abstractList;
// 用户点击合并消息的时候下载合并消息列表
[msg.mergerElem downloadMergerMessage:nil fail:nil];
}
}
} fail:^(int code, NSString *desc) {
// 下载失败
}];
}
}
template <class T>
class ValueCallback final : public V2TIMValueCallback<T> {
public:
using SuccessCallback = std::function<void(const T&)>;
using ErrorCallback = std::function<void(int, const V2TIMString&)>;

ValueCallback() = default;
~ValueCallback() override = default;

void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback) {
success_callback_ = std::move(success_callback);
error_callback_ = std::move(error_callback);
}

void OnSuccess(const T& value) override {
if (success_callback_) {
success_callback_(value);
}
}
void OnError(int error_code, const V2TIMString& error_message) override {
if (error_callback_) {
error_callback_(error_code, error_message);
}
}

private:
SuccessCallback success_callback_;
ErrorCallback error_callback_;
};

class AdvancedMsgListener final : public V2TIMAdvancedMsgListener {
public:
// 收到新消息通知
void OnRecvNewMessage(const V2TIMMessage& message) override {
if (message.elemList.Size() == 1) {
V2TIMElem* elem = message.elemList[0];
if (elem->elemType == V2TIMElemType::V2TIM_ELEM_TYPE_MERGER) {
// 获取合并消息 elem
auto mergerElem = static_cast<V2TIMMergerElem*>(elem);
// 获取 title
V2TIMString title = mergerElem->title;
/// 合并消息摘要列表
V2TIMStringVector abstractList = mergerElem->abstractList;

// 用户点击合并消息的时候下载合并消息列表
auto callback = new ValueCallback<V2TIMMessageVector>{};
callback->SetCallback(
[=](const V2TIMMessageVector& messageList) {
// 下载成功,messageList 即为合并消息列表
for (size_t i = 0; i < messageList.Size(); ++i) {
const V2TIMMessage& message = messageList[i];
if (message.elemList.Size() == 1) {
V2TIMElem* elem = message.elemList[0];
// 如果合并消息列表里面还有合并消息,可以继续解析
if (elem->elemType == V2TIMElemType::V2TIM_ELEM_TYPE_MERGER) {
// ...
}
}
}
delete callback;
},
[=](int error_code, const V2TIMString& error_message) { delete callback; });

mergerElem->DownloadMergerMessage(callback);
}
}
}
// 其他成员 ...
};

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

移除监听器

如果想停止接收消息,接收方可调用 removeAdvancedMsgListener (Java / Swift / Objective-C / C++) 移除高级消息监听器。
示例代码如下:
Java
Swift
Objective-C
C++
V2TIMManager.getMessageManager().removeAdvancedMsgListener(advancedMsgListener);
V2TIMManager.shared.removeAdvancedMsgListener(listener: self)
// self 为 id<V2TIMAdvancedMsgListener>
[[V2TIMManager sharedInstance] removeAdvancedMsgListener:self];
class AdvancedMsgListener final : public V2TIMAdvancedMsgListener {
// 成员 ...
};

// advancedMsgListener 是 AdvancedMsgListener 的实例
V2TIMManager::GetInstance()->GetMessageManager()->RemoveAdvancedMsgListener(&advancedMsgListener);

逐条转发消息

如果您需要转发单条消息,可以先通过 createForwardMessage (Java / Swift / Objective-C / C++) 接口创建一条和原消息内容完全一样的转发消息,再调用 sendMessage (Java / Swift / Objective-C / C++) 接口把转发消息发送出去。
示例代码如下:
Java
Swift
Objective-C
C++
// 创建转发消息,转发消息的 elem 内容和原消息完全一致
V2TIMMessage forwardMessage = V2TIMManager.getMessageManager().createForwardMessage(originMsg);
// 发送消息给用户 "denny"
V2TIMManager.getMessageManager().sendMessage(forwardMessage, "denny", null, V2TIMMessage.V2TIM_PRIORITY_NORMAL, false, null, new V2TIMSendCallback<V2TIMMessage>() {
@Override
public void onProgress(int progress) {
}

@Override
public void onSuccess(V2TIMMessage message) {
}

@Override
public void onError(int code, String desc) {
}
});
// 创建转发消息,转发消息的 elem 内容和原消息完全一致
if let originMsg = sendedMsgList.first,
let msg = V2TIMManager.shared.createForwardMessage(message: originMsg) {
// 发送消息给用户 "denny"
_ = V2TIMManager.shared.sendMessage(message: msg, receiver: "denny", groupID: nil , priority: .V2TIM_PRIORITY_DEFAULT, onlineUserOnly: false, offlinePushInfo: nil) { progress in
} succ: {
} fail: { code, desc in

}
}
// 创建转发消息,转发消息的 elem 内容和原消息完全一致
V2TIMMessage *forwardMessage = [[V2TIMManager sharedInstance] createForwardMessage:originMsg];
// 发送消息给用户 "denny"
[[V2TIMManager sharedInstance] sendMessage:forwardMessage receiver:@"denny" groupID:nil
priority:V2TIM_PRIORITY_NORMAL onlineUserOnly:NO offlinePushInfo:nil progress:nil succ:nil fail:nil];
class SendCallback final : public V2TIMSendCallback {
public:
using SuccessCallback = std::function<void(const V2TIMMessage&)>;
using ErrorCallback = std::function<void(int, const V2TIMString&)>;
using ProgressCallback = std::function<void(uint32_t)>;

SendCallback() = default;
~SendCallback() override = default;

void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback,
ProgressCallback progress_callback) {
success_callback_ = std::move(success_callback);
error_callback_ = std::move(error_callback);
progress_callback_ = std::move(progress_callback);
}

void OnSuccess(const V2TIMMessage& message) override {
if (success_callback_) {
success_callback_(message);
}
}
void OnError(int error_code, const V2TIMString& error_message) override {
if (error_callback_) {
error_callback_(error_code, error_message);
}
}
void OnProgress(uint32_t progress) override {
if (progress_callback_) {
progress_callback_(progress);
}
}

private:
SuccessCallback success_callback_;
ErrorCallback error_callback_;
ProgressCallback progress_callback_;
};

// 创建转发消息,转发消息的 elem 内容和原消息完全一致
V2TIMMessage forwardMessage = V2TIMManager::GetInstance()->GetMessageManager()->CreateForwardMessage(originMsg);

auto callback = new SendCallback{};
callback->SetCallback([=](const V2TIMMessage& message) { delete callback; },
[=](int error_code, const V2TIMString& error_message) { delete callback; },
[=](uint32_t progress) {});

// 发送消息给用户 "denny"
V2TIMManager::GetInstance()->GetMessageManager()->SendMessage(
forwardMessage, "denny", {}, V2TIMMessagePriority::V2TIM_PRIORITY_NORMAL, false, {}, callback);



帮助和支持

本页内容是否解决了您的问题?

填写满意度调查问卷,共创更好文档体验。

文档反馈