【环信集成教程】环信的那些”已读“功能实现及问题解决

news2024/11/26 9:49:31

写在前面

在调用环信的消息回执时,是否有以下的烦恼

1、发送了消息已读回执,为什么消息列表页的未读数没有发生变化?
2、发送了消息已读回执,为什么消息漫游拉取不到已读状态?
如果你有这些烦恼,那就继续往下看

一些歧义

在这之前,我们需要先来统一确定两件事情
第一:消息列表页
第二:聊天页面
接下来以环信vue-demo为例,看一下这两者
在这里插入图片描述
如图所示,红色圈起来的部分为消息列表页也叫会话列表页面,可通过会话列表的api拉取。
绿色圈起来的部分为聊天页面,可通过消息漫游的api拉取

注:聊天页面的数据获取不是必须调用消息漫游api,也可以存在本地从本地进行获取,这个可根据自己项目的需求以及业务逻辑来做调整,本文以消息漫游中的数据为例

插播:会话是什么,当和一个用户或者在一个群中发消息后,就会自动把对方加到会话列表中,可以通过调用会话列表去查询。

需要注意
1、此api调用有延迟,建议只有初次登录时通过此api获取到初始会话列表的数据,后续都在本地进行维护。
2、登陆ID不要大小写混用的ID,拉取会话列表大小写ID混用会出现拉取会话列表为空

解决问题一:

在明确了会话列表页和聊天页面各代指的部分之后,我们先来解决第一个问题:
发送了消息已读回执,为什么会话列表的未读数没有变化
原因:对于环信来讲,消息是消息,会话是会话,这是两个概念,消息已读和会话已读并没有做联动,也就是消息已读只是对于这条消息而言并不会对会话列表的未读数产生影响,他们是两个独立的个体。会话列表的未读数是针对整个会话而言

那么如何清除会话列表的未读数呢?——需要发送会话已读回执也就是channel ack,这里还需要注意一点,sdk是只负责数据传输的,改变不了页面层的渲染逻辑。所以在发送完channel ack后页面上渲染的未读数不会无缘无故就清0了,是需要重新调用api渲染的!!!!!

channelAck() {
      let option = {
        chatType: "", // 会话类型,设置为单聊。
        type: "channel", // 消息类型。固定参数固定值,不要动它
        to: "", // 接收消息对象(用户 ID)。
      };
      let msg = WebIM.message.create(option);
      WebIM.conn
        .send(msg)
        .then((res) => {
          console.log("%c>>>>>>>>会话已读回执发送成功", "color:#6ad1c7", res);
        })
        .catch((e) => {
          console.log("%c>>>>>>>>>会话已读回执发送失败", "color:#ef8784", e);
        });
    },

会话已读回执发送成功之后,接收方会收到onChannelMessage回调监听

conn.addEventHandler("customEvent", {
onChannelMessage: (message) => {},
});

消息已读回执是需要发送readack,是针对于某一条消息而言。这里也需要注意一点,sdk是只负责数据传输的,改变不了页面层的渲染逻辑,所以已读未读在页面上的渲染也是需要自己处理一下

readAck() {
let option = {
type: "read", // 消息是否已读。固定参数固定值,不要动它
chatType: "singleChat", // 会话类型,这里为单聊。
to: "", // 消息接收方(用户 ID)。
id: "", // 需要发送已读回执的消息 ID。
};
let msg = WebIM.message.create(option);
WebIM.conn
.send(msg)
.then((res) => {
console.log("%c>>>>>>>>消息已读回执发送成功", "color:#6ad1c7", res);
})
.catch((e) => {
console.log("%c>>>>>>>>>消息已读回执发送失败", "color:#ef8784", e);
});
},

消息已读回执发送成功之后,接收方会收到onReadMessage回调监听

conn.addEventHandler("customEvent", {
onReadMessage: (message) => {},
});

插播:会话列表未读数计算规则,简单理解,如果这个会话是单个用户在一直输出的话,这个未读数会一直累加,但是只要对方回了这条消息,那么未读数就会从这条消息之后开始再计算

解决问题二:

再来看一下第二个问题:为什么消息漫游中拉取不到消息的已读状态
原因:环信服务器是不记录消息状态的,也就是不会记录这条消息是否已读了,所以不会返回消息已读或者未读
那么如何来实现
1、自己本地进行记录消息状态
2、可以使用环信sdk提供的reaction功能来间接是实现已读未读

reaction实现已读未读简单示例

addReaction() {
WebIM.conn
.addReaction(
{
messageId: "",//消息ID
reaction: "read" //reaction
}
)
.then((res) => {
console.log("%c>>>>>>>>reaction添加成功", "color:#6ad1c7", res);
})
.catch((e) => {
console.log("%c>>>>>>>>>reaction添加失败", "color:#ef8784", e);
});
},

在这里插入图片描述

总结Q&A

Q:发送了消息已读回执,为什么消息列表页的未读数没有发生变化?
A:会话和消息是两个概念,会话已读是会话已读,消息已读是消息已读,消息已读无法改变会话列表的数据

Q:发送了消息已读回执,为什么消息漫游拉取不到已读状态?
A:环信的服务器不记录消息状态,需要自己本地存储或者使用reaction功能间接实现

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/750238.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大量SDK设备接入时,如何巧妙配置EasyCVR平台参数?

EasyCVR视频融合平台可支持海量视频的轻量化接入与汇聚管理。在视频能力上,EasyCVR可实现视频直播、录像、回放、检索、云存储、告警上报、语音对讲、电子地图、集群、智能分析以及平台级联等。平台支持多协议接入,包括国标GB28181、RTMP、RTSP/Onvif、海…

【QT/OpenCV】QT实现张正友相机标定

相机标定 01、相机标定02、OpenCV函数及其张正友标定法2.1、相机标定步骤2.2、相机标定相关函数2.2.1 提取角点--- findChessboardCorners2.2.2 亚像素角点提取1--- find4QuadCornerSubpix2.2.3 亚像素角点提取2--- cornerSubPix2.2.4 绘制内角点 --- drawChessboardCorners2.2…

操作系统复习(非抢占式的优先数调度算法)

今天在写题目的时候遇到了一个问题,在非抢占式的优先数调度算法中,存在一种情况。优先级相同,并且同时到达,这种情况下,短作业优先。例如: 这种情况下,调度顺序为:P1、P2、P4、P3。

终极实时测试工具:NCrunch 4.17 for vs19-22 Crack

适用于 .NET 的终极实时测试工具 在编码时以内联方式查看实时测试结果和指标。 Visual Studio 的自动并发测试 NCrunch 是一个全自动测试扩展,旨在使编码和测试变得轻而易举。 忘记停下来运行测试,让 NCrunch 为您完成工作。 以您认为的速度编码和测试…

记录一个AFR去嵌S参数异常的案例。

最近在使用AFR去嵌一个S参数的时候,遇到了如下问题: 首先介绍一下这个S参数,一端是MCIO连接器,另一端是CEM连接器,所以测试的时候一端接MCIO测试治具,一端接CEM测试治具,再通过线缆将测试治具连…

c++--继承

1.什么是继承 C有面向对象三大特性,封装,继承,多态,封装。而继承就是代码可以复用的重要手段。他可以让程序员在原有类的基础上进行扩展,增加功能,产生新的类,称为子类或派生类,继承…

【监控系统】Prometheus监控组件Node-Exporter配置实战

这一节,我们来配置一下Node-Exporter,那么我们先来了解一下什么是Prometheus的Exporter? 任何向Prometheus提供监控样本数据的程序都可以被称为一个Exporter,它是一种用于将不同数据源的指标提供给Prometheus进行收集和监控的工具…

会议口译服务,如何做好长交传翻译?

如何做好长交传翻译工作?我们知道,长交传是会议口译中常见的一种翻译方式,难度比较大,需要不间断的听取长度为3至5分钟的段落然后进行口译。那么,在进行长交传翻译练习中,如何提升交传口译的能力&#xff0…

Linux系统使用(超详细)

目录 Linux操作系统简介 Linux和windows区别 Linux常见命令 Linux目录结构 Linux命令提示符 常用命令 ls cd pwd touch cat echo mkdir rm cp mv vim vim的基本使用 grep netstat Linux面试题 Linux操作系统简介 Linux操作系统是和windows操作系统是并列…

JavaScript--改变 HTML 的值

要改变 HTML 元素的值,可以使用以下方法: 1.使用元素节点的 innerText 属性来改变元素的文本内容。 例如:element.innerText 新的文本内容; 2.使用元素节点的 innerHTML 属性来改变元素的 HTML 内容。 例如:element.innerHTML …

ModaHub魔搭社区:Zilliz Cloud 版本类型和价格计算器教程

目录 企业版 专有部署 价格计算器 在配置集群前,您需要先选择版本。Zilliz Cloud 各版本提供不同的服务体验、计费模型,且性能及可扩展性也都有所不同 。目前, Zilliz Cloud 共有 2 个版本可供选择,以满足多样的用户需求。 企业版专有部署2 个不同的版本为不同的用户需求…

python pytest脚本执行工具

pytest脚本执行工具 支持获取当前路径下所有.py脚本 添加多个脚本,一起执行 import tkinter as tk from tkinter import filedialog import subprocess import os from datetime import datetimedef select_script():script_path filedialog.askopenfilename(fil…

Redis 从入门到精通【进阶篇】之高可用哨兵机制(Redis Sentinel)详解

文章目录 0.前言1. 原理详解1.1. 哨兵机制的组建1.1. 哨兵是如何知道从库的信息 1.2. 主库下线的判定1.3. 哨兵集群选举1.4. 故障的转移 2. 总结3. Redis从入门到精通系列文章4. Redis哨兵模式面试题4. 1. 什么是Redis的哨兵模式?4. 2. 哨兵模式的优点是什么&#x…

云原生TDengine-v3.0部署手册

云原生TDengine-v3.0部署手册 一、管理namespace1.1 创建namespace1.2 namespaces列表 二、配置3份yaml文件2.1 tdengine3-storage-class.yaml2.2 taosd-service.yaml2.3 taosd-tdengine.yaml 三、服务部署3.1 部署StorageClass3.2 部署Service3.3 部署StatefulSet3.4 查看启动…

Linux--环境变量

指令分为两种: ①路径指令 比如我们都知道输入ls的作用是显示当前文件及目录,并且ls的路径是/usr/bin/ls。那么我输入ls与/usr/bin/ls的作用是等价的。之所以带路径,是因为不带路径找不到命令 ②系统指令 ls就是嵌入了环境变量后&#xff0c…

C语言程序设计——指针

一、字符指针 字符指针char*两种使用方法: //用法一:指向一个字符变量 char ch a; char* pc &ch; //用法二:指向一个字符串首地址 const char* p "abcde"; //注意p存储的是字符串的首地址,也就是字符a的地址。 …

基于node.js和Vue3的医院信息管理挂号系统

随着时代的发展,无线互联网技术的应用和普及给人们的生活带来了极大的改变,现在信息技术不仅可以提高我们的工作效率,还能有效的规避一些错误风险,节约人力成本。我国国民一方面对健康的要求越来越重视了,另一方面现代人的健康问题日益严重,所以医院信息…

【imarkdown】一个轻量级markdown图片链接转换器

imarkdown imarkdown是一个轻量级markdown图片链接转换器,你可以轻松地对图片链接进行本地到图片服务器、图片服务器到本地、图片服务器到图片服务器的转换。 因为语雀转markdown的时候图片存在防外链行为,如果想要把转出的markdown发表在其他平台&…

电子电路基础知识--电阻

视频教程 薄膜电阻 (包括碳膜电阻、合成碳膜电阻、金属氧化膜电阻、玻璃釉膜电阻)… 碳膜电阻 气态碳氢化合物在高温和真空中分解,碳沉积在蜜挂或者瓷管上,形成一层结晶碳膜。改变碳膜厚度和用刻槽的方法变更碳膜的长度&#…