消息转发

更新时间: 2024/08/22 10:11:37

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

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

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

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

前提条件

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

频控限制

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

转发单条消息

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

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

API调用时序

uml diagram

实现流程

以下仅介绍主要步骤,登录等常见步骤省略,具体请参考登录 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/小程序/Harmony

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

    示例代码:

    Web/uni-app/小程序
    typescriptnim.V2NIMMessageService.on("onReceiveMessages", function (messages: V2NIMMessage[]) {});
    
    Harmony
    typescriptnim.messageService.on("onReceiveMessages", function (messages: V2NIMMessage[]) {})
    
  2. 用户 A 调用 createTextMessage 方法构造一条文本消息,然后调用 sendMessage 方法发送给用户 B。

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

    示例代码:

    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
    }
    
    Harmony
    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
    }
    
  3. 用户 B 调用 createForwardMessage 构建一条转发消息,调用时将 message 参数设置为接收到的消息 V2NIMMessage

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

    示例代码:

    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
    }
    
    Harmony
    javascripttry {
        const newMessage = nim.messageCreator.createForwardMessage(message)
    } catch(err) {
        // todo error
    }
    
  4. 用户 B 调用 sendMessage 方法,将转发消息发送给用户 C。

    参数说明:

    Android
    参数名称 类型 是否必填 默认值 描述
    message V2NIMMessage - 消息对象,通过调用 createForwardMessage 接口创建。如果为空或不存在则返回 191004 参数错误。
    conversationId String - 会话 ID,通过调用 V2NIMConversationIdUtil 的对应函数创建。
    组成方式:发送者用户账号|会话类型(V2NIMConversationType)|接收者用户账号或群组 ID。此处的接收者需要设为用户 C。如果为空或不存在则返回 191004 参数错误。
    params V2NIMSendMessageParams null 消息发送配置参数,包括发送、推送、抄送、反垃圾等配置。
    success V2NIMSuccessCallback - 消息发送成功回调,返回 V2NIMSendMessageResult
    failure V2NIMFailureCallback - 消息发送失败回调,返回错误码。
    progress V2NIMProgressCallback null 附件上传进度回调,用于图片、语音、视频、文件类型消息。
    iOS
    参数名称 类型 是否必填 默认值 描述
    message V2NIMMessage - 消息对象,通过调用 createForwardMessage 接口创建。如果为空或不存在则返回 191004 参数错误。
    conversationId NSString * - 会话 ID,通过调用 V2NIMConversationIdUtil 的对应函数创建。
    组成方式:发送者用户账号|会话类型(V2NIMConversationType)|接收者用户账号或群组 ID。此处的接收者需要设为用户 C。如果为空或不存在则返回 191004 参数错误。
    params V2NIMSendMessageParams null 消息发送配置参数,包括发送、推送、抄送、反垃圾等配置。
    success V2NIMSuccessCallback - 消息发送成功回调,返回 V2NIMSendMessageResult
    failure V2NIMFailureCallback - 消息发送失败回调,返回错误码。
    progress V2NIMProgressCallback null 附件上传进度回调,用于图片、语音、视频、文件类型消息。
    macOS/Windows
    参数名称 类型 是否必填 默认值 描述
    message V2NIMMessage - 消息对象,通过调用 createForwardMessage 接口创建。如果为空或不存在则返回 191004 参数错误。
    conversationId nstd::string - 会话 ID,通过调用 V2NIMConversationIdUtil 的对应函数创建。
    组成方式:发送者用户账号|会话类型(V2NIMConversationType)|接收者用户账号或群组 ID。此处的接收者需要设为用户 C。如果为空或不存在则返回 191004 参数错误。
    params V2NIMSendMessageParams null 消息发送配置参数,包括发送、推送、抄送、反垃圾等配置。
    success V2NIMSuccessCallback - 消息发送成功回调,返回 V2NIMSendMessageResult
    failure V2NIMFailureCallback - 消息发送失败回调,返回错误码。
    progress V2NIMProgressCallback null 附件上传进度回调,用于图片、语音、视频、文件类型消息。
    Web/uni-app/小程序
    参数名称 类型 是否必填 默认值 描述
    message V2NIMMessage - 消息对象,通过调用 createForwardMessage 接口创建。如果为空或不存在则返回 191004 参数错误。
    conversationId string - 会话 ID,通过调用 V2NIMConversationIdUtil 的对应函数创建。
    组成方式:发送者用户账号|会话类型(V2NIMConversationType)|接收者用户账号或群组 ID。此处的接收者需要设为用户 C。如果为空或不存在则返回 191004 参数错误。
    params V2NIMSendMessageParams null 消息发送配置参数,包括发送、推送、抄送、反垃圾等配置。
    progress V2NIMProgressCallback null 附件上传进度回调,用于图片、语音、视频、文件类型消息。
    Harmony
    参数名称 类型 是否必填 默认值 描述
    message V2NIMMessage - 消息对象,通过调用 createForwardMessage 接口创建。如果为空或不存在则返回 191004 参数错误。
    conversationId string - 会话 ID,通过调用 V2NIMConversationIdUtil 的对应函数创建。
    组成方式:发送者用户账号|会话类型(V2NIMConversationType)|接收者用户账号或群组 ID。此处的接收者需要设为用户 C。如果为空或不存在则返回 191004 参数错误。
    params V2NIMSendMessageParams null 消息发送配置参数,包括发送、推送、抄送、反垃圾等配置。
    progress V2NIMProgressCallback null 附件上传进度回调,用于图片、语音、视频、文件类型消息。

    示例代码:

    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
    }
    
    Harmony
    javascripttry {
        // 被转发的消息
        const newMessage = nim.messageCreator.createForwardMessage(message)
        // 发送消息
        const res = await nim.messageService.sendMessage(message, 'test1|1|test2');
        // todo success
    } catch (err) {
        // todo error
    }
    
  5. 用户 C 会通过回调接收到用户 B 转发的消息。

此文档是否对你有帮助?
有帮助
去反馈
  • 前提条件
  • 频控限制
  • 转发单条消息
  • API调用时序
  • 实现流程