转发消息
IMKit 默认没有实现对单条、多条消息的转发以及合并转发,下面提供了可以实现单条或多条消息的转发的代码示例进行参考。
局限
- 并非所有消息类型均支持合并转发。
- 支持的消息类型:文本、图片、图文、GIF、动态表情(
RC:StkMsg)、名片、位置、小视频、文件、普通语音、高清语音、音视频通话(RC:VCSummary)。 - 不支持的情况:未在支持列表中的消息类型,例如引用消息,以及未发送成功的消息等特殊情况不支持转发。自定义消息均不支持合并转发。
- 支持的消息类型:文本、图片、图文、GIF、动态表情(
- 合并转发支持合并不能超过 100 条消息。
单条转发
可以增加消息气泡的长按事件来实现转发。在 onClick 中发消息使用 示例代码 的 sendForwardMessage 方法。
TypeScript
let msgForwardLongClickAction :ItemLongClickAction<Message> = {
obtainTitle: (context: Context, data: Message): string | Resource => {
return "转发消息"
},
onClick: (context: Context, data: Message): void => {
// 转发消息
},
onFilter: (data: Message): boolean => {
// 是否显示该长按事件?true 显示;false 不显示
// 开发者可以根据 Message 对象的会话类型或者消息类型决定是否显示
return true;
},
// 自定义的消息长按事件 Id,相同的 Id 的长按事件只会增加一次
actionId: 'CustomMessageActionId'
}
RongIM.getInstance().conversationService().addMessageItemLongClickAction(msgForwardLongClickAction);
合并转发(1.4.3 支持)
SDK 会将选中的消息合并为一条合并转发消息,包含消息内容对象 CombineMessage(类型标识:RC:CombineMsg)。合并转发的消息默认折叠显示,可点击展开。
预览页面事件监听
您可以通过 addCombineMessageEventListener 方法自定义合并转发预览界面的事件监听:
示例代码
TypeScript
export interface CombineMessageEventListener {
/**
* 合并转发消息预览页面的位置消息点击事件回调
* @param latitude 纬度, double 类型
* @param longitude 经度, double 类型
* @param locationName 地理位置的名称
*/
onLocationMessageClick?: (latitude: number, longitude: number, locationName: string) => void;
}
let combineMessageEventListener: CombineMessageEventListener = {
onLocationMessageClick: (latitude: number, longitude: number, locationName: string) => {
// 地图消息跳转地图页面查看位置
}
}
// 添加事件监听
RongIM.getInstance().messageService().addCombineMessageEventListener(combineMessageEventListener)
// 移除事件监听
RongIM.getInstance().messageService().removeCombineMessageEventListener(combineMessageEventListener)
预览页面样式设置
您可以通过 ConversationConfig 的 setCombineHtmlStyle 方法配置预览页面的样式:
TypeScript
let config = RongIM.getInstance().conversationService().getConversationConfig()
config.setCombineHtmlStyle("样式style")
RongIM.getInstance().conversationService().setConversationConfig(config)
合并转发兼容不支持的类型消息
构建合并转发消息
构建合并转发接口新增 function 类型参数 unsupportedMessageHandler?: (message:Message) => Promise<string>。仅当SDK解析到不支持的类型消息时,会回调此 function,message 是不支持的消息。
这样由开发者来处理合并转发不支持的类型消息,返回消息对应 HTML body 内容,SDK 会把返回的内容插入到合并转发 HTML 中。
TypeScript
/**
* 构建合并转发消息
*
* @param forwardMessages 用来构建合并转发消息的消息数组
* @param unsupportedMessageHandler 用于开发者处理合并转发不支持类型的消息转换为 HTML 内容的逻辑。
* @returns 返回 CombineMessage,如果返回 undefined 则代表构建失败。
*/
obtainCombineMessage(forwardMessages: Message[], unsupportedMessageHandler?: (message:Message) => Promise<string>): Promise<IAsyncResult<CombineMessage>>;
参数说明
| 参数名 | 类型 | 说明 |
|---|---|---|
forwardMessages | Message[] | 用来构建合并转发消息的消息数组 |
unsupportedMessageHandler | (message:Message) => Promise<string> | 用于开发者处理合并转发不支持类型的消息转换为 HTML 内容的逻辑。 1. 仅当 SDK 转换 forwardMessages 遇到不支持的消息类型时回调此 function,message 是不支持的消息。如开发者准备渲染该消息,则需要返回 body 内容。2. SDK 不会校验 function 返回的 body 内容,如内容异常会导致合并转发页面加载失败,需开发者保证内容有效。如返回空字符串则不会处理。 |
拦截Html页面的JS事件
接口说明
TypeScript
export interface CombineMessageEventListener {
// ...省略无关代码
/**
* 合并转发WebView的JS回调原生的拦截器。此拦截接口优先级高于 onLocationMessageClick。
*
* @params jsJson 合并转发Html通过JS透传过来的Json数据
* @return false 代表SDK继续执行JS事件,true 代表SDK不需再执行JS事件。
* @since 1.7.0
*/
onJSCallNativeInterceptor?: (jsJson: string) => Promise<boolean>;
}
SDK 返回的 jsJson 数据示例
TypeScript
文件
type = "RC:FileMsg"
fileName = "文件.pdf"
fileSize = "123456"
fileType = "pdf"
fileUrl = "文件地址"
地图
type = "RC:LBSMsg"
latitude = "纬度"
locationName = "地理位置"
longitude = "经度"
合并转发
type = "RC:CombineMsg"
fileUrl = "文件下载地址"
title = "标题"
手机号
type = "phone"
phoneNum = "13888888888"
超链接
type = "link"
link = "超链接"
图片
type = "RC:ImgMsg"
fileUrl = "图片地址"
imgUrl = "缩略图base64"
视频
type = "RC:SightMsg"
duration = "5"
fileUrl = "视频地址"
imageBase64 = "缩略图base64"
Gif
type = "RC:GIFMsg"
fileUrl = "Gif地址"