获取Twilio Conversations中用户所有会话的未读消息总数
解决方案:Twilio Conversations 全局未读消息统计
一、核心现状
Twilio Conversations 目前没有提供直接返回用户所有会话未读总数/未读会话数的API,必须基于单会话的unreadMessagesCount来计算,但可以通过优化逻辑避免大量会话时的性能问题。
二、获取全局未读消息总数的实现
- 初始化阶段,先拉取用户参与的活跃会话(通过
Client.getConversations(),过滤status为active的会话,排除已关闭/失效的会话) - 用并行异步的方式批量获取每个会话的未读数,累加得到总数
- 关键优化手段:
- 过滤无效会话:只处理
active状态的会话,减少遍历数量 - 并行处理:用
Promise.all()同时发起所有会话的未读数请求,比串行遍历效率高很多 - 增量更新缓存:首次计算后缓存总数,后续只在会话未读状态变化时(比如收到新消息、用户标记已读)通过事件监听增量更新,不用每次都全量遍历
- 过滤无效会话:只处理
示例代码:
// 初始化计算全局未读总数 async function getTotalUnreadMessages() { const client = await Twilio.Conversations.Client.create(token); const activeConversations = await client.getConversations({ status: 'active' }); // 并行获取所有会话的未读数 const unreadCountList = await Promise.all( activeConversations.map(convo => convo.unreadMessagesCount) ); // 累加总数 return unreadCountList.reduce((total, count) => total + count, 0); } // 实时监听未读状态变化,增量更新总数 let totalUnread = await getTotalUnreadMessages(); updateBadge(totalUnread); // 更新页面徽章 client.on('conversationJoined', (conversation) => { // 会话已读状态更新时 conversation.on('readHorizonUpdated', async () => { const newCount = await conversation.unreadMessagesCount; // 计算差值并更新总数 const diff = newCount - conversation.lastUnreadCount; totalUnread += diff; conversation.lastUnreadCount = newCount; updateBadge(totalUnread); }); // 收到新消息时(非自己发送的) conversation.on('messageAdded', (message) => { if (!message.isFromMe) { totalUnread += 1; updateBadge(totalUnread); } }); });
三、获取有未读消息的会话数量的实现
逻辑类似,只需统计unreadMessagesCount > 0的会话数:
- 拉取活跃会话列表
- 并行检查每个会话的未读数,筛选出有未读的会话并统计数量
- 同样可以通过事件监听增量更新:比如某会话从无未读变有未读时,计数加1;反之减1
示例代码片段:
async function getUnreadConversationCount() { const activeConversations = await client.getConversations({ status: 'active' }); const hasUnreadList = await Promise.all( activeConversations.map(convo => convo.unreadMessagesCount.then(count => count > 0)) ); // 统计有未读的会话数量 return hasUnreadList.filter(flag => flag).length; }
四、针对大量会话的额外优化
- 分页拉取会话:如果用户参与的会话超过50个,用
getConversations()的pageSize和pageToken参数分批加载,避免一次性拉取大量数据导致内存占用过高 - 缓存会话列表:将活跃会话列表缓存到
localStorage,下次初始化时先读取缓存,再拉取最新的会话更新,减少API调用次数 - 延迟加载非活跃会话:对于长期未互动的会话,可以暂时不计算未读数,等用户打开会话列表时再加载,降低初始化时的性能消耗
内容的提问来源于stack exchange,提问作者CP3
相关产品推荐
相关产品推荐

