Android

@消息实现方案

更新时间: 2025/11/18 16:10:17

网易云信 IM UIKit 支持消息@功能,若您需要使用简单的@功能,可以参考 IM UIKit 上使用的@逻辑,以实现简单的类微信的@功能。

本文主要介绍 IM UIKit 中实现消息@功能的逻辑。

效果展示

@消息是一种即时通讯功能,用户可以在群聊或频道中通过“@”符号提及特定用户或角色,被提及的用户会收到提醒通知,从而快速注意到相关消息。效果如下图所示:

image.png

方案介绍

@消息通过消息的扩展参数,保留@消息的相关内容。

在消息体中可以通过 getRemoteExtensionsetRemoteExtension 来获取和设置消息体中的远程传输的扩展参数,@消息的内容就以 Object 形式保存在该消息体中,数据格式如下:

json//@消息的 key 值
"yxAitMsg": {
    //被@的账号,如果是 @All 则为 ait_all
    "332917623668992": {
        "text": "@昵称01 ",//在消息中@的展示内容
        "segments": [{//在消息中@的展示位置
            "start": 0,//在消息中@的展示起始位置
            "end": 5,//在消息中@的展示终止位置
        }]
    }
}

在发送一条@消息时,会将上述@消息的内容,设置到该消息的 RemoteExtension 中。

实现流程

  1. 创建一条文本消息。

    javaV2NIMMessage textMessage = V2NIMMessageCreator.createTextMessage(content);
    
  2. 设置@信息和推送配置。

    java// 创建配置Builder 
    V2NIMMessagePushConfig.V2NIMMessagePushConfigBuilder pushConfigBuilder =
        V2NIMMessagePushConfig.V2NIMMessagePushConfigBuilder.builder();
    // 打开强推开关,并设置推送账号,@中的人都放在该列表中,@所有人则设置为空,则强推给群中所有人
    if (pushList != null && !pushList.isEmpty()) {
    pushConfigBuilder.withForcePush(true).withForcePushAccountIds(pushList);
    }
    V2NIMSendMessageParams.V2NIMSendMessageParamsBuilder paramsBuilder =
        V2NIMSendMessageParams.V2NIMSendMessageParamsBuilder.builder()
            .withPushConfig(pushConfigBuilder.build());
    
    //remoteExtension设置 @信息内容,格式参考上述JSON格式
    if (!TextUtils.isEmpty(remoteExtension)) {
    message.setServerExtension(remoteExtension);
    }
    

    @信息需要按照上述的 JSON 格式配置,如果使用 UIKit,则可以通过 AitManager 提供的方法。示例代码可参考 ChatBaseFragment 中 messageProxy 对象的 sendTextMessage方法 aitManager.getAitData

  3. 发送消息。

    javaChatRepo.sendMessage(
        message,
        conversationId,
        paramsBuilder.build(),
        new ProgressFetchCallback<V2NIMSendMessageResult>() {
        @Override
        public void onProgress(int progress) {
            ALog.d(LIB_TAG, TAG, "sendMessage progress -->> " + progress);
        }
    
        @Override
        public void onSuccess(@Nullable V2NIMSendMessageResult data) {
            ALog.d(LIB_TAG, TAG, "sendMessage onSuccess -->> ");
        }
    
        @Override
        public void onError(int errorCode, @Nullable String errorMsg) {
            ALog.d(
                LIB_TAG, TAG, "sendMessage onError -->> " + errorCode + " errorMsg:" + errorMsg);
        }
        });
    
  4. 接收方对接收到的消息进行解析。

    javaV2NIMMessageService v2MessageService = NIMClient.getService(V2NIMMessageService.class);
    
    V2NIMMessageListener messageListener = new V2NIMMessageListener() {
    
        @Override
        public void onSendMessage(V2NIMMessage message) {
            // 消息发送状态回调,消息发送中,发送失败或者成功都在这里回调
        }
    
        @Override
        public void onReceiveMessages(List<V2NIMMessage> messages) {
            // 接收消息
            //messages.get(0).getConversationId() 消息所在的会话ID,所有接收的消息都在这里回调
            // messages.get(0).getAttachment() 消息附件,自定义内容自行解析,SDK支持的消息自动转换
            if (message != null && message.getServerExtension() != null) {
            Map<String, Object> remoteExt =
                MessageExtensionHelper.parseJsonStringToMap(message.getServerExtension());
            if (remoteExt != null && remoteExt.containsKey(ChatKitUIConstant.AIT_REMOTE_EXTENSION_KEY)) {
                Object aitData = remoteExt.get(ChatKitUIConstant.AIT_REMOTE_EXTENSION_KEY);
                if (aitData instanceof Map) {
                JSONObject aitJson = new JSONObject((Map) aitData);
                if (jsonObject == null) {
                return null;
                }
                AtContactsModel model = new AtContactsModel();
                try {
                JSONArray jsonArray = jsonObject.names();
                for (int index = 0; jsonArray != null && index < jsonArray.length(); index++) {
                    String name = jsonArray.getString(index);
                    JSONObject block = jsonObject.getJSONObject(name);
                    model.aitBlocks.put(name, AitBlock.parseFromJson(block));
                }
                } catch (JSONException e) {
                ALog.e(LIB_TAG, TAG, "parseFromJson error: " + e.getMessage());
                }
                // model解析结果
            }
    }
    }
        }
    
        @Override
        public void onReceiveP2PMessageReadReceipts(List<V2NIMP2PMessageReadReceipt> readReceipts) {
    
        }
    
        @Override
        public void onReceiveTeamMessageReadReceipts(List<V2NIMTeamMessageReadReceipt> readReceipts) {
    
        }
    
        @Override
        public void onMessageRevokeNotifications(List<V2NIMMessageRevokeNotification> revokeNotifications) {
    
        }
    
        @Override
        public void onMessagePinNotification(V2NIMMessagePinNotification pinNotification) {
    
        }
    
        @Override
        public void onMessageQuickCommentNotification(V2NIMMessageQuickCommentNotification quickCommentNotification) {
    
        }
    
        @Override
        public void onMessageDeletedNotifications(List<V2NIMMessageDeletedNotification> messageDeletedNotifications) {
    
        }
    
        @Override
        public void onClearHistoryNotifications(List<V2NIMClearHistoryNotification> clearHistoryNotifications) {
    
        }
    };
    v2MessageService.addMessageListener(messageListener);
    
此文档是否对你有帮助?
有帮助
去反馈
  • 效果展示
  • 方案介绍
  • 实现流程