转发消息

更新时间: 2025/01/15 15:20:30

NetEase IM SDK(以下简称 NIM SDK)支持消息转发。

消息转发与发送不同类型(如文本、音频、视频等)的消息的方法一致,需要先构建待转发的消息(createForwardMessage),再调用 sendMessage 方法将其发送至目标会话。

本文主要介绍转发单条消息场景的实现过程。

  • 除了 通知消息提示消息机器人消息 以及 音视频通话 外,其他类型消息均支持转发给其他会话。
  • 转发的消息必须是已发送成功的消息。

支持平台

本文内容适用的开发平台或框架如下表所示:

Android iOS macOS/Windows Web/uni-app/小程序 Node.js/Electron HarmonyOS Flutter
✔️️️ ✔️️️ ✔️️️ ✔️️️ ✔️️️ ✔️️️ ✔️️️

前提条件

在实现消息转发之前,请确保:

  • 已初始化 SDK。
  • (如需转发消息至群组会话)已创建群组。
  • 已了解各消息类型的 使用限制

频控限制

发送消息(sendMessage)方法一分钟内默认最多可调用 300 次。

转发单条消息

本节通过以下 API 时序图中用户A、B、C 的消息交互场景为例,介绍转发单条消息的实现流程。

转发不同类型消息的实现方法类似,本节仅以转发一条文本消息为例进行介绍。

API调用时序

sequenceDiagram

par  步骤 1:发送方A登录 
用户A ->> NIM: 登录
end
par  步骤 2:转发方B注册监听并登录 
用户B ->> NIM: 监听消息接收<br>(addMessageListener)
用户B ->> NIM: 登录
end
par  步骤 3:被转发方C注册监听并登录 
用户C ->> NIM: 监听消息接收<br>(addMessageListener)
用户C ->> NIM: 登录
end
par  步骤 4:消息收发 
用户A ->> NIM: 构造消息<br>(createTextMessage)
用户A ->> NIM: 发送消息<br>(sendMessage)
NIM --> 用户B: 投递消息
end
par  步骤 5:转发消息
用户B ->> NIM: 构造转发消息<br>(createForwardMessage)
用户B ->> NIM: 发送消息<br>(sendMessage) 
NIM -->> 用户C: 投递消息
end

实现流程

以下仅介绍主要步骤,登录等常见步骤省略,具体请参考 登录 IM 章节。

  1. 用户 B 和 C 注册消息监听器,监听消息接收回调事件。

    Android/iOS/macOS/Windows

    用户 B 和 C 调用 addMessageListener 方法注册消息监听器,监听消息接收回调事件 onReceiveMessages

    示例代码:

    Android
    javaV2NIMMessageService v2MessageService = NIMClient.getService(V2NIMMessageService.class);
    
    V2NIMMessageListener messageListener = new V2NIMMessageListener() {
    
        @Override
        public void onReceiveMessages(List<V2NIMMessage> messages) {
    
        }
    };
    v2MessageService.addMessageListener(messageListener);
    
    iOS
    objective-c[[[NIMSDK sharedSDK] v2MessageService] addMessageListener:listener];
    
    macOS/Windows
    cppV2NIMMessageListener listener;
    listener.onReceiveMessages = [](nstd::vector<V2NIMMessage> messages) {
        // receive messages
    };
    messageService.addMessageListener(listener);
    

    Web/uni-app/小程序/Node.js/Electron/HarmonyOS

    用户 B 和 C 调用 on("EventName") 方法注册消息监听器,监听消息接收回调事件 onReceiveMessages

    示例代码:

    Web/uni-app/小程序
    typescriptnim.V2NIMMessageService.on("onReceiveMessages", function (messages: V2NIMMessage[]) {});
    
    Node.js/Electron
    typescriptv2.messageService.on("receiveMessages", function (messages: V2NIMMessage[]) {})
    
    HarmonyOS
    typescriptnim.messageService.on("onReceiveMessages", function (messages: V2NIMMessage[]) {})
    

    Flutter

    调用 add 方法注册消息监听器,监听消息接收回调事件 onReceiveMessages

    dartsubsriptions.add(
        NimCore.instance.messageService.onReceiveMessages.listen((event) {
    //do something
    }));
    
  2. 用户 A 调用 createTextMessage 方法构造一条文本消息,然后调用 sendMessage 方法发送给用户 B。

    用户 B 会通过回调接收到用户 A 发送的消息。

    示例代码:

    Android
    javaV2NIMMessageService v2MessageService = NIMClient.getService(V2NIMMessageService.class);
    // 创建一条文本消息
    V2NIMMessage v2Message = V2NIMMessageCreator.createTextMessage("xxx");
    // 以单聊类型为例
    String conversationId = V2NIMConversationIdUtil.conversationId("xxx", V2NIMConversationType.V2NIM_CONVERSATION_TYPE_P2P);
    // 发送消息
    v2MessageService.sendMessage(v2Message, conversationId, sendMessageParams,
            new V2NIMSuccessCallback<V2NIMSendMessageResult>() {
                @Override
                public void onSuccess(V2NIMSendMessageResult v2NIMSendMessageResult) {
                    // TODO: 发送成功
                }
            },
            new V2NIMFailureCallback() {
                @Override
                public void onFailure(V2NIMError error) {
                    // TODO: 发送失败
                }
            }
    );
    
    iOS
    objective-c// 创建一条文本消息
    V2NIMMessage *message = [V2NIMMessageCreator createTextMessage:@"v2 message"];
    V2NIMSendMessageParams *params = [[V2NIMSendMessageParams alloc] init];
    // 发送消息
    [[[NIMSDK sharedSDK] v2MessageService] sendMessage:message 
                                        conversationId:@"conversationId"
                                                params:params
                                            success:^(V2NIMSendMessageResult * _Nonull result) {
                                                // 发送成功回调
                                                }
                                            failure:^(V2NIMError * _Nonnull error) {
                                                // 发送失败回调, error 包含错误原因
                                                }
    }];                      
    
    macOS/Windows
    cpp// 以单聊类型为例
    auto conversationId = V2NIMConversationIdUtil::p2pConversationId("target_account_id");
    // 创建一条文本消息
    auto message = V2NIMMessageCreator::createTextMessage("hello world");
    auto params = V2NIMSendMessageParams();
    // 发送消息
    messageService.sendMessage(
        message,
        conversationId,
        params,
        [](V2NIMSendMessageResult result) {
            // send message succeeded
        },
        [](V2NIMError error) {
            // send message failed, handle error
        });
    
    Web/uni-app/小程序
    typescripttry {
    // 创建一条文本消息
    const message: V2NIMMessage = nim.V2NIMMessageCreator.createTextMessage("hello");
    // 发送消息
    const res: V2NIMSendMessageResult = await nim.V2NIMMessageService.sendMessage(message, 'test1|1|test2');
    // todo success
    } catch (err) {
    // todo error
    }
    
    Node.js/Electron
    typescriptconst message = v2.messageCreator.createTextMessage('Hello NTES IM')
    const result = await v2.messageService.sendMessage(message, conversationId, params, progressCallback)
    
    HarmonyOS
    typescripttry {
    // 创建一条文本消息
    const message: V2NIMMessage = nim.messageCreator.createTextMessage("hello")
    // 发送消息
    const res: V2NIMSendMessageResult = await nim.messageService.sendMessage(message, 'test1|1|test2')
    // todo Success
    } catch (err) {
    // todo error
    }
    
    Flutter
    dartawait MessageCreator.createTextMessage(text);
    await NimCore.instance.messageService.sendMessage(message, conversationId, params);
    
  3. 用户 B 调用 createForwardMessage 构建一条转发消息,调用时将 message 参数设置为接收到的消息。

    调用 createForwardMessage 方法成功后,会重新返回一个消息体(转发消息体)。

    示例代码:

    Android
    java// V2NIMMessage v2Message = ; // 被转发的消息
    V2NIMMessage v2ForwardMessage = V2NIMMessageCreator.createForwardMessage(v2Message);
    
    iOS
    objective-cV2NIMMessage *message = [V2NIMMessageCreator createForwardMessage:originalMessage];
    
    macOS/Windows
    cppauto forwardMessage = V2NIMMessageCreator::createForwardMessage(message);
    if (!forwardMessage) {
        // create forward message failed
    }
    
    Web/uni-app/小程序
    javascripttry {
        const newMessage = nim.V2NIMMessageCreator.createForwardMessage(message);
    } catch (err) {
        // todo: error
    }
    
    Node.js/Electron
    typescripttry {
        const message = v2.messageCreator.createForwardMessage(message)
    } catch(err) {
        // todo error
    }
    
    HarmonyOS
    javascripttry {
        const newMessage = nim.messageCreator.createForwardMessage(message)
    } catch(err) {
        // todo error
    }
    
    Flutter
    dartawait MessageCreator.createForwardMessage(message);
    
  4. 用户 B 调用 sendMessage 方法,将转发消息发送给用户 C。

    Android
    javaV2NIMMessageService v2MessageService = NIMClient.getService(V2NIMMessageService.class);
    // V2NIMMessage v2Message = ; // 被转发的消息 
    V2NIMMessage v2ForwardMessage = V2NIMMessageCreator.createForwardMessage(v2Message);
    // 以单聊类型为例
    String conversationId = V2NIMConversationIdUtil.conversationId("xxx", V2NIMConversationType.V2NIM_CONVERSATION_TYPE_P2P);
    // 发送消息
    v2MessageService.sendMessage(v2Message, conversationId, sendMessageParams,
            new V2NIMSuccessCallback<V2NIMSendMessageResult>() {
                @Override
                public void onSuccess(V2NIMSendMessageResult v2NIMSendMessageResult) {
                    // TODO: 发送成功
                }
            },
            new V2NIMFailureCallback() {
                @Override
                public void onFailure(V2NIMError error) {
                    // TODO: 发送失败
                }
            }
    );
    
    iOS
    objective-c// 被转发的消息
    V2NIMMessage *message = [V2NIMMessageCreator createForwardMessage:originalMessage];
    V2NIMSendMessageParams *params = [[V2NIMSendMessageParams alloc] init];
    // 发送消息
    [[[NIMSDK sharedSDK] v2MessageService] sendMessage:message 
                                        conversationId:@"conversationId"
                                                params:params
                                            success:^(V2NIMSendMessageResult * _Nonull result) {
                                                // 发送成功回调
                                                }
                                            failure:^(V2NIMError * _Nonnull error) {
                                                // 发送失败回调, error 包含错误原因
                                                }
    }];                      
    
    macOS/Windows
    cpp// 以单聊类型为例
    auto conversationId = V2NIMConversationIdUtil::p2pConversationId("target_account_id");
    // 被转发的消息
    auto forwardMessage = V2NIMMessageCreator::createForwardMessage(message);
    auto params = V2NIMSendMessageParams();
    // 发送消息
    messageService.sendMessage(
        message,
        conversationId,
        params,
        [](V2NIMSendMessageResult result) {
            // send message succeeded
        },
        [](V2NIMError error) {
            // send message failed, handle error
        });
    
    Web/uni-app/小程序
    javascripttry {
        // 被转发的消息
        const newMessage = nim.V2NIMMessageCreator.createForwardMessage(message);
        // 发送消息
        const res = await nim.V2NIMMessageService.sendMessage(message, 'test1|1|test2');
        // todo success
    } catch (err) {
        // todo error
    }
    
    Node.js/Electron
    typescriptconst message = v2.messageCreator.createForwardMessage(message)
    const result = await v2.messageService.sendMessage(message, conversationId, params, progressCallback)
    
    HarmonyOS
    javascripttry {
        // 被转发的消息
        const newMessage = nim.messageCreator.createForwardMessage(message)
        // 发送消息
        const res = await nim.messageService.sendMessage(message, 'test1|1|test2');
        // todo success
    } catch (err) {
        // todo error
    }
    
    Flutter
    dartawait NimCore.instance.messageService.sendMessage(message, conversationId, params);
    
  5. 用户 C 会通过回调接收到用户 B 转发的消息。

涉及接口

Android/iOS/macOS/Windows
API 说明
addMessageListener 注册消息相关监听器
removeMessageListener 取消注册消息相关监听器
createXXXMessage 消息构建,包括创建一条文本/图片/语音/视频/文件/地理/提示/自定义消息
createForwardMessage 构建一条转发消息
sendMessage 发送消息
Web/uni-app/小程序/Node.js/Electron/HarmonyOS
API 说明
on("EventName") 注册消息相关监听器
off("EventName") 取消注册消息相关监听器
createXXXMessage 消息构建,包括创建一条文本/图片/语音/视频/文件/地理/提示/自定义消息
createForwardMessage 构建一条转发消息
sendMessage 发送消息
Flutter
API 说明
add 注册消息相关监听器
cancel 取消注册消息相关监听器
createXXXMessage 消息构建,包括创建一条文本/图片/语音/视频/文件/地理/提示/自定义消息
createForwardMessage 构建一条转发消息
sendMessage 发送消息
此文档是否对你有帮助?
有帮助
去反馈
  • 支持平台
  • 前提条件
  • 频控限制
  • 转发单条消息
  • API调用时序
  • 实现流程
  • 涉及接口