ZIM SDK 支持会话内回复消息功能,即引用接收到的某一条消息进行针对性的回复,形成起始于该消息的消息回复树状结构。通过此功能,用户可针对某一条消息进行提问、反馈或补充相关背景信息。
本功能涉及概念如下:
以群聊会话消息 A、B 和 C 为例:
在实现“回复消息”功能之前,请确保:
登录 ZIM 后,用户可以监听 onReceivePeerMessage 和 onReceiveGroupMessage 回调接收单聊会话和群聊会话的新消息,或调用 queryHistoryMessage 接口拉取历史消息。
此时,用户可以选择其中某条消息进行回复,即将该消息作为 toOriginMessage
参数,并构造一个消息作为回复内容作为 message
参数,调用 replyMessage 接口。
上述 toOriginMessage
和 message
都仅支持以下类型:
通过 ZIMMessageSendNotification 返回以下几个信息:
// 回复内容
ZIMTextMessage textMessage = ZIMTextMessage(message: '消息内容');
ZIMMessageSendConfig config = ZIMMessageSendConfig();
// 设置消息优先级
config.priority = ZIMMessagePriority.low;
ZIMMessageSendNotification notification = ZIMMessageSendNotification();
notification.onMessageAttached = (ZIMMessage message){
// 发送前的回调,客户可以在这里获取一个临时对象,该对象与开发者创建的 zimMessage 对象属于同一对象,开发者可利用此特性做一些业务逻辑,如提前展示 UI 等
};
notification.onMediaUploadingProgress = (ZIMMessage message, int currentFileSize, int totalFileSize){
// 若发送的回复消息为媒体消息,则可以监听媒体附件的上传进度
};
ZIM.getInstance()?.replyMessage(textMessage, toOriginalMessage, config, notification).then((value) {
//发送成功
}).catchError((onError){
//发送失败
});
监听 onReceivePeerMessage 和 onReceiveGroupMessage 回调在单聊会话和群聊会话中收到新消息后,需要通过判断消息是否存在 repliedInfo(源消息基本信息):
当您获取到 repliedInfo,可用于展示源消息的发送用户、发送时间和消息内容等。
//注册 ZIMEventHander 回调
ZIMEventHandler.onReceivePeerMessage = (ZIM zim, List<ZIMMessage> messageList, String fromUserID) {
for (ZIMMessage message in messageList) {
if (message.repliedInfo != null) {
// 此回复消息引用的源消息的基本信息,用于展示源消息的发送者、发送时间、消息内容等
}
}
};
ZIMEventHandler.onReceiveGroupMessage = (ZIM zim, List<ZIMMessage> messageList, String fromGroupID) {
for (ZIMMessage message in messageList) {
if (message.repliedInfo != null) {
// 此回复消息引用的源消息的基本信息,用于展示源消息的发送者、发送时间、消息内容等
}
}
};
ZIM 支持主动或被动获取某条根消息的回复数。
如需主动获取某条根消息的回复数,可直接通过 ZIMMessage > rootRepliedCount 获取。
如需实时了解根消息收到了多少条回复,您可以监听 onMessageRepliedCountChanged。
// 监听根消息的回复数量变化
// 事件触发时机:当有新的消息回复成功后,其回复树的根消息的回复数量会增加 1
ZIMEventHandler.onMessageRepliedCountChanged = (ZIM zim, List<ZIMMessageRootRepliedCountInfo> infos) {
// 更新会话的对应 messageID 的消息的 rootRepliedCount
};
监听 onMessageRepliedInfoChanged 回调,即可在某条消息被删除或被撤回时,获取该消息的下一级子消息列表,您可以在相关子消息 UI 上展示相关提示。
即使用户在某设备删除源消息,导致子消息的 repliedInfo.state(其源消息的状态)为 ZIMMessageRepliedInfoState.deleted,依然可以在子消息的 repliedInfo.messageInfo 中获取到源消息的简要内容。因此,开发者可按需选择是否在该设备展示该源消息内容。
// 监听回复消息的源消息变更事件
// 事件触发时机:当源消息被 “删除” 和 “撤回” 后,引用其的回复消息的 repliedInfo 属性会发生改变
ZIMEventHandler.onMessageRepliedInfoChanged = (ZIM zim, List<ZIMMessage> messageList) {
for(ZIMMessage message in messageList) {
if(message.repliedInfo == null) {
// 此回复消息引用的源消息被删除,此时可展示为“消息被删除”
} else if (message.repliedInfo?.messageInfo.type == ZIMMessageType.revoke) {
// 此回复消息引用的源消息被撤回,此时可展示为“消息已撤回”
}
}
};
调用 queryMessageRepliedList,传入根消息或任意回复,即可查看完整的回复列表,了解回复相关的完整消息列表。
本接口返回的结果将区分根消息(rootRepliedInfo
)和回复列表(messageList
),回复列表会按照回复的发送时间从前往后排序。
ZIMMessageRepliedListQueryConfig config = ZIMMessageRepliedListQueryConfig();
config.count = 10; // 查询数量,上限请勿超过 100
config.nextFlag = 0; // 分页标志,首次查询填 0,后续查询以查询结果返回的 nextFlag 为准
// replyMessage 可为根消息或任意回复,一般通过 queryHistoryMessage 接口或者 onReceivePeerMessage 和 onReceiveGroupMessage 获取
ZIM.getInstance()?.queryMessageRepliedList(replyMessage, config).then((value) {
// 查询成功
// nextFlag 不为 0,表示还有数据,可继续分页查询
// rootRepliedInfo 为根消息信息
// messageList 表示对根消息的回复列表。
}).onError((error, stackTrace) {
if(error is PlatformException){
// 查询失败
error.code;
error.message;
}
});
由于子消息(即作为回复的消息)的 repliedInfo 仅包含可用于 UI 展示的基本源消息数据,用户可能需要前往源消息的原文位置,阅读源消息附近的其他消息。
因此,如需实现此场景,需要借助子消息的 repliedInfo.messageSeq(源消息在会话中的序号)属性。
子消息的 repliedInfo.messageSeq(源消息在会话中的序号)属性,对应源消息的 messageSeq。
根据源消息及其附近消息是否缓存于应用内存,ZIM 提供了两种实现方案。
当某条源消息及其上下文消息都保存于您应用的内存中时(比如,此前以调用 queryHistoryMessage 获取并缓存了会话历史消息),您可在内存检索该源消息的 messageSeq,自行实现前往源消息原文位置查看上下文的业务逻辑。
当应用内存中没有源消息或其附近的消息时,此时,会话中若有其他用户回复了该源消息,即可:
从该消息的 repliedInfo.messageSeq 获取到源消息的 messageSeq 并作为参数,传入 queryMessages 获取源消息的完整 ZIMMessage 对象。
// messageSeq 为源消息的在会话中的序号
List<int> messageSeqs = [123456];
ZIM.getInstance()?.queryMessages(messageSeqs, 'conversationID', ZIMConversationType.peer).then((value) {
// 查询成功
}).catchError((onError){
if(onError is PlatformException){
// 查询失败
error.code;
error.message;
}
});
将源消息对象作为 nextMessage 参数,传入 queryHistoryMessage,即可以该源消息为锚点,从该源消息往前或往后获取其附近的消息列表,用于 UI 渲染。
// 本示例以源消息往后查询为例
ZIMMessageQueryConfig config = ZIMMessageQueryConfig();
// originalMessage 为通过 queryMessages 获取到的源消息对象
config.nextMessage = originalMessage;
config.count = 20;
config.reverse = false;
ZIM.getInstance()?.queryHistoryMessage("YOUR_CONVERSATION_ID", ZIMConversationType.peer, config).then((value) {
// 查询成功
}).catchError((onError){
if(onError is PlatformException){
// 查询失败
}
});
联系我们
文档反馈