消息管理–管理本地消息数据

更新时间:2022-02-28

本文介绍环信即时通讯 IM iOS SDK 如何管理本地消息数据。移动端 SDK 内部使用 SQLite 保存本地消息,方便消息处理。消息以会话为单位管理,你可在本地按照会话加载和展示消息。

另外,消息在本地存储时增加了已读未读状态的属性,这样你可以获取所有会话和特定会话的未读消息数。

环信即时通讯 IM 发送和接收到的消息会存储在本地数据库,用户在本地进行消息的操作,体验好。消息以会话为单位管理,可在本地按照会话加载和展示消息。

功能 描述
获取本地所有会话 获取本地所有的会话,消息本地存储有已读未读状态,会话中包含未读消息数。
从数据库中读取指定会话的消息 从本地数据库中获取指定会话的消息,进入会话时,获取会话内容。
获取指定会话的未读消息数量 从本地数据库中获取指定会话的未读消息数量。
获取所有会话的未读消息数量 从本地数据库中获取所有会话的未读消息数量。
未读消息数清零 查看未读消息后,未读消息数清零。可以清零指定的会话和所有会话。
删除会话及聊天记录 删除本地会话,会话里的聊天记录是否删除是可选项。
根据关键字搜索会话消息 根据关键字对会话里的消息内容进行搜索。
导入消息到数据库 将外部消息导入本地数据库。需要构造消息对象。
插入消息 模拟收到某些消息通知,可以构造一条消息并写入会话。

环信即时通讯 IM iOS SDK 支持管理用户设备上存储的消息会话数据,其中包含如下主要方法:

  • getAllConversations 加载本地存储的会话消息;
  • deleteConversations 删除本地存储的一组会话;
  • conversation.unreadMessagesCount 获取指定会话的未读消息数;
  • deleteConversation 删除指定会话;
  • conversation.loadMessagesStartFromId 在本地存储的消息中搜索;
  • insertMessage 在指定会话中写入消息。

开始前,请确保满足以下条件:

  • 完成 SDK 初始化,并连接到服务器,详见 快速开始
  • 了解环信即时通讯 IM 的使用限制,详见 使用限制

获取本地所有会话

你可以调用 API 获取本地所有会话:

NSArray *conversations = [[EMClient sharedClient].chatManager getAllConversations];

从数据库中读取指定会话的消息

可以从数据库中读取指定会话的消息:

//获取指定会话 ID 的会话。
EMConversation *conversation = [[EMClient sharedClient].chatManager getConversation:conversationId type:type createIfNotExist:YES];
//SDK 初始化时,为每个会话加载 1 条聊天记录。如需更多消息,请到数据库中获取。该方法获取 `startMsgId` 之前的 `count` 条消息,SDK 会将这些消息自动存入此会话,app 无需添加到会话中。
NSArray<EMChatMessage *> *messages = [conversation loadMessagesStartFromId:startMsgId count:count searchDirection:MessageSearchDirectionUp];

获取指定会话的未读消息数量

可以调用接口获取指定会话的未读消息数量,示例代码如下:

//获取指定会话 ID 的会话。
EMConversation *conversation = [[EMClient sharedClient].chatManager getConversation:conversationId type:type createIfNotExist:YES];
//获取未读消息数。
NSInteger unreadCount = conversation.unreadMessagesCount;

获取所有会话的未读消息数量

示例代码如下:

NSArray *conversations = [[EMClient sharedClient].chatManager getAllConversations];
NSInteger unreadCount = 0;
for (EMConversation *conversation in conversations) {
  unreadCount += conversation.unreadMessagesCount;
}

指定会话的未读消息数清零

你可以调用接口将指定会话的未读消息数清零,示例代码如下:

EMConversation *conversation = [[EMClient sharedClient].chatManager getConversation:conversationId type:type createIfNotExist:YES];
//将指定会话的消息未读数清零。
[conversation markAllMessagesAsRead:nil];
//将一条消息置为已读。
[onversation markMessageAsReadWithId:messageId error:nil];

删除会话及聊天记录

你可以调用接口删除会话和聊天记录,示例代码如下:

//删除指定会话,如果需要保留聊天记录,`isDeleteMessages` 参数传 `NO`。
[[EMClient sharedClient].chatManager deleteConversation:conversationId isDeleteMessages:YES completion:nil];
//删除一组会话。
NSArray *conversations = @{@"conversationID1",@"conversationID2"};
[[EMClient sharedClient].chatManager deleteConversations:conversations isDeleteMessages:YES completion:nil];
//删除当前会话的一条聊天记录。
EMConversation *conversation = [[EMClient sharedClient].chatManager getConversation:conversationId type:type createIfNotExist:YES];
[conversation deleteMessageWithId:.messageId error:nil];

根据关键字搜索会话消息

你可以根据关键字搜索会话消息,示例代码如下:

NSArray<EMChatMessage *> *messages = [conversation loadMessagesWithKeyword:keyword timestamp:0 count:50 fromUser:nil searchDirection:MessageSearchDirectionDown];

导入消息到数据库

若从外部导入消息可以使用下面的接口,构造 Message 对象,将一组历史消息导入到本地数据库中。

[[EMClient sharedClient].chatManager importMessages:messages completion:nil];

插入消息

如果你需要在本地会话中加入一条消息,比如模拟收到某些通知消息时,可以构造一条消息写入会话。

//根据会话插入消息。
EMConversation *conversation = [[EMClient sharedClient].chatManager getConversation:conversationId type:type createIfNotExist:YES];
[conversation insertMessage:message error:nil];

更新消息到 SDK 本地数据库

如果需要更新消息用以下方法:

[EMClient.sharedClient.chatManager updateMessage:message completion:^(EMChatMessage *aMessage, EMError *aError) {
     if (!aError) {
         //更新本地消息完成。
     }
}];