微信小程序(uniapp)搭建腾讯云 IM 消息撤回
2025-10-05 08:13 tlnshuju 阅读(0) 评论(0) 收藏 举报uniapp 实现腾讯云 IM 消息撤回功能实战指南
一、功能实现原理
腾讯云 IM 的消息撤回功能通过 消息修订(Message Revision) 机制实现,核心流程如下:
- 发送方调用撤回 API 删除指定消息
- 云端生成撤回通知消息(类型为
TIM.TYPES.MSG_REVOKED
) - 接收方收到通知后执行本地消息删除
- 全平台自动同步消息状态(需开启消息漫游)
二、核心实现步骤
1. 发送方撤回逻辑
// services/im.js
export
async
function revokeMessage(message
) {
const tim = initIM(
)
try {
// 执行消息撤回操作
const res =
await tim.revokeMessage(message)
// 更新本地消息状态(立即生效)
if (res.data.revokeMessage) {
const conv = tim.getConversationProfile(message.conversationID)
conv.setMessageRevoked(message.clientMsgID)
}
return res
}
catch (error) {
console.error('撤回失败:'
, error)
throw
new Error('消息撤回失败,请检查网络'
)
}
}
2. 接收方消息处理
// 消息监听器(全局注册)
export
function setupMessageListener(callback
) {
const tim = initIM(
)
tim.on(tim.EVENT.MESSAGE_RECEIVED
, (event
) =>
{
event.data.forEach(msg =>
{
// 处理撤回通知
if (msg.type === tim.TYPES.MSG_REVOKED
) {
handleRevokeNotice(msg)
return
}
callback(msg)
}
)
}
)
}
// 撤回通知处理
function handleRevokeNotice(notice
) {
const {
revokedMessageClientMsgID, operator
} = notice.payload
// 查找本地对应消息
const conversation = tim.getConversationProfile(notice.conversationID)
const originalMsg = conversation.getMessage(revokedMessageClientMsgID)
if (!originalMsg)
return
// 权限验证(仅允许发送者撤回)
if (originalMsg.from !== operator.userID) {
console.warn('非法撤回操作'
, operator)
return
}
// 执行本地删除
conversation.deleteMessage(revokedMessageClientMsgID)
// 触发UI更新(示例)
uni.$emit('message-revoked'
, {
conversationID: notice.conversationID,
clientMsgID: revokedMessageClientMsgID
}
)
}
3. UI 层集成示例
<template><view class="message-list"><viewv-for="(msg, index) in messages":key="msg.clientMsgID"class="message-item"><!-- 消息内容 --><template v-if="!msg.isRevoked">{{ msg.payload.text }}</template><!-- 撤回提示 --><view v-else class="revoked-tip">"{{ msg.payload.description }}" 已被撤回</view><!-- 长按操作菜单 --><viewv-if="canRevoke(msg)"class="action-menu"@longpress="showActionSheet(msg)">⋮</view></view></view></template><script>exportdefault {data() {return {messages: []}},methods: {// 权限校验canRevoke(msg) {return msg.from ===this.currentUser.userID &&!msg.isRevoked &&Date.now() - msg.time <2 * 60 * 1000 // 2分钟内可撤回},// 执行撤回async handleRevoke(msg) {try {await revokeMessage(msg)uni.showToast({title: '撤回成功', icon: 'none'})}catch (error) {uni.showToast({title: error.message, icon: 'none'})}}}}</script>
三、关键问题处理
1. 撤回时间限制
// 配置中心(建议)
const IM_CONFIG = {
REVOKE_TIME_LIMIT: 2 * 60 * 1000 // 2分钟
}
// 权限校验时使用
if (Date.now(
) - msg.time >
IM_CONFIG.REVOKE_TIME_LIMIT
) {
throw
new Error('超过可撤回时间'
)
}
2. 消息状态同步
// 消息漫游配置(初始化时)
tim = TIM.create({
SDKAppID: config.SDKAppID
}
)
// 开启消息漫游(需在控制台配置)
tim.setMessageRevokeMode({
mode: TIM.TYPES.REVOKE_MODE_SENDER
, // 仅发送方可撤回
syncOtherMachine: true // 同步到其他端
}
)
3. 异常场景处理
// 撤回失败重试机制
export
async
function revokeWithRetry(msg, retries = 3
) {
try {
return
await revokeMessage(msg)
}
catch (error) {
if (retries <= 0
)
throw error
await
new Promise(resolve =>
setTimeout(resolve, 1000
)
)
return revokeWithRetry(msg, retries - 1
)
}
}
四、高级功能扩展
1. 富媒体消息撤回
// 自定义撤回描述(图片/文件等)
function getRevokeDescription(msg
) {
switch(msg.type) {
case TIM.TYPES.MSG_IMAGE:
return '[图片]'
case TIM.TYPES.MSG_FILE:
return '[文件]'
case TIM.TYPES.MSG_CUSTOM:
return JSON.parse(msg.payload.data).description || '[自定义消息]'
default:
return msg.payload.text || '[未知消息]'
}
}
2. 撤回动画效果
/* 添加CSS过渡 */
.message-item.revoking {
animation: fadeOut 0.3s forwards;
}
@keyframes fadeOut {
to {
opacity: 0;
transform: translateX(20px)
;
}
}
3. 服务端日志记录
// 撤回事件上报(示例)
async
function logRevokeEvent(msg, operator
) {
await axios.post('/api/im/revoke-log'
, {
sdk_app_id: process.env.SDKAppID,
group_id: msg.groupID,
operator_id: operator.userID,
target_msg_id: msg.clientMsgID,
timestamp: Date.now(
)
}
)
}
五、常见问题排查
Q: 撤回后对方仍显示消息
A: 检查消息漫游是否开启,确认双方客户端版本 ≥ 2.15.0Q: 无法撤回超过2分钟的消息
A: 腾讯云默认限制为2分钟,需在控制台申请延长权限Q: 群聊中非群主成员撤回失败
A: 确认群类型是否为 Private(私有群),Public 群需群主操作Q: 撤回通知不显示描述
A: 检查自定义消息解析逻辑,确保 payload 格式正确
六、性能优化建议
- 使用
tim.getMessageRevokeStatus()
批量查询消息状态 - 对已撤回消息进行本地缓存,避免重复查询
- 添加防抖处理,防止快速连续撤回导致性能问题
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/928030.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!相关文章
读人形机器人31未来30年
读人形机器人31未来30年1. 先进的技术前景
1.1. 自主决策与认知计算1.1.1. 预计到2055年,最重大的突破之一将是具备先进自主决策能力的人形机器人的出现1.1.2. 借助认知计算和神经网络架构方面的突破,这些机器人将能…
【java面试】redis篇 - 指南
【java面试】redis篇 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco",…
做推文网站营销型网站建设广告语
简洁的结论:
系统环境 ubuntu22.04 nvidia-535解决方案 删除/etc/X11/xorg.conf 文件
记录一下折腾大半天的问题。 ubuntu系统是22.04,之前使用的时候更新驱动导致桌面崩溃,重新安装桌面安装不上,请IT帮忙,IT一番操作过后也表示…
洛谷P8421 [THUPC 2022 决赛] rsraogps
洛谷P8421 [THUPC 2022 决赛] rsraogps
P8421 [THUPC 2022 决赛] rsraogps - 洛谷
因为从一个点最多会变化 \(\log V\) 次(这三种操作都是这样),考虑扫描线,这样每次更新前面答案贡献时,就有可能做到 \(\log V\) …
正规的网站建设专业公司学校微网站模板下载地址
原文:https://www.toutiao.com/i6855460778359816715/平台:头条作者:程序员不就是0和1一、 备份恢复策略进行备份或恢复操作时需要考虑一些因素:1、确定要备份的表的存储引擎是事务型还是非事务型,两种不同的存储引擎备…
实用指南:流媒体基础解析:音视频封装格式与传输协议
pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …
网站友链展示设计图片
模板的使用
1.如何使用模板
在manage.py的同级文件夹中创建templates在setting.py的文件中把第58行DIRS: [ ],改成DIRS: [os.path.join(BASE_DIR,templates)], 知识点: os.path.join(BASE_DIR,templates) 拼接两个字符串 BASE_DIR找到项目根目录127.0.0.1:8000/myadmin/templ…
校园网站建设资金来源有南阳做网站优化公司
文章目录 k8s 部署yapi平台前言准备工作构建yapi镜像Dockerfileentrypoint.shbuild.sh源码下载构建镜像启动mongo数据库新建nfs服务mongo创建mongo服务初始化数据启动yapi服务创建yapi服务查看密码访问地址k8s 部署yapi平台
前言
部署yapi平台需要mo
Differential Equations (Smita Sood) Notes
Separable Differential Equations
\[\frac{{\rm d}y}{{\rm d}x}=\frac{f(x)}{g(y)},g(y)\ne0
\]Solution
\[\begin{align}
\frac{{\rm d}y}{{\rm d}x}=\frac{f(x)}{g(y)}&\Longleftrightarrow g(y)\frac{{\rm d}y…
《前端面试题:BFC(块级格式化上下文)》 - 详解
pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …
NLP学习路线图(十四):词袋模型(Bag of Words) - 详解
NLP学习路线图(十四):词袋模型(Bag of Words) - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consola…
实用指南:苍茫命令行:linux模拟实现,书写微型bash
实用指南:苍茫命令行:linux模拟实现,书写微型bashpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&quo…
营销型网站策划建设wordpress 转换 织梦
百科词条创建上去是相当不易的,同时修改也是如此,一般情况下,百科词条是不需要修改的,但是很多时候企业或是人物在近期收获了更多成就或是有更多的变动,这个时候就需要补充维护词条了,如何修改百科内容&…
微信餐饮微网站建设重庆网站建立
Kafka 1.基于Pull的模式来处理消息消费
2.追求高吞吐量
3.一开始的目的就是日志收集和传输
4.0.8版本开始支持复制,不支持事务,对消息的重复、丢失、错误没有严格要求、适合产生大量数据的互联网服务的数据收集业务. RabbitMQ
RabbitMQ是使用Erlang语…
品牌网站建设9小蝌蚪9a广州天河区做网站
视频监控技术从传统监控到智能化升级的过程是一个技术革新和应用场景拓展的过程。智能视频监控系统通过集成AI和机器学习算法,能够实现行为分析、人脸识别和异常事件检测等功能,提升了监控的准确性和响应速度。这些系统不仅用于传统的安全防护࿰…
公司网站建设费怎么入账deppt模板网
一、简介 股票上涨和下跌,创造出像海浪一样难以预测的模式和走势。然而,就像科学家通过了解下面的水流来预测波浪的运动一样,我们也可以使用类似的工具破译股票市场的一些模式。 通过利用小波变换的力量,我们深入表面,试图揭示驱动股价的深层原因。这段旅程不仅仅涉及数字…
微信群公告如何做网站链接工商注册流程和需要的资料
WP中获取POST有两个主要函数,Get_post()和Get_Posts()。一个是获取单文章,另外一个是获取多文章,其中,官网对Get_posts()函数的描述很简单。但有的时候描述越简单的函数,使用起来却并没有那么简单。下面我通过一个案例…
教育网站建设改版湘潭做网站 z磐石网络
网站爬虫(Web Scrapers)是一种自动化工具,用于抓取网页上的数据。虽然合法的搜索引擎爬虫有助于提升网站的可见度,但恶意爬虫可能带来数据盗窃、版权侵犯等问题,甚至造成服务器过载。本文将探讨如何有效预防网站受到恶…
网站建设 企业文化东莞南城网站开发公司
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System