获取会话
IMLib SDK 会根据用户收发的消息,在本地数据库中生成对应会话,并维护会话列表。应用程序可以获取本地数据库中的会话列表。
获取指定单个会话
您可以通过 getConversation 获取某个会话的详细信息。
接口原型
TypeScript
public getConversation(conId: ConversationIdentifier): Promise<IAsyncResult<Conversation>>;
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
| conId | ConversationIdentifier | 会话标识,包含会话类型,会话 id |
示例代码
TypeScript
let conId = new ConversationIdentifier();
conId.conversationType = ConversationType.Private;
conId.targetId = "会话 id";
IMEngine.getInstance().getConversation(conId)
.then(result => {
if (EngineError.Success !== result.code) {
// 获取回话失败
return;
}
if (!result.data) {
// 会话为空
return;
}
let con = result.data as Conversation;
});
获取会话列表
会话列表是 SDK 在本地生成和维护的。如果未发生卸载重载或换设备登录,您可以获取本地设备上存储的所有历史消息生成的会话列表。
分页获取会话列表
您可以分页获取 SDK 在本地数据库生成的会话列表,返回的会话列表按照时间倒序排列。如果返回结果含有被设置为置顶状态的会话,则置顶会话默认排在最前。
使用 getConversationListByPage 方法,IGetConversationOption 的时间戳(time)首次可传 0,后续可以使用返回的 Conversation 对象的 sentTime 或 operationTime 属性值为下一 次查询的 startTime。推荐使用 operationTime。
接口原型
TypeScript
public getConversationListByPage(conTypeList: List<ConversationType>, option: IGetConversationOption): Promise<IAsyncResult<List<Conversation>>>;
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
| conversationTypes | List of ConversationType | 选择要获取的会话类型。可设置多个会话类型。 |
| option | IGetConversationOption | 获取会话配置。 |
示例代码
TypeScript
let conTypeList = new List<ConversationType>();
conTypeList.add(ConversationType.Private);
conTypeList.add(ConversationType.Group);
let option: IGetConversationOption = {
time: 0,
count: 10
}
IMEngine.getInstance().getConversationListByPage(conTypeList, option)
.then(result => {
if (EngineError.Success !== result.code) {
// 获取会话列表失败
return;
}
if (!result.data) {
// 会话列表为空
return;
}
let conList = result.data as List<Conversation>;
});
分页获取置顶会话列表
您可以选择只获取置顶的会话列表。
接口原型
TypeScript
public getTopConversationListByPage(conTypeList: List<ConversationType>, option: IGetConversationOption): Promise<IAsyncResult<List<Conversation>>>;
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
| conversationTypes | List of ConversationType | 会话类型数组 |
示例代码
TypeScript
let conTypeList = new List<ConversationType>();
conTypeList.add(ConversationType.Private);
conTypeList.add(ConversationType.Group);
let option: IGetConversationOption = {
time: 0,
count: 10
}
IMEngine.getInstance().getTopConversationListByPage(conTypeList, option)
.then(result => {
if (EngineError.Success !== result.code) {
// 获取会话列表失败
return;
}
if (!result.data) {
// 会话列表为空
return;
}
let conList = result.data as List<Conversation>;
});
分页获取免打扰会话列表
您可以分页获取置顶会话类型的会话列表。
接口原型
TypeScript
public getBlockedConversationListByPage(conTypeList: List<ConversationType>, option: IGetConversationOption): Promise<IAsyncResult<List<Conversation>>>;
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
| conversationTypes | List of ConversationType | 选择要获取的会话类型。可设置多个会话类型。 |
| option | IGetConversationOption | 获取会话配置。 |
示例代码
TypeScript
let conTypeList = new List<ConversationType>();
conTypeList.add(ConversationType.Private);
conTypeList.add(ConversationType.Group);
let option: IGetConversationOption = {
time: 0,
count: 10
}
IMEngine.getInstance().getBlockedConversationListByPage(conTypeList, option)
.then(result => {
if (EngineError.Success !== result.code) {
// 获取会话列表失败
return;
}
if (!result.data) {
// 会话列表为空
return;
}
let conList = result.data as List<Conversation>;
});
获取未读会话列表
提示
SDK 从 1.1.0 版本开始支持获取未读会话列表。
接口原型
TypeScript
public getUnreadConversations(conTypeList: List<ConversationType>): Promise<IAsyncResult<List<Conversation>>>;
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
| conversationTypes | List of ConversationType | 会话类型数组 |
示例代码
TypeScript
let conTypeList = new List<ConversationType>();
conTypeList.add(ConversationType.Private);
conTypeList.add(ConversationType.Group);
IMEngine.getInstance().getUnreadConversations(conTypeList).then(result => {
if (EngineError.Success !== result.code) {
// 获取未读会话列表失败
return;
}
if (!result.data) {
// 获取未读会话列表为空
return;
}
// 未读会话列表
let conList = result.data as List<Conversation>;
});
分页获取 @ 我的未读会话列表
提示
SDK 从 1.9.0 版本开始支持获取 @ 我的未读会话列表。
您可以使用 getUnreadMentionMeConversationList 方法分页获取包含 @ 我且未读消息的会话列表。该方法支持单聊、群聊、系统会话、超级群等多种会话类型,返回的会话列表按照时间倒序排列,置顶会话会优先显示。
接口原型
TypeScript
public getUnreadMentionMeConversationList(option: GetConversationsByPageOption): Promise<IAsyncResult<List<Conversation>>>;
参数说明
| 参数 | 类型 | 说明 |
|---|---|---|
option | GetConversationsByPageOption | 查询参数对象,包含分页和筛选条件 |
GetConversationsByPageOption 属性说明
| 属性名 | 类型 | 必填 | 说明 |
|---|---|---|---|
timestamp | number | 是 | 分页查询开始时间戳,首次查询传 0 |
count | number | 是 | 每次查询的条数,有效范围 [1, 100] |
topPriority | boolean | 否 | 是否置顶优先,默认值为 false |
conversationTypes | List<ConversationType> | 是 | 会话类型列表 |
示例代码
TypeScript
// 创建会话类型列表
let conTypeList = new List<ConversationType>();
conTypeList.add(ConversationType.Private);
conTypeList.add(ConversationType.Group);
// 设置查询参数
let timestamp = 0; // 首次查询传 0,后续分页查询传具体时间戳
let count = 10; // 每次获取 10 条会话
let topPriority = false; // 不优先显示置顶会话
let option: GetConversationsByPageOption = {
conversationTypes: conTypeList,
timestamp: timestamp,
count: count,
topPriority: topPriority
}
// 获取 @ 我的未读会话列表
IMEngine.getInstance().getUnreadMentionMeConversationList(option).then(result => {
if (EngineError.Success !== result.code) {
// 获取失败
console.error("获取 @ 我的未读会话列表失败,错误码:", result.code);
return;
}
if (!result.data) {
// 列表为空
console.log("暂无 @ 我的未读会话");
return;
}
// 处理获取到的会话列表
let conList = result.data as List<Conversation>;
});
卸载重装或换设备登录后的处理方案
如果您的用户卸载重装或换设备登录,可能会发现会话列表为空,或者有部分会话没有显示。
原因如下:
- 在卸载的时候会删除本地数据库,本地没有任何历史消息,导致重新安装后会话列表为空。
- 如果换设备登录,可能本地没有历史消息数据,导致会话列表为空。
- 如果您的 App Key 开启了多设备消息同步 功能,服务端会同时启用离线消息补偿功能。服务端会在 SDK 连接成功后自动同步当天 0 点后的消息,客户端 SDK 接收到服务端补偿的消息后,可生成部分会话和会话列表。与卸载前或换设备前比较,可能会有部分会话丢失的错觉。
如果您希望在卸载重装或换设备登录后,获取到之前的会话列表,可以参考如下方案:
- 申请增加离线消息补偿的天数,最大可修改为 7 天。注意,设置时间过长,当单用户消息量超大时,可能会因为补偿消息量过大,造成端上处理压力的问题。如有需要,请提交工单。
- 在您的服务器中自行维 护会话列表,并通过 API 向服务端获取需要展示的历史消息。