最近会话

更新时间: 2024/03/14 18:45:30

生成规则

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

初始化参数

示例代码

javascriptvar 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 回调
  • 之后此会话在收到消息之后不会更新未读数
javascriptnim.setCurrSession('sessionId')

取消设置当前会话

取消设置当前会话后,会话在收到消息之后会持续更新未读数。

javascriptnim.resetCurrSession();

重置会话未读数

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

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

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

获取本地会话列表

  • 仅查询内存中的会话列表(提前同步)
  • lastSessionId为上次查询的最后一条会话的id, 第一次不填
  • limit为本次查询的会话数量限制, 最多 100 条, 默认 100 条
  • 默认从最近的会话开始往前查找本地会话, 可以传参数reverse=true来从第一条会话开始往后查找本地会话
javascriptnim.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
javascriptnim.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来指定更新时间
  • 在回调里面, 开发者需要保存生成的会话
javascriptnim.insertLocalSession({
    scene: 'p2p',
    to: 'account',
    done: insertLocalSessionDone
});
function insertLocalSessionDone(error, obj) {
    console.log('插入本地会话记录' + (!error?'成功':'失败'), error, obj);
    if (!error) {
        onSessions(obj.session);
    }
}

更新本地会话

  • 在内存(提前同步)和数据库中更新 id 对应的本地会话
  • 若不支持数据库,则更新内存中的指定会话
  • 如果对应的会话不存在, 算成功, 返回 null
  • 这些字段会被更新到本地数据库,并完成同步
  • 目前只允许更新 localCustom
  • 通过入参 needNotify 来控制是否触发更新会话的回调。若 needNotifytrue,触发onUpdateSessionsonUpdateSession 的回调;needNotifyfalse 则不触发。默认为 true
javascriptnim.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 数组
javascriptnim.deleteLocalSession({
    id: 'p2p-account',
    done: deleteLocalSessionDone
});
function deleteLocalSessionDone(error, obj) {
    console.log(error);
    console.log(obj);
    console.log('删除本地会话' + (!error?'成功':'失败'));
}

删除服务器上的会话

  • 如果仅需要删除漫游消息,可调用 deleteLocalSession 方法,设置入参 isDeleteRoaming 为 true,即可删除漫游消息

  • 如果需要删除漫游消息,以及历史消息,可调用 clearServerHistoryMsgsWithSync 方法进行删除

javascript//仅需要删除漫游消息
nim.deleteLocalSession({
    id: 'p2p-account',
    isDeleteRoaming: true,
    done: deleteLocalSessionDone
});
function deleteLocalSessionDone(error, obj) {
    console.log(error);
    console.log(obj);
    console.log('删除漫游消息' + (!error?'成功':'失败'));
}
//删除漫游消息和历史消息
nim.clearServerHistoryMsgsWithSync({
    //p2p:点对点; team:群; superTeam:超大群
    scene: 'p2p',
    //为对方账号或群ID
    to: 'account',
    done: clearServerHistoryMsgsWithSyncDone
});
function clearServerHistoryMsgsWithSyncDone(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类型获取本地会话列表
  • 插入一条本地会话记录
  • 更新本地会话
  • 删除本地会话
  • 删除服务器上的会话
  • 服务端会话列表服务
  • 常见问题