拦截消息
IMKit 支持设置消息拦截器 MessageInterceptor
,可在消息发送前前进行拦截,方便应用程序进行自定义处理。
消息拦截器说明
MessageInterceptor
包含了拦截消息(支持同步)、发送媒体消息进行上传媒体资源前拦截、下载媒体消息的拦截器。
提示
从 1.4.3
版本开始,onWillSendMessage
支持修改 message
对象,同时支持了同步接口 onWillSendMessageSync
。
TypeScript
interface MessageInterceptor {
/**
* 在发消息前拦截并修改消息体
* @param message 即将发送的消息体
* @returns 修改之后的消息体
* @warning 如果返回的 Message 为空或者 Message.content 为空,该消息将不会发送出去
*/
onWillSendMessage?: (message: Message) => Message | null;
/**
* 在发消息前拦截并修改消息体,同步接口
* @param message 即将发送的消息体
* @returns 修改之后的消息体
* @warning 如果返回的 Message 为空或者 Message.content 为空,该消息将不会发送出去
* @version 1.4.3
*/
onWillSendMessageSync?: (message: Message) => Promise<Message | null>;
/**
* 发送媒体消息进行上传媒体资源前拦截,同步接口
* # 示例代码
*```ts
* let interceptor: MessageInterceptor = {
* onWillUploadMessageSync: async (message: Message, localPath: string) => {
* // 拦截接口,如果决 定拦截则返回此接口,在此接口中使用 transfer 做进度回传操作。不拦截返回 null 即可。
* let transferCallback = (transfer: MediaMessageTransfer) => {
* let progress = 0
* // 此处模拟异步回调上传进度与结果,需根据实际业务处理
* let timer = setInterval(() => {
* progress += 10
* if (progress < 100) {
* // 模拟回传进度
* transfer.updateProgress(progress)
* } else {
* // 模拟上传成功、失败、取消
* // 上传成功,回传地址
* transfer.success("业务侧上传后的远端地址")
* // 上传失败
* // transfer.error()
* // 上传取消
* // transfer.cancel()
* clearInterval(timer);
* }
* }, 100);
* }
* return transferCallback
* }
* }
* RongIM.getInstance().messageService().setMessageInterceptor(interceptor)
*```
* @param message 即将上传并发送的消息体
* @param localPath 即将上传的本地路径
* @returns 拦截接口。返回 `(transfer: MediaMessageTransfer) => void` 代表由开发者控制上传,返回 null 代表由SDK执行上 传。
* @version 1.4.3
*/
onWillUploadMessageSync?: (message: Message,
localPath: string) => Promise<((transfer: MediaMessageTransfer) => void) | null>;
/**
* 下载媒体消息的拦截器,同步接口
* # 示例代码
*```
*let interceptor: MessageInterceptor = {
* onWillDownloadMessageSync: async (message: Message, remoteUrl: string) => {
* // 拦截接口,如果决定拦截则返回此接口,在此接口中使用 transfer 做进度回传操作。不拦截返回 null 即可。
* let transferCallback = (transfer: MediaMessageTransfer) => {
* let progress = 0
* // 此处模拟异步回调下载进度与结果,需根据实际业务处理
* let timer = setInterval(() => {
* progress += 10
* if (progress < 100) {
* // 模拟回传进度
* transfer.updateProgress(progress)
* } else {
* // 模拟下载成功、失败、取消
* // 下载成功,回传地址
* transfer.success("下载后的本地地址")
* // 下载失败
* // transfer.error()
* // 下载取消
* // transfer.cancel()
* clearInterval(timer);
* }
* }, 100);
* }
* return transferCallback
* },
*}
*RongIM.getInstance().messageService().setMessageInterceptor(interceptor)
*```
* @param message 即将下载的消息体
* @param remoteUrl 即将下载的地址
* @returns 拦截接口。返回 `(transfer: MediaMessageTransfer) => void` 代表由开发者控制下载,返回 null 代表由SDK执行下载。
* @version 1.4.3
*/
onWillDownloadMessageSync?: (message: Message,
remoteUrl: string) => Promise<((transfer: MediaMessageTransfer) => void) | null>;
/**
* 下载文件的拦截器,同步接口
* # 示例代码
*```
* let interceptor: MessageInterceptor = {
* onWillDownloadFileSync: async (uniqueId: string, remoteUrl: string, fileName: string) => {
* // 拦截接口,如果决定拦截则返回此接口,在此接口中使用 transfer 做进度回传操作。不拦截返回 null 即可。
* let transferCallback = (transfer: MediaMessageTransfer) => {
* let progress = 0
* // 此处模拟异步回调下载进度与结果,需根据实际业务处理
* let timer = setInterval(() => {
* progress += 10
* if (progress < 100) {
* // 模拟回传进度
* transfer.updateProgress(progress)
* } else {
* // 模拟下载成功、失败、取消
* // 下载成功,回传地址
* transfer.success("下载后的本地地址")
* // 下载失败
* // transfer.error()
* // 下载取消
* // transfer.cancel()
* clearInterval(timer);
* }
* }, 100);
* }
* return transferCallback
* }
* }
* RongIM.getInstance().messageService().setMessageInterceptor(interceptor)
*```
* @param uniqueId 下载标识
* @param remoteUrl 即将下载的文件地址
* @param fileName 即将下载的文件名
* @returns 拦截接口。返回 `(transfer: MediaMessageTransfer) => void` 代表由开发者控制下载,返回 null 代表由SDK执行下载。
* @version 1.4.3
*/
onWillDownloadFileSync?: (uniqueId: string, remoteUrl: string, fileName: string) =>
Promise<((transfer: MediaMessageTransfer) => void) | null>;
}
设置消息拦截器
使用 RongIM
的 setMessageInterceptor
设置消息拦截器。代码示例说明如下:
TypeScript
let intercept: MessageInterceptor = {
onWillSendMessage: (message: Message) => {
// 可以根据业务来处理message对象
return message
},
// 按需实现其他接口
}
RongIM.getInstance().messageService().setMessageInterceptor(intercept)