@消息实现方案
更新时间: 2025/11/18 16:10:17
网易云信 IM UIKit 支持消息@功能,若您需要使用简单的@功能,可以参考 IM UIKit 上使用的@逻辑,以实现简单的类微信的@功能。
本文主要介绍 IM UIKit 中实现消息@功能的逻辑。
效果展示
@消息是一种即时通讯功能,用户可以在群聊或频道中通过“@”符号提及特定用户或角色,被提及的用户会收到提醒通知,从而快速注意到相关消息。效果如下图所示:
方案介绍
@消息通过消息的扩展参数,保留@消息的相关内容。
在消息体中可以通过 getRemoteExtension 和 setRemoteExtension 来获取和设置消息体中的远程传输的扩展参数,@消息的内容就以 Object 形式保存在该消息体中,数据格式如下:
json//@消息的 key 值
"yxAitMsg": {
//被@的账号,如果是 @All 则为 ait_all
"332917623668992": {
"text": "@昵称01 ",//在消息中@的展示内容
"segments": [{//在消息中@的展示位置
"start": 0,//在消息中@的展示起始位置
"end": 5,//在消息中@的展示终止位置
}]
}
}
在发送一条@消息时,会将上述@消息的内容,设置到该消息的 RemoteExtension 中。
实现流程
-
创建一条文本消息。
java
V2NIMMessage textMessage = V2NIMMessageCreator.createTextMessage(content); -
设置@信息和推送配置。
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。 -
发送消息。
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); } }); -
接收方对接收到的消息进行解析。
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);
此文档是否对你有帮助?




