转发消息
IMKit 目前不支持对单条或多条消息的转发,也不支持合并转发,下面提供了可以实现单条或多条消息的转发的代码示例进行参考。
单条转发
可以增加消息气泡的长按事件 自定义来实现转发。在 onClick
中发消息使用 示例代码 的 sendForwardMessage
方法。
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);

多条逐条转发
IMKit 提供了 addMessageMoreAction
方法,可以增加长按消息点击“更多”之后,展示聊天页面底部的按钮 示例代码。
需要在 routeSelectPage
中编写跳转到 App 侧开发选人页面,发消息使用 示例代码 的 sendForwardMessages
方法。
forwardDialog: CustomDialogController | undefined
async aboutToAppear(): Promise<void> {
this.addMessageMoreItems()
}
private addMessageMoreItems() {
this.forwardDialog = new CustomDialogController({
builder: CustomListDialog({
itemTextAlign: TextAlign.Center,
viewAllWidth: '95%',
list: [$r("app.string.rc_combine_stepwise_forwarding"), $r("app.string.rc_cancel")],
onItemClick: (index: number) => {
if (index === 1) {
// 关闭弹窗
this.forwardDialog?.close();
}
if (index === 0) {
// 关闭弹窗
this.forwardDialog?.close();
// 跳转到 App 侧开发选人页面
let params: ForWardMessageParam = { messages: this.forwardMessageArray };
this.routeSelectPage(params)
}
}
}),
customStyle: true,
offset: { dx: 0, dy: -30 },
alignment: DialogAlignment.Bottom
})
RongIM.getInstance().conversationService().addMessageMoreAction({
actionId: 'message_more_forward',
icon: $r("app.media.rc_message_more_forward"),
onClick: (context: Context, messages: Message[]): boolean => {
this.forwardMessageArray = messages
this.forwardDialog?.open()
return true
},
onFilter: (messages: Message[]): boolean => {
return true;
},
location: 100
})
}
private routeSelectPage(params: ForWardMessageParam) {
// 跳转逻辑
}



转发消息示例代码
import {
ConversationIdentifier,
ConversationType,
FileMessage,
FileMessageObjectName,
GIFMessage,
GIFMessageObjectName,
ImageMessage,
ImageMessageObjectName,
HQVoiceMessageObjectName,
Message,
ObjectChecker,
RongIM,
TextMessage,
SightMessage,
TextMessageObjectName,
SightMessageObjectName,
LocationMessageObjectName,
LocationMessage,
HQVoiceMessage,
RichContentMessageObjectName,
RichContentMessage,
ReferenceMessageObjectName,
ReferenceMessage,
MessageContent
} from '@rongcloud/imkit';
// 转发多条消息
private async sendForwardMessages(forwardMessage: Message[]) {
for (let index = 0; index < forwardMessage.length; index++) {
this.sendForwardMessage(forwardMessage[index], index == forwardMessage.length - 1);
await new Promise<void>(resolve => setTimeout(resolve, 300));
}
}
// 转发单条消息
private async sendForwardMessage(forwardMessage: Message): Promise<void> {
return new Promise(async () => {
let conversationIdentifier = new ConversationIdentifier();
conversationIdentifier.conversationType = forwardMessage.conversationType;
conversationIdentifier.targetId = forwardMessage.targetId;
let msgContent = this.getMessageContent(forwardMessage.content, forwardMessage.objectName);
if (!msgContent) {
return
}
let msg = new Message(conversationIdentifier, msgContent);
await RongIM.getInstance().messageService().sendMessage(msg)
})
}
private getMessageContent(messageContent: MessageContent, objName: string): MessageContent | undefined {
if (objName === TextMessageObjectName) {
let oldTextMsg = messageContent as TextMessage
let textMsg = new TextMessage();
textMsg.content = oldTextMsg.content;
return textMsg
} else if (objName === ImageMessageObjectName) {
let imageMsg = messageContent as ImageMessage
let imageMessage = new ImageMessage();
imageMessage.isFull = true;
imageMessage.name = imageMsg.name;
imageMessage.remoteUrl = imageMsg.remoteUrl;
imageMessage.thumbnailBase64 = imageMsg.thumbnailBase64;
return imageMessage
} else if (objName === FileMessageObjectName) {
let fileMsg = messageContent as FileMessage;
let fileMessage = new FileMessage();
fileMessage.name = fileMsg.name;
fileMessage.remoteUrl = fileMsg.remoteUrl;
fileMessage.size = fileMsg.size;
fileMessage.type = fileMsg.type;
return fileMessage
} else if (objName === GIFMessageObjectName) {
let imageMsg = messageContent as GIFMessage
let imageMessage = new GIFMessage();
imageMessage.name = imageMsg.name;
imageMessage.remoteUrl = imageMsg.remoteUrl;
return imageMessage
} else if (objName === SightMessageObjectName) {
let sightMsg = messageContent as SightMessage
let sightMessage = new SightMessage();
sightMessage.base64 = sightMsg.base64;
sightMessage.duration = sightMsg.duration;
sightMessage.size = sightMsg.size;
sightMessage.name = sightMsg.name;
sightMessage.remoteUrl = sightMsg.remoteUrl;
return sightMessage
} else if (objName === RichContentMessageObjectName) {
let richContentMsg = messageContent as RichContentMessage
let richContentMessage = new RichContentMessage();
richContentMessage.title = richContentMsg.title
richContentMessage.content = richContentMsg.content
richContentMessage.imgUrl = richContentMsg.imgUrl
richContentMessage.url = richContentMsg.url
return richContentMessage
} else if (objName === LocationMessageObjectName) {
let locationMsg = messageContent as LocationMessage
let locationMessage = new LocationMessage();
locationMessage.latitude = locationMsg.latitude;
locationMessage.longitude = locationMsg.longitude;
locationMessage.poi = locationMsg.poi;
locationMessage.thumbnailBase64 = locationMsg.thumbnailBase64;
locationMessage.type = locationMsg.type;
return locationMessage
} else if (objName === HQVoiceMessageObjectName) {
let hqVoiceMsg = messageContent as HQVoiceMessage
let hqVoiceMessage = new HQVoiceMessage();
hqVoiceMessage.name = hqVoiceMsg.name;
hqVoiceMessage.remoteUrl = hqVoiceMsg.remoteUrl;
hqVoiceMessage.duration = hqVoiceMsg.duration;
return hqVoiceMessage
}
return undefined
}