IM 即时通讯
Web
产品介绍
简介
主要功能
产品优势
海外数据中心
IM平滑迁移方案
接口及业务限制
功能介绍
帐号集成与登录
基础消息功能
群组功能
聊天室功能
聊天室标签功能
多端登录与互踢策略
质量数据监控台
体验 Demo
下载 SDK 与 Demo 源码
更新日志
IM UIKit 更新日志
NIM SDK 开发版更新日志
NIM SDK 稳定版更新日志
快速开始
跑通 IM Demo 源码
实现 IM 文本消息收发(不含 UI)
含 UI 集成
什么是 IM UIKit
IM UIKit 功能概览
快速集成 IM UIKit
非React框架集成 IM UIKit
组件导入
初始化
全局上下文
登录相关
实现消息收发及界面自定义
集成会话列表界面
集成会话消息界面
集成用户资料组件
集成通讯录界面
集成搜索组件
非 React 框架自定义渲染
主题样式设置
语言设置
初始化(兼容 NIM SDK)
不含 UI 集成
集成 SDK
浏览器环境集成
Node.js集成
初始化与登录相关
初始化与登录 IM
IM 连接相关
多端登录与互踢
消息相关
消息概述
消息收发
消息配置选项
广播消息收发
消息已读回执
消息撤回
消息重发与转发
本地消息
通知消息
群通知消息
超大群通知消息
历史消息
最近会话
用户资料托管
好友关系托管
用户关系托管
在线状态订阅
群组功能
群组概述
群组管理
群成员管理
群消息管理
超大群功能
系统通知
系统通知概述
内置系统通知管理
内置系统通知未读数
自定义系统通知收发
开通聊天室功能
聊天室
反垃圾(内容审核)
域名高可用
融合存储方案
扩展功能
工具方法
最佳实践
聊天室重要消息投递
API参考
SDK API (Web)
IM UIKit Store API
状态码
IM 控制台指南
创建应用
注册 IM 账号
升级服务
开通聊天室功能
配置应用客户端标识
常见问题
FAQ
服务协议

最近会话

更新时间: 2022/12/07 10:58:05

生成规则

SDK 会根据漫游消息和离线消息来生成初始会话列表, 在收到消息和发送消息之后 SDK 会更新会话列表

初始化参数

示例代码

var nim = NIM.getInstance({
    onsessions: onSessions,
    onupdatesession: onUpdateSession
});
function onSessions(sessions) {
    console.log('收到会话列表', sessions);
    data.sessions = nim.mergeSessions(data.sessions, sessions);
    updateSessionsUI();
}
function onUpdateSession(session) {
    console.log('会话更新了', session);
    data.sessions = nim.mergeSessions(data.sessions, session);
    updateSessionsUI();
}
function updateSessionsUI() {
    // 刷新界面
}

参数解释

  • syncSessionUnread, 是否同步会话的未读数, 默认不同步
    • 如果选择同步
      • 那么在一个端读过的会话在其它端也会被标记为已读
      • 在调用设置当前会话的时候 SDK 会自动同步一次未读数, 此后如果收到当前会话的消息, 需要手动调用重置会话未读数来同步未读数
  • onsessions, 同步最近会话列表回调, 会传入会话列表, 按时间正序排列, 即最近聊过天的放在列表的最后面
  • onupdatesession, 更新会话的回调, 会传入会话对象, 以下情况会收到此回调

会话对象

会话对象有以下字段:

  • id: 会话ID
  • scene: 场景
  • to: 聊天对象, 账号或群ID
  • updateTime: 会话更新的时间
  • unread: 未读数
  • lastMsg: 此会话的最后一条消息
  • msgReceiptTime: 消息已读回执时间戳, 如果有此字段, 说明此时间戳之前的所有消息对方均已读
  • localCustom: 本地自定义扩展字段
    • 在支持数据库时可以调用更新本地会话来更新此字段, 此字段只会被更新到本地数据库, 不会被更新到服务器上

未读数

SDK 会自动管理会话的未读数, 会话对象的unread的值为会话的未读数, 如果开发者发现会话的未读数大于收到的离线消息数, 那么需要从本地拉取未读取的消息

会话未读数的初始化在不同的配置环境下,会有不同的计算规则:

是否开启同步会话未读数

  • 开启同步会话未读数: syncSessionUnread = true

    • 此时会话未读数通过服务器下推的Ack或本地存储的Ack时间戳,与本地数据库中对应会话的本地历史记录做比较,晚于该Ack且不是自己发的消息的数量,为未读数
    • 参见会话初始化参数
  • 未开启同步会话未读数: syncSessionUnread = false

    • 此时会话未读数通过从本地数据库上次所记录的未读数中取得,如果有离线消息且消息属性标记为isUnreadable,则会在原来的未读数上增加计数

是否开启自动标记消息已读

  • 不开启自动标记消息已读: autoMarkRead = false

    此时服务器下推的所有离线消息算未读,漫游消息算已读

  • 开启自动标记消息已读: autoMarkRead = true

    • 此时每次收到离线消息,均会告知服务器该消息已读,下一次登录,服务器就不会下推离线消息,而将这些消息标记为漫游消息。没有离线消息,未读数在表现上均为0
    • 参见标记消息为已收到

设置当前会话

  • 如果是已经存在的会话记录, 会将此会话未读数置为 0, 开发者会收到onupdatesession回调
  • 之后此会话在收到消息之后不会更新未读数
nim.setCurrSession('sessionId')

重置会话未读数

  • 如果是已经存在的会话记录, 会将此会话未读数置为 0, 那么会收到onupdatesession回调
  • 之后此会话在收到消息之后依然会更新未读数
nim.resetSessionUnread('sessionId')

重置所有会话未读数(内存中的)

  • 如果是内存中已经存在的会话记录, 会将该内存中的所有会话记录的未读数均清零, 那么会多次收到onupdatesession回调
  • 之后此会话在收到消息之后依然会更新未读数
nim.resetAllSessionUnread()

重置当前会话

  • 重置当前会话后, 所有会话在收到消息之后会更新未读数
nim.resetCurrSession();

获取本地会话列表

  • 仅查询内存中的会话列表(提前同步)
  • lastSessionId为上次查询的最后一条会话的id, 第一次不填
  • limit为本次查询的会话数量限制, 最多 100 条, 默认 100 条
  • 默认从最近的会话开始往前查找本地会话, 可以传参数reverse=true来从第一条会话开始往后查找本地会话
nim.getLocalSessions({
    lastSessionId: lastSessionId,
    limit: 100,
    done: getLocalSessionsDone
});
function getLocalSessionsDone(error, obj) {
    console.log(error);
    console.log(obj);
    console.log('获取本地会话列表' + (!error?'成功':'失败'));
    if (!error) {
        onSessions(obj.sessions);
    }
}

通过sessionId获取本地会话

  • 优先在内存中的会话列表(提前同步)查询,若不存在,在支持数据库的情况下,再从本地数据库中获取,有则返回会话对象,无则返回 null。
  • sessionId为需要查询的会话的sessionId
nim.getLocalSession({
    sessionId: sessionId,
    done: getLocalSessionDone
});
function getLocalSessionDone(error, obj) {
    console.log(error);
    console.log(obj);
    console.log('获取本地会话操作' + (!error ? '完成' : '失败'), error, obj)
}

指定lastMsg类型获取本地会话列表

  • 在数据库中查询指定类型的会话列表
  • 返回按时间逆序排列的、包含指定类型消息的会话(通过参数exclude传入要排除的消息类型,剩余的就是指定类型),返回会话的lastMsg是该会话中最近的、类型符合条件的消息,最多100条
  • 具体参数和使用参见API文档

插入一条本地会话记录

  • 开发者可以插入一条本地会话记录,数据保存在内存中,在支持数据库时, SDK 也会将此会话存储于本地数据库
  • SDK 会设置一个比当前所有会话更新时间大的一个时间为此会话的更新时间, 或者开发者可以传入参数updateTime来指定更新时间
  • 在回调里面, 开发者需要保存生成的会话
nim.insertLocalSession({
    scene: 'p2p',
    to: 'account',
    done: insertLocalSessionDone
});
function insertLocalSessionDone(error, obj) {
    console.log('插入本地会话记录' + (!error?'成功':'失败'), error, obj);
    if (!error) {
        onSessions(obj.session);
    }
}

更新本地会话

  • 在内存(提前同步)和数据库中更新 id 对应的本地会话
  • 若不支持数据库,则更新内存中的指定会话
  • 如果对应的会话不存在, 算成功, 返回 null
  • 这些字段会被更新到本地数据库,并完成同步
  • 目前只允许更新 localCustom
nim.updateLocalSession({
    id: 'p2p-account',
    localCustom: '{"key","value"}',
    done: updateLocalSessionDone
});
function updateLocalSessionDone(error, obj) {
    console.log(error);
    console.log(obj);
    console.log('更新本地会话' + (!error?'成功':'失败'));
}

删除本地会话

  • 删除内存(提前同步)和数据库中的指定会话
  • 若不支持数据库,则删除内存中的指定会话
  • 如果对应的会话不存在, 算成功
  • 参数 id 为会话 id 或 id 数组
nim.deleteLocalSession({
    id: 'p2p-account',
    done: deleteLocalSessionDone
});
function deleteLocalSessionDone(error, obj) {
    console.log(error);
    console.log(obj);
    console.log('删除本地会话' + (!error?'成功':'失败'));
}

删除服务器上的会话

  • 删了服务器上的会话之后, 在不支持数据库时, 下次同步就同步不到对应的会话以及会话对应的漫游消息; 此外, 在新设备上也同步不到对应的会话以及会话对应的漫游消息
  • scene请参考消息场景
  • to 为对方账号或群ID
nim.deleteSession({
    scene: 'p2p',
    to: 'account',
    done: deleteSessionDone
});
function deleteSessionDone(error, obj) {
    console.log(error);
    console.log(obj);
    console.log('删除服务器上的会话' + (!error?'成功':'失败'));
}

批量删除服务器上的会话

  • 删了服务器上的会话之后, 在不支持数据库时, 下次同步就同步不到对应的会话以及会话对应的漫游消息; 此外, 在新设备上也同步不到对应的会话以及会话对应的漫游消息
  • scene请参考消息场景
  • to 为对方账号或群ID
nim.deleteSessions({
    sessions: [{
        scene: 'p2p',
        to: 'account'
    }, {
        scene: 'p2p',
        to: 'account1'
    }],
    done: deleteSessionsDone
});
function deleteSessionsDone(error, obj) {
    console.log(error);
    console.log(obj);
    console.log('批量删除会话' + (!error?'成功':'失败'));
}

服务端会话列表服务

v7.0.0以上版本支持服务端会话列表服务,这是一种新的会话列表服务,跟SDK的“最近会话”是两种不同的,完全隔离的。

“最近会话”是由SDK生成和维护,而服务端会话列表服务由服务器维护,记录的会话数量较多,超过了100条的限制,但没有unread, msgReceiptTime等属性

SDK提供了以下API,供开发者获取、更改、删除服务端会话

在多端登录时,若一端更新服务器会话的扩展字段,SDK会通过 onSyncUpdateServerSession 回调函数通知开发者,可以在SDK初始化时传入该监听函数

常见问题

此文档是否对你有帮助?
有帮助
我要吐槽
  • 生成规则
  • 初始化参数
  • 会话对象
  • 未读数
  • 是否开启同步会话未读数
  • 是否开启自动标记消息已读
  • 设置当前会话
  • 重置会话未读数
  • 重置所有会话未读数(内存中的)
  • 重置当前会话
  • 获取本地会话列表
  • 通过sessionId获取本地会话
  • 指定lastMsg类型获取本地会话列表
  • 插入一条本地会话记录
  • 更新本地会话
  • 删除本地会话
  • 删除服务器上的会话
  • 批量删除服务器上的会话
  • 服务端会话列表服务
  • 常见问题