From 56156e6f5c8e7a690d72295ebb50453cc7dd790f Mon Sep 17 00:00:00 2001 From: haoxiuwen Date: Fri, 22 Dec 2023 16:54:55 +0800 Subject: [PATCH 1/8] Add Release Notes 4.3.0 --- docs/document/android/conversation_mark.md | 163 +++++++++++++++++++++ docs/document/android/message_manage.md | 2 +- docs/document/android/multi_device.md | 3 + docs/document/android/releasenote.md | 26 +++- docs/document/applet/releasenote.md | 4 +- docs/document/flutter/releasenote.md | 4 +- docs/document/ios/conversation_mark.md | 106 ++++++++++++++ docs/document/ios/message_manage.md | 2 +- docs/document/ios/multi_device.md | 3 + docs/document/ios/releasenote.md | 26 +++- docs/document/react-native/releasenote.md | 4 +- docs/document/unity/message_manage.md | 2 +- docs/document/unity/releasenote.md | 6 +- docs/document/web/conversation_mark.md | 103 +++++++++++++ docs/document/web/multi_device.md | 16 +- docs/document/web/releasenote.md | 31 +++- docs/document/windows/releasenote.md | 4 +- 17 files changed, 469 insertions(+), 36 deletions(-) create mode 100644 docs/document/android/conversation_mark.md create mode 100644 docs/document/ios/conversation_mark.md create mode 100644 docs/document/web/conversation_mark.md diff --git a/docs/document/android/conversation_mark.md b/docs/document/android/conversation_mark.md new file mode 100644 index 000000000..7682c270f --- /dev/null +++ b/docs/document/android/conversation_mark.md @@ -0,0 +1,163 @@ +# 会话标记 + + + +某些情况下,你可能需要对会话添加标记,例如会话标星或将会话标为已读或未读。即时通讯云 IM 支持对单聊和群聊会话添加标记,最大支持 20 个标记,所以一个会话最多可添加 20 个标记。 + +如果要使用会话标记功能,你需要确保开通了[会话列表服务](conversation_list.html#从服务器分页获取会话列表)并将 SDK 版本升级至 4.3.0 或以上版本。 + +你需要自行维护会话标记与具体业务含义(比如 `MARK_0` 为重要会话)之间的映射关系。例如: + +```java +Map mapping=new HashMap<>(); +mapping.put(EMConversation.EMMarkType.MARK_0,"important"); +mapping.put(EMConversation.EMMarkType.MARK_1,"normal"); +mapping.put(EMConversation.EMMarkType.MARK_2,"unimportant"); +mapping.put(EMConversation.EMMarkType.MARK_3,"boys"); +mapping.put(EMConversation.EMMarkType.MARK_4,"girls"); +…… +``` + +## 技术原理 + +环信即时通讯 IM 支持会话标记功能,主要方法如下: + +- `EMChatManager#asyncAddConversationMark`:标记会话。 +- `EMChatManager#asyncRemoveConversationMark`:取消标记会话。 +- `EMChatManager#asyncGetConversationsFromServerWithCursor`:根据会话标记从服务器分页查询会话列表。 +- 根据会话标记从本地查询会话列表:调用 `getAllConversations` 方法获取本地所有会话后自己进行会话过滤。 +- `EMConversation#marks`:获取本地单个会话的所有标记。 + +## 前提条件 + +开始前,请确保满足以下条件: + +- 完成 SDK 初始化,并连接到服务器,详见 [快速开始](quickstart.html)。 +- 了解环信即时通讯 IM API 的使用限制,详见 [使用限制](/product/limitation.html)。 +- **[开通服务端会话列表功能](conversation_list#从服务器分页获取会话列表)**。 + +## 实现方法 + +### 标记会话 + +你可以调用 `asyncAddConversationMark` 方法标记会话。每次最多可为 20 个会话添加标记。调用该方法会同时为本地和服务器端的会话添加标记。 + +添加会话标记后,若调用 `asyncFetchConversationsFromServer` 接口从服务器分页获取会话列表,返回的会话对象中包含会话标记,你需要通过 `EMConversation#marks` 方法获取。若你已经达到了服务端会话列表长度限制(默认 100 个会话),服务端会根据会话的活跃度删除不活跃会话,这些会话的会话标记也随之删除。 + +:::tip +对会话添加标记,例如会话标星,并不影响会话的其他逻辑,例如会话的未读消息数。 +::: + +```java +String conversationId = "huanhuan"; +List ids=new ArrayList<>(); +ids.add(conversationId); +EMClient.getInstance().chatManager().asyncAddConversationMark(ids, EMConversation.EMMarkType.MARK_0, new EMCallBack() { + @Override + public void onSuccess() { + + } + + @Override + public void onError(int code, String error) { + + } +}); +``` + +### 取消标记会话 + +你可以调用 `asyncRemoveConversationMark` 方法删除会话标记。每次最多可移除 20 个会话的标记。 + +调用该方法会同时移除本地和服务器端会话的标记。 + +```java +String conversationId = "huanhuan"; +List ids=new ArrayList<>(); +ids.add(conversationId); +EMClient.getInstance().chatManager().asyncRemoveConversationMark(ids, EMConversation.EMMarkType.MARK_0,new EMCallBack() { + @Override + public void onSuccess() { + + } + + @Override + public void onError(int code, String error) { + + } +}); +``` + +### 根据会话标记从服务器分页查询会话列表 + +你可以调用 `asyncGetConversationsFromServerWithCursor` 方法根据会话标记从服务器分页获取会话列表。SDK 会按会话标记的时间的倒序返回会话列表,每个会话对象中包含会话 ID、会话类型、是否为置顶状态、置顶时间(对于未置顶的会话,值为 0)、会话标记以及最新一条消息。从服务端拉取会话列表后会更新本地会话列表。 + +```java +// 最终的查询结果全部放入 result 中。 +List result=new ArrayList<>(); +// cursor:查询的开始位置。若传入空字符串,SDK 从最新标记操作的会话开始获取。 +String cursor=""; +// filter:会话查询选项,包括会话标记和每页获取的会话条数(最多可获取 10 条)。下面的代码以查询服务端所有标记了 `EMConversation.EMMarkType.MARK_0` 的会话为例。 +EMConversationFilter filter=new EMConversationFilter(EMConversation.EMMarkType.MARK_0,10); +doAsyncGetConversationsFromServerWithCursor(result,cursor,filter); + +private void doAsyncGetConversationsFromServerWithCursor(List result, @NonNull String cursor, @NonNull EMConversationFilter filter) { + EMClient.getInstance().chatManager().asyncGetConversationsFromServerWithCursor(cursor, filter, new EMValueCallBack>() { + @Override + public void onSuccess(EMCursorResult value) { + List datas=value.getData(); + if(!CollectionUtils.isEmpty(datas)){ + result.addAll(datas); + } + String cursor_ = value.getCursor(); + if(!TextUtils.isEmpty(cursor_)){ + doAsyncGetConversationsFromServerWithCursor(result,cursor_,filter); + } + } + + @Override + public void onError(int error, String errorMsg) { + + } + }); + } +``` + +### 根据会话标记从本地查询会话列表 + +对于本地会话,你可以调用 `getAllConversations` 方法获取本地所有会话后自己进行会话过滤。下面以查询标记了 `EMConversation.EMMarkType.MARK_0` 的所有本地会话为例。 + +```java +//最终的查询结果全部放入 result 中。 +List result=new ArrayList<>(); +Map localConversations = EMClient.getInstance().chatManager().getAllConversations(); +if(localConversations!=null&&!localConversations.isEmpty()){ + for(EMConversation conversation:localConversations.values()){ + Set marks = conversation.marks(); + if(marks!=null&&!marks.isEmpty()){ + for(EMConversation.EMMarkType mark:marks){ + if(mark==EMConversation.EMMarkType.MARK_0){ + result.add(conversation); + } + } + } + } +} +``` + +### 获取本地单个会话的所有标记 + +你可以调用 `EMConversation#marks` 方法获取本地单个会话的所有标记,示例代码如下: + +```java +EMConversation conversation = EMClient.getInstance().chatManager().getConversation("conversationId"); +Set marks = conversation.marks(); +``` + + + + + + + + diff --git a/docs/document/android/message_manage.md b/docs/document/android/message_manage.md index 3c957fee1..fd01b0175 100644 --- a/docs/document/android/message_manage.md +++ b/docs/document/android/message_manage.md @@ -115,7 +115,7 @@ EMConversation conversation = EMClient.getInstance().chatManager().getConversati conversation.removeMessage(deleteMsg.msgId); ``` -删除服务端的会话及其历史消息,详见 [删除服务端会话及其历史消息](message_retrieve.html#单向删除服务端会话及其历史消息)。 +删除服务端的会话及其历史消息,详见 [删除服务端会话及其历史消息](conversation_delete.html#单向删除服务端会话及其历史消息)。 ### 根据消息 ID 获取消息 diff --git a/docs/document/android/multi_device.md b/docs/document/android/multi_device.md index d1cf34cd9..b557fda16 100644 --- a/docs/document/android/multi_device.md +++ b/docs/document/android/multi_device.md @@ -341,6 +341,9 @@ private class ChatEMMultiDeviceListener implements EMMultiDeviceListener { case CONVERSATION_DELETED: //当前用户在其他设备上删除了服务端的会话。 break; + case CONVERSATION_MARK_UPDATE: + //当前用户在其他设备上更新了会话标记,包括添加和移除会话标记。 + break; } } diff --git a/docs/document/android/releasenote.md b/docs/document/android/releasenote.md index a879b8271..c0ed8bea5 100644 --- a/docs/document/android/releasenote.md +++ b/docs/document/android/releasenote.md @@ -2,6 +2,22 @@ +## 版本 V4.3.0 Dev 2023-12-22(开发版) + +### 新增特性 + +- [IM SDK] 附件消息支持分片上传。 +- [IM SDK] 支持[会话标记功能](conversation_mark.html)。 + - `EMChatManager#asyncAddConversationMark`:[标记会话](conversation_mark.html#标记会话)。 + - `EMChatManager#asyncRemoveConversationMark`:[取消标记会话](conversation_mark.html#取消标记会话)。 + - `EMChatManager#asyncGetConversationsFromServerWithCursor`:[根据会话标记从服务器分页查询会话列表](conversation_mark.html#根据会话标记从服务器分页查询会话列表)。 + - `EMConversation#marks`:[获取本地单个会话的所有标记](conversation_mark.html#获取本地单个会话的所有标记)。 + +### 优化 + +- [IM SDK] 移除 FPA 功能,重新编译 boringssl、cipherdb、libevent 库,减小 SDK 体积。 +- [IM SDK] 单个日志文件大小由 2 MB 提升到 5 MB。 + ## 版本 V4.2.1 Dev 2023-11-17(开发版) ### 新增特性 @@ -94,11 +110,11 @@ ### 新增特性 -- [IM SDK] 新增 `EMChatManager#asyncFetchConversationsFromServer` 方法实现[从服务器拉取会话](message_retrieve.html#从服务器分页获取会话列表),原接口标记为已废弃。 +- [IM SDK] 新增 `EMChatManager#asyncFetchConversationsFromServer` 方法实现[从服务器拉取会话](conversation_list.html#从服务器分页获取会话列表),原接口标记为已废弃。 - [IM SDK] 新增置顶服务器会话的功能: - - 新增 `EMChatManager#asyncPinConversation` 方法,实现[置顶或取消置顶服务器会话](message_retrieve.html#置顶会话): - - 新增 `EMChatManager#asyncFetchPinnedConversationsFromServer` 方法,实现[获取置顶的服务器会话](message_retrieve.html#获取服务端的置顶会话列表)。 -- [IM SDK] 新增 `EMChatManager#getAllConversationsBySort` 方法实现[从本地获取排序后的会话列表](message_manage.html#获取本地所有会话); + - 新增 `EMChatManager#asyncPinConversation` 方法,实现[置顶或取消置顶服务器会话](conversation_pin.html#置顶会话): + - 新增 `EMChatManager#asyncFetchPinnedConversationsFromServer` 方法,实现[获取置顶的服务器会话](conversation_pin.html#获取服务端的置顶会话列表)。 +- [IM SDK] 新增 `EMChatManager#getAllConversationsBySort` 方法实现[从本地获取排序后的会话列表](conversation_list.html#获取本地所有会话); - [IM SDK] 新增在群组或聊天室中[发送定向消息](message_send_receive.html#发送和接收定向消息)的功能; - [IM SDK] 新增[荣耀推送](push.html#荣耀推送集成)。 @@ -162,7 +178,7 @@ ### 新增特性 -[IM SDK] [新增 `EMChatManager#asyncFetchConversationsFromServer(int, int, EMValueCallBack)` 方法实现从服务端分页获取会话列表](message_retrieve.html#从服务器分页获取会话列表)。 +[IM SDK] [新增 `EMChatManager#asyncFetchConversationsFromServer(int, int, EMValueCallBack)` 方法实现从服务端分页获取会话列表](conversation_list.html#从服务器分页获取会话列表)。 ### 优化 diff --git a/docs/document/applet/releasenote.md b/docs/document/applet/releasenote.md index ed60dcddc..6d8f39d3d 100644 --- a/docs/document/applet/releasenote.md +++ b/docs/document/applet/releasenote.md @@ -63,7 +63,7 @@ #### 新增特性 -- [IM SDK] 在 `getConversationlist` 方法中新增分页参数 `pageNum` 和 `pageSize`,支持[分页方法获取会话列表](message_retrieve.html#从服务器分页获取会话列表)。 +- [IM SDK] 在 `getConversationlist` 方法中新增分页参数 `pageNum` 和 `pageSize`,支持[分页方法获取会话列表](conversation_list.html#从服务器分页获取会话列表)。 - [IM SDK] 新增[群组创建事件 `create`](group_manage.html#监听群组事件)。群组创建后,群主的其他设备会收到该事件。 #### 优化 @@ -134,7 +134,7 @@ ### 新增特性: - [IM SDK] 新增消息子区(message thread)功能; -- [IM SDK] 新增 [getConversationList](/document/web/message_retrieve.html) 方法解析会话中的最新一条消息; +- [IM SDK] 新增 [getConversationList](/document/web/conversation_list.html) 方法解析会话中的最新一条消息; ### 优化: diff --git a/docs/document/flutter/releasenote.md b/docs/document/flutter/releasenote.md index 656d7cbd9..bccea09c5 100644 --- a/docs/document/flutter/releasenote.md +++ b/docs/document/flutter/releasenote.md @@ -30,14 +30,14 @@ - 新增[消息修改功能](message_modify.html): - 新增 `EMChatManager#modifyMessage` 方法用户修改已发送的消息,目前只支持文本消息; - 新增 `EMChatEventHandler#onMessageContentChanged` 回调,用户监听消息修改实现; -- 新增[会话置顶功能](message_retrieve.html#置顶会话): +- 新增[会话置顶功能](conversation_pin.html#置顶会话): - 新增 `EMChatManager#pinConversation` 方法,实现在服务器会话列表中置顶/取消置顶会话; - 新增 `EMChatManager#fetchPinnedConversations` 方法,从服务器获取已置顶会话; - [以下方法新增支持用户 token](multi_device.html#获取指定账号的在线登录设备列表): - 新增 `EMClient#fetchLoggedInDevices` 方法,可使用 token 获取已登录的设备列表; - 新增 `EMClient#kickDevice` 方法,可以使用 token 踢掉指定设备; - 新增 `EMClient#kickAllDevices` 方法,可以使用 token 踢掉所有已登录设备; -- 新增 `EMChatManager#fetchConversation` 方法,[获取服务器会话列表](message_retrieve.html#从服务器分页获取会话列表),原方法 `EMChatManager#getConversationsFromServer` 作废; +- 新增 `EMChatManager#fetchConversation` 方法,[获取服务器会话列表](conversation_list.html#从服务器分页获取会话列表),原方法 `EMChatManager#getConversationsFromServer` 作废; - 新增 `EMMessage#receiverList` 属性,用于在群组/聊天室中[发送定向消息](message_send_receive.html#发送和接收定向消息); ### 优化 diff --git a/docs/document/ios/conversation_mark.md b/docs/document/ios/conversation_mark.md new file mode 100644 index 000000000..269feb6b4 --- /dev/null +++ b/docs/document/ios/conversation_mark.md @@ -0,0 +1,106 @@ +# 会话标记 + + + +某些情况下,你可能需要对会话添加标记,例如会话标星或将会话标为已读或未读。即时通讯云 IM 支持对单聊和群聊会话添加标记,最大支持 20 个标记,所以一个会话最多可添加 20 个标记。 + +如果要使用会话标记功能,你需要确保开通了[会话列表服务](conversation_list.html#从服务器分页获取会话列表)并将 SDK 版本升级至 4.3.0 或以上版本。 + +你需要自行维护会话标记与具体业务含义(比如 `EMMarkType0` 为重要会话)之间的映射关系。例如: + +```Objective-C +NSDictionary* mapping = @{ + @(EMMarkType0): @"important", + @(EMMarkType1): @"normal", + @(EMMarkType2): @"unimportant", + @(EMMarkType3): @"boys", + @(EMMarkType4): @"girls", + }; +``` + +## 技术原理 + +环信即时通讯 IM 支持会话标记功能,主要方法如下: + +- `EMChatManager#addConversationMark:completion`:标记会话。 +- `EMChatManager#removeConversationMark:completion`:取消标记会话。 +- `EMChatManager#getConversationsFromServerWithCursor:filter:completion`:根据会话标记从服务器分页查询会话列表。 +- 根据会话标记从本地查询会话列表:调用 `getAllConversations` 方法获取本地所有会话后自己进行会话过滤。 +- 获取本地单个会话的所有标记:调用 `getConversationWithConvId` 方法获取本地单个会话,然后从会话的 `marks` 属性中查看该会话的所有标记。 + +## 前提条件 + +开始前,请确保满足以下条件: + +- 完成 SDK 初始化,并连接到服务器,详见 [快速开始](quickstart.html)。 +- 了解环信即时通讯 IM API 的使用限制,详见 [使用限制](/product/limitation.html)。 +- **[开通服务端会话列表功能](conversation_list#从服务器分页获取会话列表)**。 + +## 实现方法 + +### 标记会话 + +你可以调用 `addConversationMark` 方法标记会话。每次最多可为 20 个会话添加标记。调用该方法会同时为本地和服务器端的会话添加标记。 + +添加会话标记后,若调用 `getConversationsFromServerWithCursor:pageSize:completion` 接口从服务器分页获取会话列表,返回的会话对象中包含会话标记,即 `EMConversation#marks` 字段。若你已经达到了服务端会话列表长度限制(默认 100 个会话),服务端会根据会话的活跃度删除不活跃会话,这些会话的会话标记也随之删除。 + +:::tip +对会话添加标记,例如会话标星,并不影响会话的其他逻辑,例如会话的未读消息数。 +::: + +```Objective-C +[EMClient.sharedClient.chatManager addConversationMark:@[@"conversationId1"] mark:EMMarkType0 completion:^(EMError * _Nullable aError) { + + }]; +``` + +### 取消标记会话 + +你可以调用 `removeConversationMark` 方法删除会话标记。每次最多可移除 20 个会话的标记。 + +调用该方法会同时移除本地和服务器端会话的标记。 + +```Objective-C +[EMClient.sharedClient.chatManager removeConversationMark:@[@"conversationId1"] mark:EMMarkType0 completion:^(EMError * _Nullable aError) { + + }]; +``` + +### 根据会话标记从服务器分页查询会话列表 + +你可以调用 `getConversationsFromServerWithCursor` 方法根据会话标记从服务器分页获取会话列表。SDK 会按会话标记的时间的倒序返回会话列表,每个会话对象中包含会话 ID、会话类型、是否为置顶状态、置顶时间(对于未置顶的会话,值为 `0`)、会话标记以及最新一条消息。从服务端拉取会话列表后会更新本地会话列表。 + + +```Objective-C +//cursor:查询的开始位置。若传入空字符串,SDK 从最新标记操作的会话开始获取。 +// filter:会话查询选项,包括会话标记和每页获取的会话条数(最多可获取 10 条)。 +EMConversationFilter* filter = [[EMConversationFilter alloc] initWithMark:EMMarkType0 pageSize:10]; +[EMClient.sharedClient.chatManager getConversationsFromServerWithCursor:@"" filter:filter completion:^(EMCursorResult * _Nullable result, EMError * _Nullable error) { + + }]; +``` + +### 根据会话标记从本地查询会话列表 + +对于本地会话,你可以调用 `getAllConversations` 方法获取本地所有会话后自己进行会话过滤。下面以查询标记了 `EMMarkType0` 的所有本地会话为例。 + +```Objective-C +//最终的查询结果全部放入 result 中。 +NSMutableArray* result = [NSMutableArray array]; + NSArray* allConversations = [EMClient.sharedClient.chatManager getAllConversations]; +for (EMConversation* conversation in allConversations) { + if ([conversation.marks containsObject:@(EMMarkType0)]) { + [result addObject:conversation]; + } +} +``` + +### 获取本地单个会话的所有标记 + +要获取本地单个会话的所有标记,你需要首先调用 `getConversationWithConvId` 方法获取本地单个会话,然后从会话的 `marks` 属性中查看该会话的所有标记,示例代码如下: + +```Objective-C +EMConversation* conversation = [EMClient.sharedClient.chatManager getConversationWithConvId:@"conversationId"]; + NSArray* marks = conversation.marks; +``` + diff --git a/docs/document/ios/message_manage.md b/docs/document/ios/message_manage.md index 088e427db..36c0022ed 100644 --- a/docs/document/ios/message_manage.md +++ b/docs/document/ios/message_manage.md @@ -119,7 +119,7 @@ EMConversation *conversation = [[EMClient sharedClient].chatManager getConversat [conversation deleteMessageWithId:.messageId error:nil]; ``` -删除服务端的会话及其历史消息,详见 [删除服务端会话及其历史消息](message_retrieve.html#单向删除服务端会话及其历史消息)。 +删除服务端的会话及其历史消息,详见 [删除服务端会话及其历史消息](conversation_delete.html#单向删除服务端会话及其历史消息)。 ### 根据消息 ID 搜索消息 diff --git a/docs/document/ios/multi_device.md b/docs/document/ios/multi_device.md index c47cef817..ff53a76b2 100644 --- a/docs/document/ios/multi_device.md +++ b/docs/document/ios/multi_device.md @@ -316,6 +316,9 @@ NSString *password = @""; // 当前用户在其他设备上删除了服务端的会话。 case EMMultiDevicesEventConversationDelete: break; + //当前用户在其他设备上更新了会话标记,包括添加和移除会话标记。 + case EMMultiDevicesEventConversationUpdateMark: + break; default: break; } diff --git a/docs/document/ios/releasenote.md b/docs/document/ios/releasenote.md index 9bf08b68e..9fa60434b 100644 --- a/docs/document/ios/releasenote.md +++ b/docs/document/ios/releasenote.md @@ -2,6 +2,22 @@ +## 版本 V4.3.0 Dev 2023-12-22(开发版) + +### 新增特性 + +- [IM SDK] 附件消息支持分片上传。 +- [IM SDK] 支持[会话标记功能](conversation_mark.html)。 + - `EMChatManager#addConversationMark:completion`:[标记会话](conversation_mark.html#标记会话)。 + - `EMChatManager#removeConversationMark:completion`:[取消标记会话](conversation_mark.html#取消标记会话)。 + - `EMChatManager#getConversationsFromServerWithCursor:filter:completion`:[根据会话标记从服务器分页查询会话列表](conversation_mark.html#根据会话标记从服务器分页查询会话列表)。 + - `EMConversation#marks`:[获取本地单个会话的所有标记](conversation_mark.html#获取本地单个会话的所有标记)。 + +### 优化 + +- [IM SDK] 移除 FPA 功能,减小 SDK 体积。 +- [IM SDK] 单个日志文件大小由 2 MB 提升到 5 MB。 + ## 版本 V4.2.0 Dev 2023-11-13(开发版) ### 新增特性 @@ -73,11 +89,11 @@ ### 新增特性 -- [IM SDK] 新增 `IEMChatManager#getConversationsFromServerWithCursor:pageSize:completion:` 方法,实现[从服务器拉取会话](message_retrieve.html#从服务器分页获取会话列表)的功能,原接口 `getConversationsFromServer` 和 `getConversationsFromServerByPage:pageSize:completion:` 标记为已废弃。 +- [IM SDK] 新增 `IEMChatManager#getConversationsFromServerWithCursor:pageSize:completion:` 方法,实现[从服务器拉取会话](conversation_list.html#从服务器分页获取会话列表)的功能,原接口 `getConversationsFromServer` 和 `getConversationsFromServerByPage:pageSize:completion:` 标记为已废弃。 - [IM SDK] 新增置顶服务器会话的功能: - - 新增 `IEMChatManager#pinConversation:completionBlock:` 方法,实现[置顶或取消置顶服务器会话](message_retrieve.html#置顶会话): - - 新增 `IEMChatManager#getPinnedConversationsFromServerWithCursor:pageSize:completion` 方法,实现[获取置顶的服务器会话](message_retrieve.html#获取服务端的置顶会话列表)。 -- [IM SDK] 新增 `IEMChatManager#getAllConversations:` 方法,实现[从本地获取排序后的会话列表](message_manage.html#获取本地所有会话)。 + - 新增 `IEMChatManager#pinConversation:completionBlock:` 方法,实现[置顶或取消置顶服务器会话](conversation_pin.html#置顶会话): + - 新增 `IEMChatManager#getPinnedConversationsFromServerWithCursor:pageSize:completion` 方法,实现[获取置顶的服务器会话](conversation_pin.html#获取服务端的置顶会话列表)。 +- [IM SDK] 新增 `IEMChatManager#getAllConversations:` 方法,实现[从本地获取排序后的会话列表](conversation_list.html#获取本地所有会话)。 - [IM SDK] 新增在群组或聊天室中[发送定向消息](message_send_receive.html#发送和接收定向消息)功能。 ### 优化 @@ -124,7 +140,7 @@ ### 新增特性 -[IM SDK] [新增 `EMChatManager#getConversationsFromServerByPage:pageSize:completion` 方法实现从服务端分页获取会话列表](message_retrieve.html#从服务器分页获取会话列表)。 +[IM SDK] [新增 `EMChatManager#getConversationsFromServerByPage:pageSize:completion` 方法实现从服务端分页获取会话列表](conversation_list.html#从服务器分页获取会话列表)。 ### 优化 diff --git a/docs/document/react-native/releasenote.md b/docs/document/react-native/releasenote.md index 2bf6c4f2a..3b8db6dfe 100644 --- a/docs/document/react-native/releasenote.md +++ b/docs/document/react-native/releasenote.md @@ -14,8 +14,8 @@ - React-Native 从 0.66.5 升级到 0.71.11。 - 依赖的原生 SDK(iOS 和 Android)升级到版本 4.1.1。添加原生 SDK 提供的新功能。 -- 新增 `ChatManager.fetchConversationsFromServerWithCursor` 方法[从服务器分页获取会话列表](message_manage.html#获取会话列表)。 -- 新增[置顶服务器会话的功能](message_manage.html#获取服务端的置顶会话列表): +- 新增 `ChatManager.fetchConversationsFromServerWithCursor` 方法[从服务器分页获取会话列表](conversation_list.html#获取会话列表)。 +- 新增[置顶服务器会话的功能](conversation_list.html#获取服务端的置顶会话列表): - 新增 `ChatManager.pinConversation` 方法,实现置顶或取消置顶服务器会话; - 新增 `ChatManager.fetchPinnedConversationsFromServerWithCursor` 从服务器分页获取置顶会话列表。 - 新增 `ChatManager.modifyMessageBody` 方法,用于修改本地消息或服务器端消息。 diff --git a/docs/document/unity/message_manage.md b/docs/document/unity/message_manage.md index 5595e77c9..dcf36e06b 100644 --- a/docs/document/unity/message_manage.md +++ b/docs/document/unity/message_manage.md @@ -112,7 +112,7 @@ Conversation conv = SDKClient.Instance.ChatManager.GetConversation(conversationI conv.DeleteMessage(msgId); ``` -删除服务端的会话及其历史消息,详见 [删除服务端会话及其历史消息](message_retrieve.html#单向删除服务端会话及其历史消息)。 +删除服务端的会话及其历史消息,详见 [删除服务端会话及其历史消息](conversation_delete.html#单向删除服务端会话及其历史消息)。 ### 根据消息 ID 搜索消息 diff --git a/docs/document/unity/releasenote.md b/docs/document/unity/releasenote.md index 400b79517..03f4d7cc4 100644 --- a/docs/document/unity/releasenote.md +++ b/docs/document/unity/releasenote.md @@ -25,7 +25,7 @@ - `SDKClient#GetLoggedInDevicesFromServerWithToken`:获取指定账号下登录的在线设备列表; - `SDKClient#KickDeviceWithToken`:将指定账号登录的指定设备踢下线; - `SDKClient#KickAllDevicesWithToken`:将指定账号登录的所有设备都踢下线。 -- [IM SDK] 新增[会话置顶功能](message_retrieve.html#置顶会话): +- [IM SDK] 新增[会话置顶功能](conversation_pin.html#置顶会话): - `Conversation#IsPinned`:判断该会话是否被置顶; - `Conversation#PinnedTime`:会话置顶时间戳。 - [IM SDK] 新增 `ChatManager#FetchHistoryMessagesFromServerBy` 方法根据消息拉取参数配置类 `FetchServerMessagesOption` 从服务器获取历史消息
@@ -37,7 +37,7 @@ - `FetchServerMessagesOption#MsgTypes`:要查询的消息类型列表; - `FetchServerMessagesOption#StartTime`:消息查询的起始时间; - `FetchServerMessagesOption#EndTime`:消息查询的结束时间。 -- [IM SDK] 新增 `GetConversationsFromServerWithCursor` 方法[从服务端分页获取会话列表](message_retrieve.html#从服务器获取会话)。 +- [IM SDK] 新增 `GetConversationsFromServerWithCursor` 方法[从服务端分页获取会话列表](conversation_list.html#从服务器分页获取会话列表)。 - [IM SDK] 新增[在群组或聊天室中发送定向消息功能](message_send_receive.html#发送和接收定向消息): - `Message#ReceiverList`:设置群组或聊天室消息接收列表。 - [IM SDK] 新增 `Conversation#DeleteMessages`方法删除本地数据库中指定时间段的消息。 @@ -84,7 +84,7 @@ ### 修复 -1. 修复 [`ChatManager#FetchHistoryMessageFromServer`](message_retrieve.html#从服务器获取会话) 方法在安卓环境下调用失败的问题。 +1. 修复 [`ChatManager#FetchHistoryMessageFromServer`](conversation_list.html#从服务器分页获取会话列表) 方法在安卓环境下调用失败的问题。 2. 修复在安卓环境下发送视频消息没有回调的问题。 ## 版本 V1.1.0 Dev 2023-2-25 diff --git a/docs/document/web/conversation_mark.md b/docs/document/web/conversation_mark.md new file mode 100644 index 000000000..8d319b6b6 --- /dev/null +++ b/docs/document/web/conversation_mark.md @@ -0,0 +1,103 @@ +# 会话标记 + + + +某些情况下,你可能需要对会话添加标记,例如会话标星或将会话标为已读或未读。即时通讯云 IM 支持对单聊和群聊会话添加标记,最大支持 20 个标记,所以一个会话最多可添加 20 个标记。 + +如果要使用会话标记功能,你需要确保开通了[会话列表服务](conversation_list.html#从服务器分页获取会话列表)并将 SDK 版本升级至 4.4.0 或以上版本。 + +你需要自行维护会话标记与具体业务含义(比如 `MarkType.mark_0`[这里面扔一个连接,跳转到API REFERENCE MarkType] 为待处理会话)之间的映射。 + +```javascript +const MarkMap = new Map(); +MarkMap.set(0, 'IMPORTANT'); +MarkMap.set(1, 'NORMAL'); +MarkMap.set(2, 'STAR'); +``` + +## 技术原理 + +环信即时通讯 IM 支持会话标记功能,主要方法如下: + +- `addConversationMark`:标记会话。 +- `removeConversationMark`:取消标记会话。 +- `getServerConversationsByFilter`:根据会话标记从服务器分页查询会话列表。 + +## 前提条件 + +开始前,请确保满足以下条件: + +- 完成 SDK 初始化,并连接到服务器,详见 [快速开始](quickstart.html)。 +- 了解环信即时通讯 IM API 的使用限制,详见 [使用限制](/product/limitation.html)。 +- **[开通服务端会话列表功能](conversation_list#从服务器分页获取会话列表)**。 + +## 实现方法 + +### 标记会话 + +你可以调用 `addConversationMark` 方法标记会话。调用该方法会为服务器端的会话添加标记。 + +添加会话标记后,若调用 `getServerConversations` 方法从服务器分页获取会话列表,返回的会话对象中包含会话标记,即 `ConversationItem#marks` 字段。若你已经达到了服务端会话列表长度限制(默认 100 个会话),服务端会根据会话的活跃度删除不活跃会话,这些会话的会话标记也随之删除。 + +:::tip +对会话添加标记,例如会话标星,并不影响会话的其他逻辑,例如会话的未读消息数。 +::: + + +```javascript +const options = { + conversations: [ + {conversationId: 'test', conversationType: 'singleChat'}, + {conversationId: 'groupId', conversationType: 'groupChat'} + ], + mark: 0, +} + +conn.addConversationMark(options).then(() => { + console.log('addConversationMark success') +}) +``` + +### 取消标记会话 + +你可以调用 `removeConversationMark` 方法删除会话标记。 + +调用该方法会同时移除本地和服务器端会话的标记。 + +```javascript +const options = { + conversations: [ + {conversationId: 'test', conversationType: 'singleChat'}, + {conversationId: 'groupId', conversationType: 'groupChat'} + ], + mark: 0, +} + +conn.removeConversationMark(options).then(() => { + console.log('removeConversationMark success') +}) +``` + +### 根据会话标记从服务器分页查询会话列表 + +你可以调用 `getServerConversationsByFilter` 方法根据会话标记从服务器分页获取会话列表。SDK 会按会话标记的时间的倒序返回会话列表,每个会话对象中包含会话 ID、会话类型、是否为置顶状态、置顶时间(对于未置顶的会话,值为 `0`)、未读消息数、会话标记以及最新一条消息。 + +```javascript +const options = { + pageSize: 10, + cursor: '', + filter: { + mark: 0 + } +} +conn.getServerConversationsByFilter().then((res) => { + console.log('getServerConversationsByFilter success', res) +}) +``` + + + + + + + diff --git a/docs/document/web/multi_device.md b/docs/document/web/multi_device.md index ada57983b..1f3d3b8a1 100644 --- a/docs/document/web/multi_device.md +++ b/docs/document/web/multi_device.md @@ -61,20 +61,26 @@ conn.addEventHandler("handlerId", { //当前用户在其他设备上删除了服务端的会话。 break; case "memberAttributesUpdate": - // 群成员属性更新 + //当前用户在其他设备上更新了群成员属性。 break; case "deleteRoaming": - // 删除历史消息 + //当前用户在其他设备上删除历史消息。 break; case "deleteConversation": - // 删除会话 + //当前用户在其他设备上删除会话。 break; case "pinnedConversation": - // 置顶会话 + //当前用户在其他设备上置顶会话。 break; case "unpinnedConversation": - // 取消置顶会话 + //当前用户在其他设备上取消置顶会话。 break; + case "markConversation": + //当前用户在其他设备上标记会话。 + break; + case "unMarkConversation": + //当前用户在其他设备上取消标记会话。 + break; default: break; } diff --git a/docs/document/web/releasenote.md b/docs/document/web/releasenote.md index 5444e165e..f7e429c81 100644 --- a/docs/document/web/releasenote.md +++ b/docs/document/web/releasenote.md @@ -2,6 +2,23 @@ +## 版本 V4.4.0 Dev 2023-12-22(开发版) + +### 新增特性 + +- [IM SDK] 附件消息支持分片上传。 +- [IM SDK] 新增[会话标记功能](conversation_mark.html)。 + - `addConversationMark`:[标记会话](conversation_mark.html#标记会话)。 + - `removeConversationMark`:[取消标记会话](conversation_mark.html#取消标记会话)。 + - `getServerConversationsByFilter`:[根据会话标记从服务器分页查询会话列表](conversation_mark.html#根据会话标记从服务器分页查询会话列表)。 +- [IM SDK] 增加 `onMessage` 回调。在收到文本、图片、视频、语音、地理位置和文件等消息时,批量将消息回调给应用。 +- [IM SDK] 视频类型消息增加视频首帧缩略图, 通过 `videoMessage.thumb` 访问。 + +### 修复 + +- [IM SDK] SDK 类型修正。 +- [IM SDK] vite 引入 MiniCore SDK 报错。 + ## 版本 V4.3.1 Dev 2023-12-13(开发版) ### 新增特性 @@ -37,7 +54,7 @@ ### 新增特性 -- [IM SDK] 新增 `LocalCache` 模块[实现本地会话数据管理](message_manage.html)。 +- [IM SDK] 新增 `LocalCache` 模块[实现本地会话数据管理](conversation_local.html)。 - [IM SDK] 用户申请加群被拒绝的回调 `joinPublicGroupDeclined` 中增加申请人的用户 ID。 ## 版本 V4.2.0 Dev 2023-07-27 @@ -55,9 +72,9 @@ ### 新增特性 -1. 新增 `pinConversation` 方法实现[会话置顶和取消置顶](message_retrieve.html#置顶会话)。 -2. 新增 `getServerPinnedConversations` 方法[分页获取服务器端的置顶会话列表](message_retrieve.html#获取服务端的置顶会话列表)。 -3. 新增 `getServerConversations` 方法[分页获取排序后的服务端会话列表](message_retrieve.html#从服务器分页获取会话列表)。原接口 `getConversationlist` 已废弃。 +1. 新增 `pinConversation` 方法实现[会话置顶和取消置顶](conversation_pin.html#置顶会话)。 +2. 新增 `getServerPinnedConversations` 方法[分页获取服务器端的置顶会话列表](conversation_pin.html#获取服务端的置顶会话列表)。 +3. 新增 `getServerConversations` 方法[分页获取排序后的服务端会话列表](conversation_list.html#从服务器分页获取会话列表)。原接口 `getConversationlist` 已废弃。 4. 新增[在群组或聊天室会话中发送定向消息](message_send_receive.html#发送定向消息)。通过在构建消息的方法 `create` 中添加 `receiverList` 参数实现该特性。 5. 在从服务器获取历史消息的方法 `getHistoryMessages` 的返回数据中新增 `isLast` 字段表示返回的是否为最后一页数据。 6. 在构建图片消息的方法 `create` 中新增 [`thumbnailWidth` 和 `thumbnailHeight`](message_send_receive.html#发送图片消息) 参数用于设置缩略图的宽度和高度。 @@ -76,7 +93,7 @@ ### 新增特性 -- [IM SDK] 新增 `searchOptions` 参数对象(包含 `from`、`msgTypes`、`startTime` 和 `endTime` 参数),允许用户调用 `getHistoryMessages` 方法时[按消息发送方、消息类型或时间段从服务端拉取历史消息](message_manage.html#在消息上添加-Reaction)。 +- [IM SDK] 新增 `searchOptions` 参数对象(包含 `from`、`msgTypes`、`startTime` 和 `endTime` 参数),允许用户调用 `getHistoryMessages` 方法时[按消息发送方、消息类型或时间段从服务端拉取历史消息](message_retrieve.html#从服务器获取指定会话的历史消息)。 - [IM SDK] 新增错误码 511,即 MESSAGE_SIZE_LIMIT,若[消息体大小超过限制](message_overview.html#消息类型)时提示用户。 ## 版本 V4.1.4 Dev 2023-03-16 @@ -100,7 +117,7 @@ #### 新增特性 -- [IM SDK] 在 `getConversationlist` 方法中新增分页参数 `pageNum` 和 `pageSize`,支持[分页方法获取会话列表](message_retrieve.html#从服务器分页获取会话列表)。 +- [IM SDK] 在 `getConversationlist` 方法中新增分页参数 `pageNum` 和 `pageSize`,支持[分页方法获取会话列表](conversation_list.html#从服务器分页获取会话列表)。 - [IM SDK] 新增[群组创建事件 `create`](group_manage.html#监听群组事件)。群组创建后,群主的其他设备会收到该事件。 #### 优化 @@ -194,7 +211,7 @@ ### 新增特性: - [IM SDK] 新增消息子区(message thread)功能; -- [IM SDK] 新增 [getConversationlist](message_retrieve.html#从服务器获取消息) 方法解析会话中的最新一条消息; +- [IM SDK] 新增 [getConversationlist](conversation_list.html#从服务器分页获取会话列表) 方法解析会话中的最新一条消息; ### 优化: diff --git a/docs/document/windows/releasenote.md b/docs/document/windows/releasenote.md index 83590b44b..ed200003a 100644 --- a/docs/document/windows/releasenote.md +++ b/docs/document/windows/releasenote.md @@ -25,7 +25,7 @@ - `SDKClient#GetLoggedInDevicesFromServerWithToken`:获取指定账号下登录的在线设备列表; - `SDKClient#KickDeviceWithToken`:将指定账号登录的指定设备踢下线; - `SDKClient#KickAllDevicesWithToken`:将指定账号登录的所有设备都踢下线。 -- [IM SDK] 新增[会话置顶功能](message_retrieve.html#置顶会话): +- [IM SDK] 新增[会话置顶功能](conversation_pin.html#置顶会话): - `Conversation#IsPinned`:判断该会话是否被置顶; - `Conversation#PinnedTime`:会话置顶时间戳。 - [IM SDK] 新增 `ChatManager#FetchHistoryMessagesFromServerBy` 方法根据消息拉取参数配置类 `FetchServerMessagesOption` 从服务器获取历史消息。
@@ -38,7 +38,7 @@ - `FetchServerMessagesOption#MsgTypes`:要查询的消息类型列表; - `FetchServerMessagesOption#StartTime`:消息查询的起始时间; - `FetchServerMessagesOption#EndTime`:消息查询的结束时间。 -- [IM SDK] 新增 `GetConversationsFromServerWithCursor` 方法从[服务端分页获取会话列表](message_retrieve.html#从服务器获取会话)。 +- [IM SDK] 新增 `GetConversationsFromServerWithCursor` 方法从[服务端分页获取会话列表](conversation_list.html#从服务器分页获取会话列表)。 - [IM SDK] 新增[在群组或聊天室中发送定向消息功能](message_send_receive.html#发送和接收定向消息): - `Message#ReceiverList`:设置群组或聊天室消息接收列表。 - [IM SDK] 新增删除本地数据库中指定时间段的消息: From 765983e1f852f2e01a054bf592427f17770c0ac9 Mon Sep 17 00:00:00 2001 From: haoxiuwen Date: Fri, 22 Dec 2023 17:16:59 +0800 Subject: [PATCH 2/8] Add Conversation Docs --- docs/document/android/conversation_delete.md | 62 +++++ docs/document/android/conversation_list.md | 78 ++++++ .../document/android/conversation_overview.md | 72 ++++++ docs/document/android/conversation_pin.md | 84 +++++++ docs/document/android/conversation_unread.md | 67 +++++ docs/document/android/message_manage.md | 80 +----- docs/document/android/message_retrieve.md | 150 +---------- docs/document/applet/releasenote.md | 14 ++ docs/document/flutter/conversation_delete.md | 61 +++++ docs/document/flutter/conversation_list.md | 66 +++++ .../document/flutter/conversation_overview.md | 63 +++++ docs/document/flutter/conversation_pin.md | 75 ++++++ docs/document/flutter/conversation_unread.md | 65 +++++ docs/document/flutter/message_manage.md | 117 +-------- docs/document/flutter/message_retrieve.md | 117 +-------- docs/document/ios/conversation_delete.md | 50 ++++ docs/document/ios/conversation_list.md | 65 +++++ docs/document/ios/conversation_overview.md | 65 +++++ docs/document/ios/conversation_pin.md | 61 +++++ docs/document/ios/conversation_unread.md | 64 +++++ docs/document/ios/message_manage.md | 86 +------ docs/document/ios/message_retrieve.md | 90 +------ .../react-native/conversation_delete.md | 58 +++++ .../react-native/conversation_list.md | 69 ++++++ .../react-native/conversation_overview.md | 66 +++++ .../document/react-native/conversation_pin.md | 73 ++++++ .../react-native/conversation_unread.md | 108 ++++++++ docs/document/react-native/message_manage.md | 233 +----------------- docs/document/unity/conversation_delete.md | 52 ++++ docs/document/unity/conversation_list.md | 90 +++++++ docs/document/unity/conversation_overview.md | 68 +++++ docs/document/unity/conversation_pin.md | 58 +++++ docs/document/unity/conversation_unread.md | 68 +++++ docs/document/unity/message_manage.md | 89 +------ docs/document/unity/message_retrieve.md | 111 +-------- docs/document/web/conversation_delete.md | 43 ++++ docs/document/web/conversation_list.md | 58 +++++ ...essage_manage.md => conversation_local.md} | 34 +-- docs/document/web/conversation_mark.md | 2 +- docs/document/web/conversation_overview.md | 48 ++++ docs/document/web/conversation_pin.md | 57 +++++ docs/document/web/message_retrieve.md | 135 ++-------- docs/document/windows/conversation_delete.md | 52 ++++ docs/document/windows/conversation_list.md | 90 +++++++ .../document/windows/conversation_overview.md | 68 +++++ docs/document/windows/conversation_pin.md | 58 +++++ docs/document/windows/conversation_unread.md | 68 +++++ docs/document/windows/message_manage.md | 89 +------ docs/document/windows/message_retrieve.md | 111 +-------- 49 files changed, 2349 insertions(+), 1359 deletions(-) create mode 100644 docs/document/android/conversation_delete.md create mode 100644 docs/document/android/conversation_list.md create mode 100644 docs/document/android/conversation_overview.md create mode 100644 docs/document/android/conversation_pin.md create mode 100644 docs/document/android/conversation_unread.md create mode 100644 docs/document/flutter/conversation_delete.md create mode 100644 docs/document/flutter/conversation_list.md create mode 100644 docs/document/flutter/conversation_overview.md create mode 100644 docs/document/flutter/conversation_pin.md create mode 100644 docs/document/flutter/conversation_unread.md create mode 100644 docs/document/ios/conversation_delete.md create mode 100644 docs/document/ios/conversation_list.md create mode 100644 docs/document/ios/conversation_overview.md create mode 100644 docs/document/ios/conversation_pin.md create mode 100644 docs/document/ios/conversation_unread.md create mode 100644 docs/document/react-native/conversation_delete.md create mode 100644 docs/document/react-native/conversation_list.md create mode 100644 docs/document/react-native/conversation_overview.md create mode 100644 docs/document/react-native/conversation_pin.md create mode 100644 docs/document/react-native/conversation_unread.md create mode 100644 docs/document/unity/conversation_delete.md create mode 100644 docs/document/unity/conversation_list.md create mode 100644 docs/document/unity/conversation_overview.md create mode 100644 docs/document/unity/conversation_pin.md create mode 100644 docs/document/unity/conversation_unread.md create mode 100644 docs/document/web/conversation_delete.md create mode 100644 docs/document/web/conversation_list.md rename docs/document/web/{message_manage.md => conversation_local.md} (76%) create mode 100644 docs/document/web/conversation_overview.md create mode 100644 docs/document/web/conversation_pin.md create mode 100644 docs/document/windows/conversation_delete.md create mode 100644 docs/document/windows/conversation_list.md create mode 100644 docs/document/windows/conversation_overview.md create mode 100644 docs/document/windows/conversation_pin.md create mode 100644 docs/document/windows/conversation_unread.md diff --git a/docs/document/android/conversation_delete.md b/docs/document/android/conversation_delete.md new file mode 100644 index 000000000..fdf4efd2d --- /dev/null +++ b/docs/document/android/conversation_delete.md @@ -0,0 +1,62 @@ +# 删除会话 + + + +删除好友或退出群组后,SDK 不会自动删除对应的单聊或群聊会话。你可以调用相应的接口从服务器和本地删除单个会话及其历史消息。 + +## 前提条件 + +开始前,请确保满足以下条件: + +- 完成 SDK 初始化,并连接到服务器,详见 [快速开始](quickstart.html)。 +- 了解环信即时通讯 IM API 的使用限制,详见 [使用限制](/product/limitation.html)。 + +## 技术原理 + +环信即时通讯 IM 支持从服务器和本地删除单个会话及其历史消息,主要方法如下: + +- `deleteConversationFromServer`:单向删除服务端的单个会话及其历史消息。 +- `deleteConversation`:删除本地单个会话及其历史消息。 + +## 实现方法 + +### 单向删除服务端会话及其历史消息 + +你可以调用 `deleteConversationFromServer` 方法删除服务器端会话和历史消息。会话和消息删除后,当前用户无法从服务器获取该会话和消息,对本地的会话无影响,但会删除本地消息,而其他用户不受影响。 + +调用该方法之前,需调用 `getConversation` 方法获取会话 ID。 + +示例代码如下: + +```java +//获取指定的会话 ID。 +EMConversation conversation = EMClient.getInstance().chatManager().getConversation(username); + +// 删除指定会话。如果需要保留历史消息,`isDeleteServerMessages` 传 `false`。 +EMClient.getInstance().chatManager().deleteConversationFromServer(conversationId, conversationType, isDeleteServerMessages, new EMCallBack() { + @Override + public void onSuccess() { + + } + + @Override + public void onError(int code, String error) { + + } +}); +``` + +### 删除本地会话及历史消息 + +你可以删除本地会话和历史消息,示例代码如下: + +```java +// 删除指定用户的会话,如果需要保留历史消息,传 `false`。 +EMClient.getInstance().chatManager().deleteConversation(username, true); +``` + +```java +// 删除指定会话中指定的一条历史消息。 +EMConversation conversation = EMClient.getInstance().chatManager().getConversation(username); +conversation.removeMessage(deleteMsg.msgId); +``` diff --git a/docs/document/android/conversation_list.md b/docs/document/android/conversation_list.md new file mode 100644 index 000000000..3b654cde1 --- /dev/null +++ b/docs/document/android/conversation_list.md @@ -0,0 +1,78 @@ +# 会话列表 + + + +对于单聊、群组聊天和聊天室会话,用户发消息时 SDK 会自动创建会话并将会话添加至用户的会话列表。 + +环信服务器和本地均存储会话,你可以获取会话列表。**服务器默认存储 100 条会话,可存储 7 天。若提升这两个上限,需联系环信商务。** + +## 前提条件 + +开始前,请确保满足以下条件: + +- 完成 SDK 初始化,并连接到服务器,详见 [快速开始](quickstart.html)。 +- 了解环信即时通讯 IM API 的使用限制,详见 [使用限制](/product/limitation.html)。 + +## 技术原理 + +环信即时通讯 IM 支持从服务器和本地获取会话列表,主要方法如下: + +- `asyncFetchConversationsFromServer`:从服务器获取会话列表。 +- `getAllConversationsBySort`:获取本地所有会话。 + +## 实现方法 + +### 从服务器分页获取会话列表 + +你可以调用 `asyncFetchConversationsFromServer` 方法从服务端分页获取会话列表,包含单聊和群组聊天会话,不包含聊天室会话。SDK 按照会话活跃时间(会话的最新一条消息的时间戳)的倒序返回会话列表,每个会话对象中包含会话 ID、会话类型、是否为置顶状态、置顶时间(对于未置顶的会话,值为 `0`)、会话标记以及最新一条消息。从服务端拉取会话列表后会更新本地会话列表。 + +若在初始化时,将 `EMOptions#setLoadEmptyConversations` 设置为 `true` 允许返回空会话,则会话列表中会包含空会话,否则不包含。 + +:::tip +1. **若使用该功能,需在环信控制台开通,并将 SDK 升级至 4.0.3。而且,只有开通该功能,你才能使用置顶会话和会话标记功能。** +2. 建议你在首次下载、卸载后重装应用等本地数据库无数据情况下拉取服务端会话列表。其他情况下,调用 `getAllConversationsBySort` 或 `getAllConversations` 方法获取本地所有会话即可。 +3. 通过 RESTful 接口发送的消息默认不创建或写入会话。若会话中的最新一条消息通过 RESTful 接口发送,获取会话列表时,该会话中的最新一条消息显示为通过非 RESTful 接口发送的最新消息。若要开通 RESTful 接口发送的消息写入会话列表的功能,需联系商务。 +::: + +示例代码如下: + +```java +// limit: 每页返回的会话数。取值范围为 [1,50]。 +// cursor: 开始获取数据的游标位置。若获取数据时传 `null` 或者空字符串(""),SDK 从最新活跃的会话开始获取。 +int limit = 10; +String cursor = ""; +EMClient.getInstance().chatManager().asyncFetchConversationsFromServer(limit, cursor, new EMValueCallBack>() { + @Override + public void onSuccess(EMCursorResult result) { + // 获取到的会话列表 + List conversations = result.getData(); + // 下一次请求的 cursor + String nextCursor = result.getCursor(); + } + + @Override + public void onError(int error, String errorMsg) { + + } +}); +``` + +### 获取本地所有会话 + +你可以调用 `getAllConversationsBySort` 方法一次性获取本地所有会话。SDK 从内存中获取会话,若未从本地数据库中加载过,会先从数据库加载到内存中。获取会话后,SDK 按照会话活跃时间(最新一条消息的时间戳)的倒序返回会话,置顶会话在前,非置顶会话在后,会话列表为 `List` 结构。 + +本地会话列表包含单聊和群组聊天会话,至于是否包含聊天室会话,取决于在 SDK 初始化时 `com.hyphenate.chat.EMOptions#setDeleteMessagesAsExitChatRoom` 参数的设置。若设置为 `true`,即离开聊天室时删除该聊天室的所有本地消息,则本地会话列表中不包含聊天室会话。若设置为 `false`,即保留该聊天室的所有本地消息,则本地会话列表中包含聊天室会话。 + +若在初始化时,将 `EMOptions#setLoadEmptyConversations` 设置为 `true` 允许返回空会话,则会话列表中会包含空会话,否则不包含。 + +:::tip +若使用该功能,需将 SDK 升级至 4.0.3。 +::: + +示例代码如下: + +```java +List conversations = EMClient.getInstance().chatManager().getAllConversationsBySort(); +``` + +你也可以调用 `getAllConversations` 方法返回 `Map ` 结构的会话。 \ No newline at end of file diff --git a/docs/document/android/conversation_overview.md b/docs/document/android/conversation_overview.md new file mode 100644 index 000000000..55877dbc4 --- /dev/null +++ b/docs/document/android/conversation_overview.md @@ -0,0 +1,72 @@ + +# 会话介绍 + + + +会话是一个单聊、群聊或者聊天室所有消息的集合。用户需在会话中发送消息、查看或清空历史消息等操作。 + +环信即时通讯 IM SDK 提供 `EMChatManager` 和 `EMConversation` 类以会话为单位对消息数据进行管理,如获取会话列表、置顶会话、添加会话标记、删除会话和管理未读消息等。 + +## 会话类 + +环信即时通讯 IM 提供会话类 `EMConversation`。该类定义了以下内容: + +| 类/方法 | 描述 | +| :--------- | :------- | +| EMConversationType | 会话类型枚举。
- `Chat`:单聊会话;
- `GroupChat`:群聊会话;
- `ChatRoom`:聊天室会话。 | +| EMSearchDirection | 消息搜索方向枚举。
- UP:按照消息中的 Unix 时间戳的逆序搜索。
- DOWN:按照消息中的时间戳的正序搜索。 | +| EMMarkType | 会话标记枚举类型:MARK_0,MARK_1,MARK_2,MARK_3,MARK_4,MARK_5,MARK_6,MARK_7,MARK_8,MARK_9,MARK_10,MARK_11,MARK_12,MARK_13,MARK_14,MARK_15,MARK_16,MARK_17,MARK_18,MARK_19。 | +| marks | 获取会话的所有标记。 | +| conversationId | 会话 ID,取决于会话类型。
- 单聊:会话 ID 为对方的用户 ID;
- 群聊:会话 ID 为群组 ID;
- 聊天室:会话 ID 为聊天室的 ID。| +| getType | 获取会话类型。 | +| getUnreadMsgCount | 获取会话中未读的消息数量。 | +| markAllMessagesAsRead | 将所有未读消息设置为已读。 | +| markMessageAsRead | 设置指定消息为已读。 | +| getAllMsgCount | 获取 SDK 本地数据库中会话的全部消息数。 | +| loadMoreMsgFromDB(String startMsgId, int pageSize) | 从 SDK 本地数据库中分页加载消息。加载的消息会基于消息中的时间戳放入当前会话的缓存中,调用 `getAllMessages` 时会返回所有加载的消息。 | +| loadMoreMsgFromDB(String startMsgId, int pageSize, EMSearchDirection direction) | 从指定消息 ID 开始分页加载数据库中的消息。加载到的消息会加入到当前会话的消息中。 | +| searchMsgFromDB(long timeStamp, int maxCount, EMSearchDirection direction) | 基于 Unix 时间戳搜索本地数据库中的消息。 | +| searchMsgFromDB(EMMessage.Type type, long timeStamp, int maxCount, String from, EMSearchDirection direction) | 从本地数据库获取指定会话的一定数量的特定类型的消息。 | +| searchMsgFromDB(String keywords, long timeStamp, int maxCount, String from, EMSearchDirection direction) | 从本地数据库获取会话中的指定用户发送的包含特定关键词的消息。 | +| searchMsgFromDB(long startTimeStamp, long endTimeStamp, int maxCount) | 从本地数据库中搜索指定时间段内发送或接收的一定数量的消息。 | +| searchCustomMsgFromDB(String keywords, long timeStamp, int maxCount, String from, EMSearchDirection direction) | 从本地数据库获取会话中的指定用户发送的包含特定关键词的自定义消息。 | +| getMessage | 根据消息 ID 获取已读的消息。 | +| getAllMessages | 获取该会话当前内存中的所有消息。 | +| removeMessage | 删除本地数据库中的一条指定消息。 | +| getLastMessage | 获取会话中的最新一条消息。 | +| getLatestMessageFromOthers | 获取会话中收到的最新一条消息。 | +| clear | 清除会话中的所有消息。只清除内存的,不清除本地数据库的消息。 | +| clearAllMessages | 清除内存和数据库中指定会话中的消息。 | +| setExtField | 设置会话的扩展字段。 | +| getExtField | 获取会话的扩展字段。 | +| isPinned | 获取会话的置顶状态。 | +| getPinnedTime | 获取会话置顶时间。会话置顶的 UNIX 时间戳,单位为毫秒。未置顶时值为 `0`。 | +| insertMessage | 在本地数据库的会话中插入一条消息。消息的会话 ID 应与会话的 ID 一致。消息会根据消息里的 Unix 时间戳插入本地数据库,SDK 会更新会话的 `latestMessage` 等属性。 | +| updateMessage | 更新本地数据库的指定消息。消息更新后,消息 ID 不会修改,SDK 会自动更新会话的 `latestMessage` 等属性。 | +| removeMessagesFromServer(List, EMCallBack) | 根据消息 ID 删除单向删除漫游消息。 | +| removeMessagesFromServer(long, EMCallBack) | 根据时间单向删除漫游消息。 | +| removeMessages | 从本地数据库中删除指定时间段内的消息。 | + + +## 会话事件 + +`EMConversationListener` 中提供会话事件的监听接口。开发者可以通过设置此监听,获取会话事件,并做出相应处理。如果不再使用该监听,需要移除,防止出现内存泄漏。 + +示例代码如下: + +```java +EMConversationListener listener=new EMConversationListener() { + // 收到会话已读的事件。该事件在以下场景中触发: + // 1. 当消息接收方调用 `ackConversationRead()` 方法,SDK 会执行此回调,会将本地数据库中该会话中消息的 `isAcked` 属性置为 `true`。 + // 2. 多端多设备登录时,若一端发送会话已读回执(conversation ack),服务器端会将会话的未读消息数置为 0,同时其他端会回调此方法,并将本地数据库中该会话中消息的 `isRead` 属性置为 `true`。 + @Override + public void onConversationRead(String from, String to) { + } + }; +``` + + + + + + diff --git a/docs/document/android/conversation_pin.md b/docs/document/android/conversation_pin.md new file mode 100644 index 000000000..62cb4f0cd --- /dev/null +++ b/docs/document/android/conversation_pin.md @@ -0,0 +1,84 @@ +# 会话置顶 + + + +会话置顶指将单聊或群聊会话固定在会话列表的顶部,方便用户查找。例如,将重点会话置顶,可快速定位会话。 + +## 前提条件 + +开始前,请确保满足以下条件: + +- 完成 SDK 初始化,并连接到服务器,详见 [快速开始](quickstart.html)。 +- 了解环信即时通讯 IM API 的使用限制,详见 [使用限制](/product/limitation.html)。 +- **[开通服务端会话列表功能](conversation_list#从服务器分页获取会话列表)**。 + +## 技术原理 + +环信即时通讯 IM 支持会话置顶,主要方法如下: + +- `asyncPinConversation`:置顶会话。 +- `asyncFetchPinnedConversationsFromServer`:获取服务端置顶会话列表。 + +## 实现方法 + +### 置顶会话 + +你可以调用 `asyncPinConversation` 方法设置是否置顶会话。置顶状态会存储在服务器上,多设备登录情况下,更新的置顶状态会同步到其他登录设备,其他登录设备分别会收到 `CONVERSATION_PINNED` 和 `CONVERSATION_UNPINNED` 事件。 + +你最多可以置顶 50 个会话。 + +:::tip +若使用该功能,需将 SDK 升级至 4.0.3。 +::: + +示例代码如下: + +```java +EMClient.getInstance().chatManager().asyncPinConversation(conversationId, isPinned, new EMCallBack() { + @Override + public void onSuccess() { + + } + + @Override + public void onError(int code, String error) { + + } +}); +``` + +你可以通过 `EMConversation` 对象的 `isPinned` 字段检查会话是否为置顶状态,或者调用 `getPinnedTime` 方法获取会话置顶时间。 + +### 获取服务端的置顶会话列表 + +你可以调用 `asyncFetchPinnedConversationsFromServer` 方法从服务端分页获取置顶会话列表。SDK 按照会话置顶时间的倒序返回。 + +你最多可以拉取 50 个置顶会话。 + +:::tip +若使用该功能,需将 SDK 升级至 4.0.3。 +::: + +示例代码如下: + +```java +// limit: 每页返回的会话数。取值范围为 [1,50]。 +// cursor: 开始获取数据的游标位置。若获取数据时传 `null` 或者空字符串(""),SDK 从最新置顶的会话开始查询。 +int limit = 10; +String cursor = ""; +EMClient.getInstance().chatManager().asyncFetchPinnedConversationsFromServer(limit, cursor, new EMValueCallBack>() { + @Override + public void onSuccess(EMCursorResult result) { + // 获取到的会话列表 + List conversations = result.getData(); + // 下一次请求的 cursor + String nextCursor = result.getCursor(); + } + + @Override + public void onError(int error, String errorMsg) { + + } +}); +``` + diff --git a/docs/document/android/conversation_unread.md b/docs/document/android/conversation_unread.md new file mode 100644 index 000000000..081b7976d --- /dev/null +++ b/docs/document/android/conversation_unread.md @@ -0,0 +1,67 @@ +## 会话未读数 + + + +你可以查看本地所有会话或指定会话的未读消息数,并针对会话的未读消息数清零。 + +## 前提条件 + +开始前,请确保满足以下条件: + +- 完成 SDK 初始化并连接到服务器,详见 [快速开始](quickstart.html)。 +- 了解环信即时通讯 IM API 的使用限制,详见 [使用限制](/product/limitation.html)。 + +## 技术原理 + +环信即时通讯 IM Android SDK 通过 `EMChatManager` 和 `EMConversation` 类实现对本地会话的未读消息数的管理,其中核心方法如下: + +- `EMChatManager#getUnreadMessageCount`:获取本地所有会话的未读消息数。 +- `EMConversation#getUnreadMsgCount`:获取本地指定会话的未读消息数。 +- `EMChatManager#markAllConversationsAsRead`:将本地所有会话的未读消息数清零。 +- `EMChatManager#markAllMessagesAsRead`:对于本地指定会话的未读消息数清零。 +- `EMConversation#markMessageAsRead`:将指定会话的单条未读消息置为已读。 + +## 实现方法 + +### 获取所有会话的未读消息数 + +你可以调用 `getUnreadMessageCount` 方法获取本地所有会话的未读消息数量,示例代码如下: + +```java +EMClient.getInstance().chatManager().getUnreadMessageCount(); +``` + +### 获取指定会话的未读消息数 + +你可以调用 `getUnreadMsgCount` 获取本地指定会话的未读消息数,示例代码如下: + +```java +EMConversation conversation = EMClient.getInstance().chatManager().getConversation(username); +conversation.getUnreadMsgCount(); +``` + +### 将所有会话的未读消息数清零 + +你可以调用 `markAllConversationsAsRead` 方法将本地所有会话的未读消息数清零,示例代码如下: + +```java +EMClient.getInstance().chatManager().markAllConversationsAsRead(); +``` + +### 指定会话的未读消息数清零 + +你可以调用 `markAllMessagesAsRead` 方法对指定会话的未读消息数清零,示例代码如下: + +```java +EMConversation conversation = EMClient.getInstance().chatManager().getConversation(username); +conversation.markAllMessagesAsRead(); +``` + +### 将指定会话的单条未读消息置为已读 + +你可以调用 `markMessageAsRead` 方法将指定会话的单条未读消息置为已读。 + +```java +EMConversation conversation = EMClient.getInstance().chatManager().getConversation(username); +conversation.markMessageAsRead(messageId); +``` diff --git a/docs/document/android/message_manage.md b/docs/document/android/message_manage.md index fd01b0175..ef6f8f7b3 100644 --- a/docs/document/android/message_manage.md +++ b/docs/document/android/message_manage.md @@ -1,22 +1,16 @@ -# 管理本地会话和消息 +# 管理本地消息 -本文介绍环信即时通讯 IM SDK 如何管理本地会话和消息。SDK 内部使用 SQLite 保存本地消息,方便消息处理。 +本文介绍环信即时通讯 IM SDK 如何管理本地消息,例如获取消息、搜索消息、导入消息、插入消息、更新消息以及统计消息流量等。 -除了发送和接收消息外,环信即时通讯 IM SDK 还支持以会话为单位对本地的消息数据进行管理,如获取与管理未读消息、搜索和删除历史消息以及统计消息流量等。其中,会话是一个单聊、群聊或者聊天室所有消息的集合。用户需在会话中发送消息、查看或清空历史消息等操作。 +SDK 内部使用 SQLite 保存本地消息,方便消息处理。 ## 技术原理 -环信即时通讯 IM Android SDK 支持管理用户设备上存储的消息会话数据,其中包含如下主要方法: +环信即时通讯 IM Android SDK 支持管理用户设备上存储的消息数据,其中包含如下主要方法: -- `EMChatManager.getAllConversationsBySort` 获取本地所有会话; - `EMConversation.getAllMessages/loadMoreMsgFromDB` 从本地读取指定会话的消息; -- `EMConversation.getUnreadMsgCount` 获取指定会话的未读消息数; -- `EMChatManager.getUnreadMessageCount` 获取所有会话的未读消息数; -- `EMChatManager.markAllConversationsAsRead` 指定会话的未读消息数清零; -- `EMChatManager.deleteConversation` 删除会话及历史消息; -- `EMConversation.getUnreadMsgCount` 获取指定会话的未读消息数; - `EMChatManager.getMessage` 根据消息 ID 获取消息; - `EMChatManager.searchMsgFromDB(Type type, long timeStamp, int maxCount, String from, EMConversation.EMSearchDirection direction)` 获取指定会话中特定类型的消息; - `EMChatManager.searchMsgFromDB(long startTimeStamp, long endTimeStamp, int maxCount)` 获取指定时间段内发送或接收的消息; @@ -37,24 +31,6 @@ ## 实现方法 -### 获取本地所有会话 - -你可以调用 `getAllConversationsBySort` 方法一次性获取本地所有会话。若在初始化时,将 `EMOptions#setLoadEmptyConversations` 设置为 `true` 允许返回空会话,则会话列表中会包含空会话,否则不包含。 - -SDK 从内存中获取会话,若未从本地数据库中加载过,会先从数据库加载到内存中。获取会话后,SDK 按照会话活跃时间(最新一条消息的时间戳)的倒序返回会话,置顶会话在前,非置顶会话在后,会话列表为 `List` 结构。 - -:::notice -若使用该功能,需将 SDK 升级至 4.0.3。 -::: - -示例代码如下: - -```java -List conversations = EMClient.getInstance().chatManager().getAllConversationsBySort(); -``` - -你也可以调用 `getAllConversations` 方法返回 `Map ` 结构的会话。 - ### 从本地读取指定会话的消息 你可以调用 `getAllMessages` 方法获取指定会话在内存中的所有消息。如果内存中为空,SDK 再从本地数据库中加载最近一条消息。 @@ -69,54 +45,6 @@ List messages = conversation.getAllMessages(); List messages = conversation.loadMoreMsgFromDB(startMsgId, pagesize); ``` -### 获取指定会话的未读消息数 - -你可以调用接口获取特定会话的未读消息数,示例代码如下: - -```java -EMConversation conversation = EMClient.getInstance().chatManager().getConversation(username); -conversation.getUnreadMsgCount(); -``` - -### 获取所有会话的未读消息数 - -你可以通过接口获取所有会话的未读消息数量,示例代码如下: - -```java -EMClient.getInstance().chatManager().getUnreadMessageCount(); -``` - -### 指定会话的未读消息数清零 - -你可以调用接口对特定会话的未读消息数清零,示例代码如下: - -```java -EMConversation conversation = EMClient.getInstance().chatManager().getConversation(username); -// 指定会话的未读消息数清零。 -conversation.markAllMessagesAsRead(); -// 将一条消息置为已读。 -conversation.markMessageAsRead(messageId); -// 将所有未读消息数清零。 -EMClient.getInstance().chatManager().markAllConversationsAsRead(); -``` - -### 删除会话及历史消息 - -你可以删除本地会话和历史消息,示例代码如下: - -```java -// 删除和特定用户的会话,如果需要保留历史消息,传 `false`。 -EMClient.getInstance().chatManager().deleteConversation(username, true); -``` - -```java -// 删除指定会话中指定的一条历史消息。 -EMConversation conversation = EMClient.getInstance().chatManager().getConversation(username); -conversation.removeMessage(deleteMsg.msgId); -``` - -删除服务端的会话及其历史消息,详见 [删除服务端会话及其历史消息](conversation_delete.html#单向删除服务端会话及其历史消息)。 - ### 根据消息 ID 获取消息 你可以调用 `getMessage` 方法根据消息 ID 获取本地存储的指定消息。如果消息不存在会返回空值。 diff --git a/docs/document/android/message_retrieve.md b/docs/document/android/message_retrieve.md index 114f2a1d3..efcefa5bf 100644 --- a/docs/document/android/message_retrieve.md +++ b/docs/document/android/message_retrieve.md @@ -1,134 +1,15 @@ -# 管理服务端的会话和消息 +# 管理服务端的消息 -环信即时通讯 IM 提供消息漫游功能,即将用户的所有会话的历史消息保存在消息服务器,用户在任何一个终端设备上都能获取到历史信息,使用户在多个设备切换使用的情况下也能保持一致的会话场景。本文介绍用户如何获取和删除服务端的会话和消息。 - -:::tip -本文介绍的功能均为增值服务,需在[环信即时通讯 IM 管理后台](https://console.easemob.com/user/login)开通。 -::: +环信即时通讯 IM 提供消息漫游功能,即将用户的所有会话的历史消息保存在消息服务器,用户在任何一个终端设备上都能获取到历史信息,使用户在多个设备切换使用的情况下也能保持一致的会话场景。本文介绍用户如何获取和删除服务端的消息。 ## 技术原理 -使用环信即时通讯 IM SDK 可以从服务器获取历史消息。 +使用环信即时通讯 IM SDK 可以从服务器获取和删除历史消息,主要方法如下: -- `asyncFetchConversationsFromServer` 分页获取服务器保存的会话列表; -- `asyncFetchPinnedConversationsFromServer` 分页获取服务器保存的置顶会话列表; -- `asyncPinConversation` 置顶会话。 - `asyncFetchHistoryMessage` 从服务端分页获取指定会话的历史消息; - `removeMessagesFromServer` 单向删除服务端的历史消息; -- `deleteConversationFromServer` 删除服务端的会话及其历史消息。 - -## 前提条件 - -开始前,请确保满足以下条件: - -- 完成 SDK 初始化,并连接到服务器,详见 [快速开始](quickstart.html)。 -- 了解环信即时通讯 IM API 的使用限制,详见 [使用限制](/product/limitation.html)。 - -## 实现方法 - -### 从服务器分页获取会话列表 - -对于单聊或群聊,用户发消息时会自动将对方添加到用户的会话列表。 - -你可以调用 `asyncFetchConversationsFromServer` 方法从服务端分页获取会话列表。若在初始化时,将 `EMOptions#setLoadEmptyConversations` 设置为 `true` 允许返回空会话,则会话列表中会包含空会话,否则不包含。 - -SDK 按照会话活跃时间(会话的最新一条消息的时间戳)的倒序返回会话列表,每个会话对象中包含会话 ID、会话类型、是否为置顶状态、置顶时间(对于未置顶的会话,值为 `0`)以及最新一条消息。从服务端拉取会话列表后会更新本地会话列表。 - -服务器默认存储 100 条会话,可存储 7 天。若提升这两个上限,需联系环信商务。 - -:::notice -1. 若使用该功能,需将 SDK 升级至 4.0.3。 -2. 建议你在首次下载、卸载后重装应用等本地数据库无数据情况下拉取服务端会话列表。其他情况下,调用 `getAllConversationsBySort` 或 `getAllConversations` 方法获取本地所有会话即可。 -3. 通过 RESTful 接口发送的消息默认不创建或写入会话。若会话中的最新一条消息通过 RESTful 接口发送,获取会话列表时,该会话中的最新一条消息显示为通过非 RESTful 接口发送的最新消息。若要开通 RESTful 接口发送的消息写入会话列表的功能,需联系商务。 -::: - -示例代码如下: - -```java -// limit: 每页返回的会话数。取值范围为 [1,50]。 -// cursor: 开始获取数据的游标位置。若获取数据时传 `null` 或者空字符串(""),SDK 从最新活跃的会话开始获取。 -int limit = 10; -String cursor = ""; -EMClient.getInstance().chatManager().asyncFetchConversationsFromServer(limit, cursor, new EMValueCallBack>() { - @Override - public void onSuccess(EMCursorResult result) { - // 获取到的会话列表 - List conversations = result.getData(); - // 下一次请求的 cursor - String nextCursor = result.getCursor(); - } - - @Override - public void onError(int error, String errorMsg) { - - } -}); -``` - -## 获取服务端的置顶会话列表 - -你可以调用 `asyncFetchPinnedConversationsFromServer` 方法从服务端分页获取置顶会话列表。SDK 按照会话置顶时间的倒序返回。 - -你最多可以拉取 50 个置顶会话。 - -:::notice -若使用该功能,需将 SDK 升级至 4.0.3。 -::: - -示例代码如下: - -```java -// limit: 每页返回的会话数。取值范围为 [1,50]。 -// cursor: 开始获取数据的游标位置。若获取数据时传 `null` 或者空字符串(""),SDK 从最新置顶的会话开始查询。 -int limit = 10; -String cursor = ""; -EMClient.getInstance().chatManager().asyncFetchPinnedConversationsFromServer(limit, cursor, new EMValueCallBack>() { - @Override - public void onSuccess(EMCursorResult result) { - // 获取到的会话列表 - List conversations = result.getData(); - // 下一次请求的 cursor - String nextCursor = result.getCursor(); - } - - @Override - public void onError(int error, String errorMsg) { - - } -}); -``` - -### 置顶会话 - -会话置顶指将单聊或群聊会话固定在会话列表的顶部,方便用户查找。例如,将重点会话置顶,可快速定位会话。 - -置顶状态会存储在服务器上,多设备登录情况下,更新置顶状态会同步到其他登录设备。你最多可以置顶 50 个会话。 - -你可以调用 `asyncPinConversation` 方法设置是否置顶会话。多设备登录情况下,会话置顶或取消置顶后,其他登录设备分别会收到 `CONVERSATION_PINNED` 和 `CONVERSATION_UNPINNED` 事件。 - -:::notice -若使用该功能,需将 SDK 升级至 4.0.3。 -::: - -示例代码如下: - -```java -EMClient.getInstance().chatManager().asyncPinConversation(conversationId, isPinned, new EMCallBack() { - @Override - public void onSuccess() { - - } - - @Override - public void onError(int code, String error) { - - } -}); -``` - -你可以通过 `EMConversation` 对象的 `isPinned` 字段检查会话是否为置顶状态,或者调用 `getPinnedTime` 方法获取会话置顶时间。 ### 分页获取指定会话的历史消息 @@ -201,28 +82,3 @@ conversation.removeMessagesFromServer(time, new EMCallBack() { } }); ``` -### 单向删除服务端会话及其历史消息 - -你可以调用 `deleteConversationFromServer` 方法删除服务器端会话和历史消息。会话和消息删除后,当前用户无法从服务器获取该会话和消息,对本地的会话无影响,但会删除本地消息,而其他用户不受影响。 - -调用该方法之前,需调用 `getConversation` 方法获取会话 ID。 - -示例代码如下: - -```java -//获取指定的会话 ID。 -EMConversation conversation = EMClient.getInstance().chatManager().getConversation(username); - -// 删除指定会话。如果需要保留历史消息,`isDeleteServerMessages` 传 `false`。 -EMClient.getInstance().chatManager().deleteConversationFromServer(conversationId, conversationType, isDeleteServerMessages, new EMCallBack() { - @Override - public void onSuccess() { - - } - - @Override - public void onError(int code, String error) { - - } -}); -``` \ No newline at end of file diff --git a/docs/document/applet/releasenote.md b/docs/document/applet/releasenote.md index 6d8f39d3d..a376dde3e 100644 --- a/docs/document/applet/releasenote.md +++ b/docs/document/applet/releasenote.md @@ -2,6 +2,20 @@ +## 版本 V4.4.0 Dev 2023-12-22(开发版) + +### 新增特性 + +- [IM SDK] 新增[会话标记功能](conversation_mark.html)。 + - `addConversationMark`:[标记会话](conversation_mark.html#标记会话)。 + - `removeConversationMark`:[取消标记会话](conversation_mark.html#取消标记会话)。 + - `getServerConversationsByFilter`:[根据会话标记从服务器分页查询会话列表](conversation_mark.html#根据会话标记从服务器分页查询会话列表)。 +- [IM SDK] 增加 `onMessage` 回调。在收到文本、图片、视频、语音、地理位置和文件等消息时,批量将消息回调给应用。 + +### 修复 + +- [IM SDK] SDK 类型修正。 + ## 版本 V4.3.0 Dev 2023-11-17(开发版) ### 新增特性 diff --git a/docs/document/flutter/conversation_delete.md b/docs/document/flutter/conversation_delete.md new file mode 100644 index 000000000..1cd4539b9 --- /dev/null +++ b/docs/document/flutter/conversation_delete.md @@ -0,0 +1,61 @@ +# 删除会话 + + + +删除好友或退出群组后,SDK 不会自动删除对应的单聊或群聊会话。你可以调用相应的接口从服务器和本地删除单个会话及其历史消息。 + +## 前提条件 + +开始前,请确保满足以下条件: + +- 完成 SDK 初始化,并连接到服务器,详见 [快速开始](quickstart.html)。 +- 了解环信即时通讯 IM API 的使用限制,详见 [使用限制](/product/limitation.html)。 + +## 技术原理 + +环信即时通讯 IM 支持从服务器和本地删除单个会话及其历史消息,主要方法如下: + +- `EMChatManager#deleteRemoteConversation`:单向删除服务端会话及其历史消息。 +- `EMChatManager#deleteConversation`:删除本地单个会话及其历史消息。 + +## 实现方法 + +### 单向删除服务端会话及其历史消息 + +你可以调用 `deleteRemoteConversation` 方法删除服务器端会话和历史消息。会话和消息删除后,当前用户无法从服务器获取该会话和消息,对本地的会话无影响,但会删除本地消息,而其他用户不受影响。 + +```dart +// 会话 ID。 +String conversationId = "conversationId"; +// 删除会话时是否同时删除服务端的历史消息。 +bool deleteMessage = true; +EMConversationType conversationType = EMConversationType.Chat; +await EMClient.getInstance.chatManager.deleteRemoteConversation( + conversationId, + conversationType: conversationType, + isDeleteMessage: deleteMessage, +); +``` + +### 删除本地会话及其历史消息 + +- 删除会话时是否同时删除本地的历史消息。 + +```dart +// 会话 ID。 +String conversationId = "conversationId"; +// 删除会话时是否同时删除本地的历史消息 +bool deleteMessage = true; +await EMClient.getInstance.chatManager + .deleteConversation(conversationId, deleteMessage); +``` + +- 删除本地指定会话中的指定消息。 + +```dart +EMConversation? conversation = + await EMClient.getInstance.chatManager.getConversation( + conversationId, +); +conversation?.deleteMessage(messageId); +``` diff --git a/docs/document/flutter/conversation_list.md b/docs/document/flutter/conversation_list.md new file mode 100644 index 000000000..52d71b899 --- /dev/null +++ b/docs/document/flutter/conversation_list.md @@ -0,0 +1,66 @@ +# 会话列表 + + + +对于单聊、群组聊天和聊天室会话,用户发消息时 SDK 会自动创建会话并将会话添加至用户的会话列表。 + +环信服务器和本地均存储会话,你可以获取会话列表。**服务器默认存储 100 条会话,可存储 7 天。若提升这两个上限,需联系环信商务。** + +## 前提条件 + +开始前,请确保满足以下条件: + +- 完成 SDK 初始化,并连接到服务器,详见 [快速开始](quickstart.html)。 +- 了解环信即时通讯 IM API 的使用限制,详见 [使用限制](/product/limitation.html)。 + +## 技术原理 + +环信即时通讯 IM 支持从服务器和本地获取会话列表,主要方法如下: + +- `EMChatManager#fetchConversation`:从服务器获取会话列表。 +- `EMChatManager#loadAllConversations`:获取本地所有会话。 + +## 实现方法 + +### 从服务器分页获取会话列表 + +你可以调用 `fetchConversation` 方法从服务端分页获取会话列表,包含单聊和群组聊天会话,不包含聊天室会话。SDK 按照会话活跃时间(会话的最新一条消息的时间戳)的倒序返回会话列表,每个会话对象中包含会话 ID、会话类型、是否为置顶状态、置顶时间(对于未置顶的会话,值为 `0`)以及最新一条消息。从服务端拉取会话列表后会更新本地会话列表。 + +:::notice +1. **若使用该功能,需在环信控制台开通该功能,并将 SDK 升级至 4.0.0。只有开通该功能,你才能使用置顶会话功能。** +2. 建议在 app 安装时或本地没有会话时调用该方法,否则调用 `loadAllConversations` 获取本地会话即可。 +3. 通过 RESTful 接口发送的消息默认不创建或写入会话。若会话中的最新一条消息通过 RESTful 接口发送,获取会话列表时,该会话中的最新一条消息显示为通过非 RESTful 接口发送的最新消息。若要开通 RESTful 接口发送的消息写入会话列表的功能,需联系商务。 +::: + +示例代码如下: + +```dart +// pageSize: 每页返回的会话数。取值范围为 [1,50]。 +// cursor: 开始获取数据的游标位置。若获取数据时传空字符串(""),SDK 从最新活跃的会话开始获取。 +try { + int pageSize = 10; + String cursor = ""; + EMCursorResult result = + await EMClient.getInstance.chatManager.fetchConversation( + pageSize: pageSize, + cursor: cursor, + ); + // 获取到的会话列表 + List conversations = result.data; + // 下一次请求的 cursor + String? nextCursor = result.cursor; +} on EMError catch (e) {} +``` + +### 获取本地所有会话 + +你可以调用 `loadAllConversations` 方法获取本地所有会话。本地会话列表包含单聊和群组聊天会话,至于是否包含聊天室会话,取决于在 SDK 初始化时 `EMOptions#deleteMessagesAsExitChatRoom` 参数的设置。若设置为 `true`,即离开聊天室时删除该聊天室的所有本地消息,则本地会话列表中不包含聊天室会话。若设置为 `false`,即保留该聊天室的所有本地消息,则本地会话列表中包含聊天室会话。 + +```dart +try { + List lists = + await EMClient.getInstance.chatManager.loadAllConversations(); + // 成功加载会话。 +} on EMError catch (e) { +} +``` \ No newline at end of file diff --git a/docs/document/flutter/conversation_overview.md b/docs/document/flutter/conversation_overview.md new file mode 100644 index 000000000..4af4df3e9 --- /dev/null +++ b/docs/document/flutter/conversation_overview.md @@ -0,0 +1,63 @@ + +# 会话介绍 + + + +会话是一个单聊、群聊或者聊天室所有消息的集合。用户需在会话中发送消息、查看或清空历史消息等操作。 + +环信即时通讯 IM SDK 提供 `EMChatManager` 和 `EMConversation` 类以会话为单位对消息数据进行管理,如获取会话列表、置顶会话、添加会话标记、删除会话和管理未读消息等。 + +## 会话类 + +环信即时通讯 IM 提供会话类 `EMConversation`。该类定义了以下内容: + +| 方法 | 描述 | +| :--------- | :------- | +| id | 会话 ID,取决于会话类型。
- 单聊/help desk:会话 ID 为对方的用户 ID;
- 群聊:会话 ID 为群组 ID;
- 聊天室:会话 ID 为聊天室的 ID。| +| type | 会话类型枚举。
- `Chat`:单聊会话;
- `GroupChat`:群聊会话;
- `ChatRoom`:聊天室会话。
- `HelpDesk`:客服会话。 | +| isChatThread | 是否为子区会话。 | +| isPinned | 是否为置顶会话。 | +| pinnedTime | 会话置顶的 UNIX 时间戳,单位为毫秒。未置顶时值为 `0`。 | +| setExt | 获取会话扩展属性。 | +| latestMessage | 获取会话的最新一条消息。 | +| lastReceivedMessage | 获取最近收到的一条消息。 | +| unreadCount | 获取会话的消息未读数。 | +| markMessageAsRead | 将消息标为已读。 | +| markAllMessagesAsRead | 将所有消息标为已读。 | +| insertMessage | 插入一条消息在 SDK 本地数据库,消息的 conversation ID 应该和会话的 conversation ID 一致,消息会根据消息里的时间戳被插入 SDK 本地数据库,并且更新会话的 `latestMessage` 等属性。 | +| appendMessage | 插入一条消息到会话尾部。 | +| updateMessage | 更新 SDK 本地数据库的消息。 | +| deleteMessage(String messageId) | 删除会话中的一条消息,同时清除内存和数据库中的消息。 | +| deleteAllMessages() | 同时从内存和本地数据库中删除会话中的所有消息。 | +| deleteMessagesWithTs | 从本地数据库中删除指定时间段内的消息。 | +| loadMessage | 获取指定 ID 的消息。优先从内存中加载,如果内存中没有则从数据库中加载,并将其插入到内存中。 | +| loadMessagesWithMsgType | 根据消息类型、搜索消息的时间点、搜索结果的最大条数、搜索来源和搜索方向从 SDK 本地数据库中搜索指定数量的消息。 | +| loadMessages | 从本地数据库加载消息。加载到的消息也会加入到当前会话的缓存中,通过 getAllMessages 方法将会返回所有加载的消息。| +| loadMessagesWithKeyword | 根据消息中的关键词、搜索消息的时间点、搜索结果的最大条数、搜索来源和搜索方向从 SDK 本地数据库中搜索指定数量的消息。 | +| loadMessagesFromTime | 加载一个时间段内的消息,不超过 `count` 参数指定的最大数量。 | + +## 会话事件 + +`EMConversationListener` 中提供会话事件的监听接口。开发者可以通过设置此监听,获取会话事件,并做出相应处理。如果不再使用该监听,需要移除,防止出现内存泄漏。 + +示例代码如下: + +```dart + +EMClient.getInstance.chatManager.addEventHandler( + sdkEventKey, + EMChatEventHandler( + // 收到会话已读的事件。该事件在以下场景中触发: + // 1. 当消息接收放调用 `sendConversationReadAck` 方法,SDK 会执行此回调,并将本地数据库中 `Message` 的 `hasReadAck` 置为 `true`. + // 2. 多端多设备登录时,若一端发送会话已读回执(sendConversationReadAck),服务器端会将该会话的未读消息数置为 0,同时其他端会回调此方法,并将本地数据库中该会话中消息的 `hasRead` 属性置为 `true`。 + onConversationRead: (from, to) {}, + ), +); + +``` + + + + + + diff --git a/docs/document/flutter/conversation_pin.md b/docs/document/flutter/conversation_pin.md new file mode 100644 index 000000000..73f498cab --- /dev/null +++ b/docs/document/flutter/conversation_pin.md @@ -0,0 +1,75 @@ +# 会话置顶 + + + +会话置顶指将单聊或群聊会话固定在会话列表的顶部,方便用户查找。例如,将重点会话置顶,可快速定位会话。 + +## 前提条件 + +开始前,请确保满足以下条件: + +- 完成 SDK 初始化,并连接到服务器,详见 [快速开始](quickstart.html)。 +- 了解环信即时通讯 IM API 的使用限制,详见 [使用限制](/product/limitation.html)。 +- **[开通服务端会话列表功能](conversation_list#从服务器分页获取会话列表)**。 + +## 技术原理 + +环信即时通讯 IM 支持会话置顶,主要方法如下: + +- `EMChatManager#pinConversation`:置顶会话。 +- `EMChatManager#fetchPinnedConversations`:分页获取服务器保存的置顶会话列表。 + +## 实现方法 + +### 置顶会话 + +你可以调用 `pinConversation` 方法设置是否置顶会话。多设备登录情况下,更新的置顶状态会同步到其他登录设备,其他设备分别会收到 `EMMultiDevicesEvent.CONVERSATION_PINNED` 和 `EMMultiDevicesEvent.CONVERSATION_UNPINNED` 事件。 + +你最多可以置顶 50 个会话。 + +:::tip +若使用该功能,需将 SDK 升级至 4.0.3。 +::: + +示例代码如下: + +```dart +try { + await EMClient.getInstance.chatManager.pinConversation( + conversationId: conversationId, + isPinned: true, + ); +} on EMError catch (e) {} +``` + +你可以通过 `EMConversation` 对象的 `isPinned` 字段检查会话是否为置顶状态,或者调用 `getPinnedTime` 方法获取会话置顶时间。 + +## 获取服务端的置顶会话列表 + +你可以调用 `fetchPinnedConversations` 方法从服务端分页获取置顶会话列表。SDK 按照会话置顶时间的倒序返回。 + +你最多可以拉取 50 个置顶会话。 + +:::notice +若使用该功能,需将 SDK 升级至 4.0.3。 +::: + +示例代码如下: + +```dart +// pageSize: 每页返回的会话数。取值范围为 [1,50]。 +// cursor: 开始获取数据的游标位置。若获取数据时传 `null` 或者空字符串(""),SDK 从最新置顶的会话开始查询。 +try { + int pageSize = 10; + String cursor = ""; + EMCursorResult result = + await EMClient.getInstance.chatManager.fetchPinnedConversations( + pageSize: pageSize, + cursor: cursor, + ); + // 获取到的会话列表 + List conversations = result.data; + // 下一次请求的 cursor + String? nextCursor = result.cursor; +} on EMError catch (e) {} +``` \ No newline at end of file diff --git a/docs/document/flutter/conversation_unread.md b/docs/document/flutter/conversation_unread.md new file mode 100644 index 000000000..131da2458 --- /dev/null +++ b/docs/document/flutter/conversation_unread.md @@ -0,0 +1,65 @@ +## 会话未读数 + + + +你可以查看本地所有会话或指定会话的未读消息数,并针对会话的未读消息数清零。 + +## 前提条件 + +开始前,请确保满足以下条件: + +- 完成 SDK 初始化并连接到服务器,详见 [快速开始](quickstart.html)。 +- 了解环信即时通讯 IM API 的使用限制,详见 [使用限制](/product/limitation.html)。 + +## 技术原理 + +环信即时通讯 IM Flutter SDK 通过 `EMChatManager` 和 `EMConversation` 类实现对本地会话的未读消息数的管理,其中核心方法如下: + +- `EMChatManager#getUnreadMessageCount`:获取本地所有会话的未读消息数。 +- `EMConversation#unreadCount`:获取本地指定会话的未读消息数。 +- `EMChatManager#markAllConversationsAsRead`:将本地所有会话的未读消息数清零。 +- `EMConversation#markAllMessagesAsRead`:对于本地指定会话的未读消息数清零。 +- `EMConversation#markMessageAsRead`:将指定会话的单条未读消息置为已读。 + +## 实现方法 + +### 获取所有会话的未读消息数 + +你可以调用 `getUnreadMessageCount` 方法获取本地所有会话的未读消息数量,示例代码如下: + +```dart +int unreadCount = + await EMClient.getInstance.chatManager.getUnreadMessageCount(); +``` + +### 获取指定会话的未读消息数 + +你可以调用 `unreadCount` 方法获取本地指定会话的未读消息数,示例代码如下: + +```dart +int unreadCount = await conversation.unreadCount(); +``` + +### 将所有会话的未读消息数清零 + +你可以调用 `markAllConversationsAsRead` 方法将本地所有会话的未读消息数清零,示例代码如下: + +```dart +await EMClient.getInstance.chatManager.markAllConversationsAsRead(); +``` + +### 指定会话的未读消息数清零 + +你可以调用 `markAllMessagesAsRead` 方法对指定会话的未读消息数清零,示例代码如下: + +```dart +await conversation.markAllMessagesAsRead(); +``` + +### 将指定会话的单条未读消息置为已读 + +你可以调用 `markMessageAsRead` 方法将指定会话的单条未读消息置为已读。 + +```dart +await conversation.markMessageAsRead(message.msgId); +``` diff --git a/docs/document/flutter/message_manage.md b/docs/document/flutter/message_manage.md index 45dca995a..83ca21b5a 100644 --- a/docs/document/flutter/message_manage.md +++ b/docs/document/flutter/message_manage.md @@ -1,30 +1,19 @@ -# 管理本地会话和消息 +# 管理本地消息 -本文介绍环信即时通讯 IM Flutter SDK 如何管理本地会话和消息。 - -除了发送和接收消息外,环信即时通讯 IM Flutter SDK 还支持以会话为单位对本地的消息数据进行管理,如获取与管理未读消息、搜索和删除历史消息等。其中,会话是一个单聊、群聊或者聊天室所有消息的集合。用户需在会话中发送消息以及查看或清空历史消息。 - -本文介绍如何使用环信即时通讯 IM Flutter SDK 在 app 中实现这些功能。 +本文介绍环信即时通讯 IM Flutter SDK 如何管理本地消息,例如获取消息、搜索消息、导入消息、插入消息、更新消息以及统计消息流量等。 ## 技术原理 环信即时通讯 IM Flutter SDK 通过 `EMChatManager` 和 `EMConversation` 类实现对本地消息的管理,其中核心方法如下: -- `EMChatManager.loadAllConversations` 获取本地会话列表; -- `EMChatManager.getConversation` 读取指定会话的消息; -- `EMConversation.unreadCount` 获取指定会话的未读消息数; -- `EMChatManager.getUnreadMessageCount` 获取所有会话的未读消息数; -- `EMConversation.markMessageAsRead` 指定会话的未读消息置为已读; -- `EMConversation.markAllMessagesAsRead` 指定会话所有未读数清零; -- `EMChatManager.markAllConversationsAsRead` 将所有会话消息设为已读; -- `EMChatManager.deleteConversation` 删除本地存储的会话及其历史消息; -- `EMChatManager.loadMessage` 根据消息 ID 获取消息; -- `EMConversation.loadMessagesWithMsgType` 获取指定会话中特定类型的消息; -- `EMConversation.loadMessagesFromTime` 获取指定会话中一定时间段内的消息; -- `EMChatManager.searchMsgFromDB` 根据关键字搜索会话消息; -- `EMChatManager.importMessages`批量导入消息到数据库。 +- `EMChatManager.getConversation`:读取指定会话的消息。 +- `EMChatManager.loadMessage`:根据消息 ID 获取消息。 +- `EMConversation.loadMessagesWithMsgType`:获取指定会话中特定类型的消息。 +- `EMConversation.loadMessagesFromTime`:获取指定会话中一定时间段内的消息。 +- `EMChatManager.searchMsgFromDB`:根据关键字搜索会话消息。 +- `EMChatManager.importMessages`:批量导入消息到数据库。 ## 前提条件 @@ -35,19 +24,6 @@ ## 实现方法 -### 获取本地所有会话 - -你可以获取本地所有会话: - -```dart -try { - List lists = - await EMClient.getInstance.chatManager.loadAllConversations(); - // 成功加载会话。 -} on EMError catch (e) { -} -``` - ### 读取指定会话的消息 你可以根据会话 ID 和会话类型调用 API 获取本地会话: @@ -69,83 +45,6 @@ EMConversation? conversation = List? list = await conversation?.loadMessages(); ``` -### 获取指定会话的未读消息数 - -你可以调用接口获取指定会话的未读消息数,示例代码如下: - -```dart -int unreadCount = await conversation.unreadCount(); -``` - -### 获取所有会话的未读消息数 - -你可以通过接口获取所有会话的未读消息数量,示例代码如下: - -```dart -// 获取所有未读消息数 -int unreadCount = - await EMClient.getInstance.chatManager.getUnreadMessageCount(); -``` - -### 指定会话的未读消息数清零 - -你可以调用接口对会话中的特定消息设置为已读,示例代码如下: - -```dart -await conversation.markMessageAsRead(message.msgId); -``` - -标记指定会话的所有消息已读: - -```dart -await conversation.markAllMessagesAsRead(); -``` - -将所有消息设为已读: - -```dart -await EMClient.getInstance.chatManager.markAllConversationsAsRead(); -``` - -### 删除会话及其历史消息 - -SDK 提供两个接口,分别可以删除本地会话和历史消息或者删除当前用户在服务器端的会话和历史消息。 - -- 删除本地会话和历史消息示例代码如下: - -```dart -// 会话 ID。 -String conversationId = "conversationId"; -// 删除会话时是否同时删除本地的历史消息。 -bool deleteMessage = true; -await EMClient.getInstance.chatManager - .deleteConversation(conversationId, deleteMessage); -``` - -```dart -// 删除本地指定会话中的指定消息。 -EMConversation? conversation = - await EMClient.getInstance.chatManager.getConversation( - conversationId, -); -conversation?.deleteMessage(messageId); -``` - -- 删除服务器端会话和历史消息,示例代码如下: - -```dart -// 会话 ID。 -String conversationId = "conversationId"; -// 删除会话时是否同时删除服务端的历史消息。 -bool deleteMessage = true; -EMConversationType conversationType = EMConversationType.Chat; -await EMClient.getInstance.chatManager.deleteRemoteConversation( - conversationId, - conversationType: conversationType, - isDeleteMessage: deleteMessage, -); -``` - ### 根据消息 ID 搜索消息 你可以调用 `loadMessage` 方法根据消息 ID 获取本地存储的指定消息。如果消息不存在会返回空值。 diff --git a/docs/document/flutter/message_retrieve.md b/docs/document/flutter/message_retrieve.md index 9378788af..227fef282 100644 --- a/docs/document/flutter/message_retrieve.md +++ b/docs/document/flutter/message_retrieve.md @@ -1,23 +1,15 @@ -# 管理服务端的会话和消息 +# 管理服务端消息 -环信即时通讯 IM 提供消息漫游功能,即将用户的所有会话的历史消息保存在消息服务器,用户在任何一个终端设备上都能获取到历史信息,使用户在多个设备切换使用的情况下也能保持一致的会话场景。本文介绍用户如何从消息服务器获取会话和消息。 - -:::tip -本文介绍的功能均为增值服务,需在[环信即时通讯 IM 管理后台](https://console.easemob.com/user/login)开通。 -::: +环信即时通讯 IM 提供消息漫游功能,即将用户的所有会话的历史消息保存在消息服务器,用户在任何一个终端设备上都能获取到历史信息,使用户在多个设备切换使用的情况下也能保持一致的会话场景。本文介绍用户如何从消息服务器获取和删除消息。 ## 技术原理 使用环信即时通讯 IM Flutter SDK 可以通过 `EMChatManager` 类的以下方法从服务器获取历史消息: -- `fetchConversation` 分页获取服务器保存的会话列表; -- `fetchPinnedConversations` 分页获取服务器保存的置顶会话列表; -- `pinConversation` 置顶会话。 -- `fetchHistoryMessages` 获取服务器保存的指定会话中的消息。 -- `deleteRemoteMessagesBefore`/`deleteRemoteMessagesWithIds` 根据消息时间或消息 ID 单向删除服务端的历史消息; -- `deleteRemoteConversation` 删除服务端的会话及其历史消息。 +- `EMChatManager#fetchHistoryMessages`:获取服务器保存的指定会话中的消息。 +- `EMChatManager#deleteRemoteMessagesBefore`/`EMChatManager#deleteRemoteMessagesWithIds`:根据消息时间或消息 ID 单向删除服务端的历史消息; ## 前提条件 @@ -28,95 +20,6 @@ ## 实现方法 -### 从服务器分页获取会话列表 - -对于单聊或群聊,用户发消息时会自动将对方添加到用户的会话列表。 - -你可以调用 `fetchConversation` 方法从服务端分页获取会话列表。SDK 按照会话活跃时间(会话的最新一条消息的时间戳)的倒序返回会话列表,每个会话对象中包含会话 ID、会话类型、是否为置顶状态、置顶时间(对于未置顶的会话,值为 `0`)以及最新一条消息。从服务端拉取会话列表后会更新本地会话列表。 - -服务器默认存储 100 条会话,可存储 7 天。若提升这两个上限,需联系环信商务。 - -:::tip -1. 若使用该功能,需将 SDK 升级至 4.0.0。 -2. 建议在 app 安装时或本地没有会话时调用该方法,否则调用 `loadAllConversations` 获取本地会话即可。 -3. 通过 RESTful 接口发送的消息默认不创建或写入会话。若会话中的最新一条消息通过 RESTful 接口发送,获取会话列表时,该会话中的最新一条消息显示为通过非 RESTful 接口发送的最新消息。若要开通 RESTful 接口发送的消息写入会话列表的功能,需联系商务。 -::: - -示例代码如下: - -```dart -// pageSize: 每页返回的会话数。取值范围为 [1,50]。 -// cursor: 开始获取数据的游标位置。若获取数据时传空字符串(""),SDK 从最新活跃的会话开始获取。 -try { - int pageSize = 10; - String cursor = ""; - EMCursorResult result = - await EMClient.getInstance.chatManager.fetchConversation( - pageSize: pageSize, - cursor: cursor, - ); - // 获取到的会话列表 - List conversations = result.data; - // 下一次请求的 cursor - String? nextCursor = result.cursor; -} on EMError catch (e) {} -``` - -## 获取服务端的置顶会话列表 - -你可以调用 `fetchPinnedConversations` 方法从服务端分页获取置顶会话列表。SDK 按照会话置顶时间的倒序返回。 - -你最多可以拉取 50 个置顶会话。 - -:::notice -若使用该功能,需将 SDK 升级至 4.0.3。 -::: - -示例代码如下: - -```dart -// pageSize: 每页返回的会话数。取值范围为 [1,50]。 -// cursor: 开始获取数据的游标位置。若获取数据时传 `null` 或者空字符串(""),SDK 从最新置顶的会话开始查询。 -try { - int pageSize = 10; - String cursor = ""; - EMCursorResult result = - await EMClient.getInstance.chatManager.fetchPinnedConversations( - pageSize: pageSize, - cursor: cursor, - ); - // 获取到的会话列表 - List conversations = result.data; - // 下一次请求的 cursor - String? nextCursor = result.cursor; -} on EMError catch (e) {} -``` - -### 置顶会话 - -会话置顶指将单聊或群聊会话固定在会话列表的顶部,方便用户查找。例如,将重点会话置顶,可快速定位会话。 - -置顶状态会存储在服务器上,多设备登录情况下,更新置顶状态会同步到其他登录设备。你最多可以置顶 50 个会话。 - -你可以调用 `pinConversation` 方法设置是否置顶会话。多设备登录情况下,会话置顶或取消置顶后,其他登录设备分别会收到 `EMMultiDevicesEvent.CONVERSATION_PINNED` 和 `EMMultiDevicesEvent.CONVERSATION_UNPINNED` 事件。 - -:::notice -若使用该功能,需将 SDK 升级至 4.0.3。 -::: - -示例代码如下: - -```dart -try { - await EMClient.getInstance.chatManager.pinConversation( - conversationId: conversationId, - isPinned: true, - ); -} on EMError catch (e) {} -``` - -你可以通过 `EMConversation` 对象的 `isPinned` 字段检查会话是否为置顶状态,或者调用 `getPinnedTime` 方法获取会话置顶时间。 - ### 分页获取指定会话的历史消息 你可以调用 `fetchHistoryMessages` 方法从服务器获取指定会话的消息(消息漫游)。 @@ -173,16 +76,4 @@ try { msgIds: msgIds, ); } on EMError catch (e) {} -``` - -### 单向删除服务端会话及其历史消息 - -你可以调用 `deleteRemoteConversation` 方法删除服务器端会话和历史消息。会话和消息删除后,当前用户无法从服务器获取该会话和消息,对本地的会话无影响,但会删除本地消息,而其他用户不受影响。 - -```dart -try { - await EMClient.getInstance.chatManager.deleteRemoteConversation( - conversationId, - ); -} on EMError catch (e) {} ``` \ No newline at end of file diff --git a/docs/document/ios/conversation_delete.md b/docs/document/ios/conversation_delete.md new file mode 100644 index 000000000..87ec6b340 --- /dev/null +++ b/docs/document/ios/conversation_delete.md @@ -0,0 +1,50 @@ +# 删除会话 + + + +删除好友或退出群组后,SDK 不会自动删除对应的单聊或群聊会话。你可以调用相应的接口从服务器和本地删除单个会话及其历史消息。 + +## 前提条件 + +开始前,请确保满足以下条件: + +- 完成 SDK 初始化,并连接到服务器,详见 [快速开始](quickstart.html)。 +- 了解环信即时通讯 IM API 的使用限制,详见 [使用限制](/product/limitation.html)。 + +## 技术原理 + +环信即时通讯 IM 支持从服务器和本地删除单个会话及其历史消息,主要方法如下: + +- `deleteConversationFromServer`:单向删除服务端的单个会话及其历史消息。 +- `IEMChatManager.deleteConversations`:删除本地单个会话及其历史消息。 + +### 单向删除服务端会话及其历史消息 + +你可以调用 `deleteServerConversation` 方法删除服务器端会话和历史消息。会话和消息删除后,当前用户无法从服务器获取该会话和消息,对本地的会话无影响,但会删除本地消息,而其他用户不受影响。 + +```objectivec +// 删除指定会话,如果需要保留历史消息,`isDeleteServerMessages` 参数传 `NO`,异步方法。 +[[EMClient sharedClient].chatManager deleteServerConversation:@"conversationId1" conversationType:EMConversationTypeChat isDeleteServerMessages:YES completion:^(NSString *aConversationId, EMError *aError) { + // 删除回调 +}]; +``` + +### 删除本地会话及历史消息 + +你可以删除本地会话和历史消息,示例代码如下: + +```objectivec +// 删除指定会话,如果需要保留历史消息,`isDeleteMessages` 参数传 `NO`,异步方法。 +[[EMClient sharedClient].chatManager deleteConversation:conversationId isDeleteMessages:YES completion:nil]; +// 删除一组会话。 +NSArray *conversations = @{@"conversationID1",@"conversationID2"}; +[[EMClient sharedClient].chatManager deleteConversations:conversations isDeleteMessages:YES completion:nil]; +``` + +```objectivec +// 删除当前会话中指定的一条历史消息。 +EMConversation *conversation = [[EMClient sharedClient].chatManager getConversation:conversationId type:type createIfNotExist:YES]; +[conversation deleteMessageWithId:.messageId error:nil]; +``` + + diff --git a/docs/document/ios/conversation_list.md b/docs/document/ios/conversation_list.md new file mode 100644 index 000000000..efb9b08db --- /dev/null +++ b/docs/document/ios/conversation_list.md @@ -0,0 +1,65 @@ +# 会话列表 + + + +对于单聊、群组聊天和聊天室会话,用户发消息时 SDK 会自动创建会话并将会话添加至用户的会话列表。 + +环信服务器和本地均存储会话,你可以获取会话列表。**服务器默认存储 100 条会话,可存储 7 天。若提升这两个上限,需联系环信商务。** + +## 前提条件 + +开始前,请确保满足以下条件: + +- 完成 SDK 初始化,并连接到服务器,详见 [快速开始](quickstart.html)。 +- 了解环信即时通讯 IM API 的使用限制,详见 [使用限制](/product/limitation.html)。 + +## 技术原理 + +环信即时通讯 IM 支持从服务器和本地获取会话列表,主要方法如下: + +- `IEMChatManager#getConversationsFromServerWithCursor:pageSize:completion`:从服务器获取会话列表。 +- `IEMChatManager#getAllConversations:`:获取本地所有会话。 + +## 实现方法 + +### 从服务器分页获取会话列表 + +你可以调用 `IEMChatManager#getConversationsFromServerWithCursor:pageSize:completion` 方法从服务端分页获取会话列表,包含单聊和群组聊天会话,不包含聊天室会话。SDK 按照会话活跃时间(会话的最新一条消息的时间戳)的倒序返回会话列表,每个会话对象中包含会话 ID、会话类型、是否为置顶状态、置顶时间(对于未置顶的会话,值为 `0`)以及最新一条消息。从服务端拉取会话列表后会更新本地会话列表。 + +若在初始化时,将 `EMOptions#loadEmptyConversations` 设置为 `YES` 允许返回空会话,则会话列表中会包含空会话,否则不包含。 + +:::tip +1. **若使用该功能,需在环信控制台开通该功能,并将 SDK 升级至 4.0.3。只有开通该功能,你才能使用置顶会话和会话标记功能。** +2. 建议你在首次下载、卸载后重装应用等本地数据库无数据情况下拉取服务端会话列表。其他情况下,调用 `getAllConversations:` 或 `getAllConversations` 方法获取本地所有会话即可。 +3. 通过 RESTful 接口发送的消息默认不创建或写入会话。若会话中的最新一条消息通过 RESTful 接口发送,获取会话列表时,该会话中的最新一条消息显示为通过非 RESTful 接口发送的最新消息。若要开通 RESTful 接口发送的消息写入会话列表的功能,需联系商务。 +::: + +示例代码如下: + +```objectivec +// pageSize: 每页返回的会话数。取值范围为 [1,50]。 +// cursor:查询的开始位置。若传入 `nil` 或 `@""`,SDK 从最新活跃的会话开始获取。 +NSString *cursor = @""; +[EMClient.sharedClient.chatManager getConversationsFromServerWithCursor:cursor pageSize:20 completion:^(EMCursorResult * _Nullable result, EMError * _Nullable error) { +}]; +``` + +### 获取本地所有会话 + +你可以调用 `getAllConversations:` 方法一次性获取本地所有会话。SDK 从内存中获取会话,若未从本地数据库中加载过,会先从数据库加载到内存中。获取会话后,SDK 按照会话活跃时间(最新一条消息的时间戳)的倒序返回会话,置顶会话在前,非置顶会话在后,会话列表为 `List` 结构。 + +本地会话列表包含单聊和群组聊天会话,至于是否包含聊天室会话,取决于在 SDK 初始化时 `EMOptions#isDeleteMessagesWhenExitChatRoom` 参数的设置。若设置为 `true`,即离开聊天室时删除该聊天室的所有本地消息,则本地会话列表中不包含聊天室会话。若设置为 `false`,即保留该聊天室的所有本地消息,则本地会话列表中包含聊天室会话。 + +若在初始化时,将 `EMOptions#loadEmptyConversations` 设置为 `YES` 允许返回空会话,则会话列表中会包含空会话,否则不包含。 + +:::tip +若使用该功能,需将 SDK 升级至 4.0.3。 +::: + +示例代码如下: + +```objectivec +NSArray *conversations = [EMClient.sharedClient.chatManager getAllConversations:YES]; +``` + +你也可以调用 `getAllConversations` 方法返回 `NSArray ` 结构的会话。 \ No newline at end of file diff --git a/docs/document/ios/conversation_overview.md b/docs/document/ios/conversation_overview.md new file mode 100644 index 000000000..8444a1af4 --- /dev/null +++ b/docs/document/ios/conversation_overview.md @@ -0,0 +1,65 @@ +# 会话介绍 + + + +会话是一个单聊、群聊或者聊天室所有消息的集合。用户需在会话中发送消息、查看或清空历史消息等操作。 + +环信即时通讯 IM SDK 提供 `IEMChatManager` 和 `EMConversation` 类以会话为单位对消息数据进行管理,如获取会话列表、置顶会话、添加会话标记、删除会话和管理未读消息等。 + +## 会话类 + +环信即时通讯 IM 提供会话类 `EMConversation`。该类定义了以下内容: + +| 类/方法 | 描述 | +| :--------- | :------- | +| EMConversationType | 会话类型枚举。
- `Chat`:单聊会话;
- `GroupChat`:群聊会话;
- `ChatRoom`:聊天室会话。
- `HelpDesk`:客服会话。 | +| EMMarkType | 会话标记枚举类型:EMMarkType0、EMMarkType1、EMMarkType2、EMMarkType3、EMMarkType4、EMMarkType5、EMMarkType6、EMMarkType7、EMMarkType8、EMMarkType9、EMMarkType10、EMMarkType11、EMMarkType12、EMMarkType13、EMMarkType14、EMMarkType15、EMMarkType16、EMMarkType16、EMMarkType17、EMMarkType18 和 EMMarkType19。 | +| EMMessageSearchDirection | 消息搜索方向枚举。
- EMMessageSearchDirectionUp:按照消息中的 Unix 时间戳的逆序搜索。
- EMMessageSearchDirectionDown:按照消息中的时间戳的正序搜索。 | +| EMConversation | 聊天会话类。 | +| conversationId | 会话 ID,取决于会话类型。
- 单聊:会话 ID 为对方的用户 ID;
- 群聊:会话 ID 为群组 ID;
- 聊天室:会话 ID 为聊天室的 ID。 | +| type | 会话类型。 | +| messagesCount | 会话中的消息数量。 | +| ext | 会话扩展属性。 | +| isChatThread | 是否为 thread 会话。 | +| isPinned | 是否为置顶会话。 | +| pinnedTime | 会话置顶的 UNIX 时间戳,单位为毫秒。未置顶时值为 `0`。 | +| marks | 会话标记。 | +| lastReceivedMessage | 收到的对方发送的最后一条消息。 | +| insertMessage | 插入一条消息在 SDK 本地数据库。消息的会话 ID 应与会话的 ID 保持一致。消息会根据消息里的时间戳被插入 SDK 本地数据库,SDK 会更新会话的 `latestMessage` 等属性。 | +| appendMessage | 插入一条消息到 SDK 本地数据库会话尾部。消息的会话 ID 应该和目标会话的 ID 一致。消息会被插入 SDK 本地数据库,并且更新会话的 `latestMessage` 等属性。 | +| deleteMessageWithId | 从 SDK 本地数据库删除一条消息。 | +| deleteAllMessages | 清除内存和数据库中指定会话中的消息。 | +| removeMessagesFromServerMessageIds | 从会话中删除消息(包括本地存储和服务器存储)。 | +| removeMessagesFromServerWithTimeStamp | 从会话中删除消息(包括本地存储和服务器存储)。 | +| updateMessageChange | 更新 SDK 本地数据库的消息。 | +| markMessageAsReadWithId | 将 SDK 本地数据库中的指定消息设置为已读。 | +| markAllMessagesAsRead | 将 SDK 本地数据库所有未读消息设置为已读。 | +| loadMessageWithId | 从 SDK 本地数据库获取指定 ID 的消息。 | +| loadMessagesStartFromId | 从 SDK 本地数据库获取指定数量的消息。 | +| loadMessagesWithType | 从本地数据库中获取会话中指定用户发送的一定数量的特定类型的消息。 | +| loadMessagesWithKeyword | 从本地数据库获取会话中的指定用户发送的包含特定关键词的消息。 | +| loadCustomMsgWithKeyword | 从本地数据库获取会话中的指定用户发送的包含特定关键词的自定义消息。 | +| loadMessagesFrom | 从本地数据库中搜索指定时间段内发送或接收的一定数量的消息。 | +| removeMessagesStart | 从本地数据库中删除指定时间段内的消息。 | + +## 会话事件 + +`EMChatManagerDelegate` 中提供会话事件的监听接口。开发者可以通过设置此监听,获取会话事件,并做出相应处理。如果不再使用该监听,需要移除,防止出现内存泄漏。 + +示例代码如下: + +```Objective-C +// 收到会话已读的事件。该事件在以下场景中触发: +// 1. 当消息接收方调用 `ackConversationRead()` 方法,SDK 会执行此回调,会将本地数据库中该会话中消息的 `isAcked` 属性置为 `true`。 +// 2. 多端多设备登录时,若一端发送会话已读回执(conversation ack),服务器端会将会话的未读消息数置为 0,同时其他端会回调此方法,并将本地数据库中该会话中消息的 `isRead` 属性置为 `true`。 +- (void)onConversationRead:(NSString *)from to:(NSString *)to +{ + +} +``` + + + + + + diff --git a/docs/document/ios/conversation_pin.md b/docs/document/ios/conversation_pin.md new file mode 100644 index 000000000..012738bcd --- /dev/null +++ b/docs/document/ios/conversation_pin.md @@ -0,0 +1,61 @@ +# 会话置顶 + + + +会话置顶指将单聊或群聊会话固定在会话列表的顶部,方便用户查找。例如,将重点会话置顶,可快速定位会话。 + +## 前提条件 + +开始前,请确保满足以下条件: + +- 完成 SDK 初始化,并连接到服务器,详见 [快速开始](quickstart.html)。 +- 了解环信即时通讯 IM API 的使用限制,详见 [使用限制](/product/limitation.html)。 +- **[开通服务端会话列表功能](conversation_list#从服务器分页获取会话列表)**。 + +## 技术原理 + +环信即时通讯 IM 支持会话置顶,主要方法如下: + +- `pinConversation:isPinned:completionBlock:`:置顶会话。 +- `getPinnedConversationsFromServerWithCursor:limit:completion:`:获取服务端置顶会话列表。 + +## 实现方法 + +### 置顶会话 + +你可以调用 `pinConversation:isPinned:completionBlock:` 方法设置是否置顶会话。置顶状态会存储在服务器上,多设备登录情况下,更新的置顶状态会同步到其他登录设备,其他设备分别会收到 `EMMultiDevicesEventConversationPinned` 和 `EMMultiDevicesEventConversationUnpinned` 事件。 + +你最多可以置顶 50 个会话。 + +:::notice +若使用该功能,需将 SDK 升级至 4.0.3。 +::: + +示例代码如下: + +```objectivec +[EMClient.sharedClient.chatManager pinConversation:self.conversation.conversationId isPinned:aSwitch.isOn completionBlock:^(EMError * _Nullable error) { +}]; +``` + +你可以通过 `EMConversation` 对象的 `isPinned` 字段检查会话是否为置顶状态,或者调用 `pinnedTime` 方法获取会话置顶时间。 + +### 获取服务端的置顶会话列表 + +你可以调用 `getPinnedConversationsFromServerWithCursor:limit:completion:` 方法从服务端分页获取置顶会话列表。SDK 按照会话置顶时间的倒序返回。 + +你最多可以拉取 50 个置顶会话。 + +:::notice +若使用该功能,需将 SDK 升级至 4.0.3。 +::: + +示例代码如下: + +```objectivec +// pageSize: 每页返回的会话数。取值范围为 [1,50]。 +// cursor:查询的开始位置。若传入 `nil` 或 `@""`,SDK 从最新置顶的会话开始查询。 +NSString *cursor = @""; +[EMClient.sharedClient.chatManager getPinnedConversationsFromServerWithCursor:cursor pageSize:20 completion:^(EMCursorResult * _Nullable result, EMError * _Nullable error) { +}]; +``` \ No newline at end of file diff --git a/docs/document/ios/conversation_unread.md b/docs/document/ios/conversation_unread.md new file mode 100644 index 000000000..103f0613c --- /dev/null +++ b/docs/document/ios/conversation_unread.md @@ -0,0 +1,64 @@ +## 会话未读数 + + + +你可以查看本地所有会话或指定会话的未读消息数,并针对会话的未读消息数清零。 + +## 前提条件 + +开始前,请确保满足以下条件: + +- 完成 SDK 初始化并连接到服务器,详见 [快速开始](quickstart.html)。 +- 了解环信即时通讯 IM API 的使用限制,详见 [使用限制](/product/limitation.html)。 + +## 技术原理 + +环信即时通讯 IM iOS SDK 通过 `IEMChatManager` 和 `EMConversation` 类实现对本地会话的未读消息数的管理,其中核心方法如下: + +- `IEMChatManager#getAllConversations`:获取本地所有会话的未读消息数。 +- `EMConversation#unreadMessagesCount`:获取本地指定会话的未读消息数。 +- `EMConversation#markAllMessagesAsRead`:对于本地指定会话的未读消息数清零。 +- `EMConversation#markMessageAsReadWithId`:将指定会话的单条未读消息置为已读。 + +## 实现方法 + +### 获取所有会话的未读消息数 + +你可以调用 `getAllConversations` 方法获取本地所有会话的未读消息数量,示例代码如下: + +```objectivec +NSArray *conversations = [[EMClient sharedClient].chatManager getAllConversations]; +NSInteger unreadCount = 0; +for (EMConversation *conversation in conversations) { + unreadCount += conversation.unreadMessagesCount; +} +``` + +### 获取指定会话的未读消息数 + +你可以调用 `unreadMessagesCount` 方法获取本地指定会话的未读消息数,示例代码如下: + +```objectivec +// 获取指定会话 ID 的会话。 +EMConversation *conversation = [[EMClient sharedClient].chatManager getConversation:conversationId type:type createIfNotExist:YES]; +// 获取未读消息数。 +NSInteger unreadCount = conversation.unreadMessagesCount; +``` + +### 指定会话的未读消息数清零 + +你可以调用 `markAllMessagesAsRead` 方法对指定会话的未读消息数清零,示例代码如下: + +```objectivec +EMConversation *conversation = [[EMClient sharedClient].chatManager getConversation:conversationId type:type createIfNotExist:YES]; +[conversation markAllMessagesAsRead:nil]; +``` + +### 将指定会话的单条未读消息置为已读 + +你可以调用 `markMessageAsReadWithId` 方法将指定会话的单条未读消息置为已读。 + +```objectivec +EMConversation *conversation = [[EMClient sharedClient].chatManager getConversation:conversationId type:type createIfNotExist:YES]; +[conversation markMessageAsReadWithId:messageId error:nil]; +``` diff --git a/docs/document/ios/message_manage.md b/docs/document/ios/message_manage.md index 36c0022ed..04b0bbbcd 100644 --- a/docs/document/ios/message_manage.md +++ b/docs/document/ios/message_manage.md @@ -1,21 +1,14 @@ -# 管理本地会话和消息 +# 管理本地消息 -本文介绍环信即时通讯 IM iOS SDK 如何管理本地会话和消息。SDK 内部使用 SQLite 保存本地消息,方便消息处理。 - -除了发送和接收消息外,环信即时通讯 IM SDK 还支持以会话为单位对本地的消息数据进行管理,如获取与管理未读消息、删除聊天记录、搜索历史消息以及统计消息流量等。其中,会话是一个单聊、群聊或者聊天室所有消息的集合。用户需在会话中发送消息或查看历史消息,还可进行清空聊天记录等操作。 - +本文介绍环信即时通讯 IM iOS SDK 如何管理本地消息,例如获取消息、搜索消息、导入消息、插入消息、更新消息以及统计消息流量等。 + ## 技术原理 环信即时通讯 IM iOS SDK 支持管理用户设备上存储的消息会话数据,其中包含如下主要方法: -- `IEMChatManager.getAllConversations:` 获取本地所有会话; - `EMConversation.loadMessagesStartFromId` 从数据库中读取指定会话的消息; -- `EMConversation.unreadMessagesCount` 获取指定会话的未读消息数; -- `EMConversation.unreadMessagesCount` 获取所有会话的未读消息数; -- `EMConversation.markMessageAsReadWithId` 指定会话的未读消息数清零; -- `IEMChatManager.deleteConversations` 删除本地会话及历史消息; - `IEMChatManager.getMessageWithMessageId` 根据消息 ID 搜索消息; - `EMConversation.loadMessagesWithType` 获取指定会话中特定类型的消息; - `EMConversation.loadMessagesFrom:to:count:completion:` 获取指定会话中一定时间段内的消息; @@ -36,24 +29,6 @@ ## 实现方法 -### 获取本地所有会话 - -你可以调用 `getAllConversations:` 方法一次性获取本地所有会话。若在初始化时,将 `EMOptions#loadEmptyConversations` 设置为 `YES` 允许返回空会话,则会话列表中会包含空会话,否则不包含。 - -SDK 从内存中获取会话,若未从本地数据库中加载过,会先从数据库加载到内存中。获取会话后,SDK 按照会话活跃时间(最新一条消息的时间戳)的倒序返回会话,置顶会话在前,非置顶会话在后,会话列表为 `List` 结构。 - -:::notice -若使用该功能,需将 SDK 升级至 4.0.3。 -::: - -示例代码如下: - -```objectivec -NSArray *conversations = [EMClient.sharedClient.chatManager getAllConversations:YES]; -``` - -你也可以调用 `getAllConversations` 方法返回 `NSArray ` 结构的会话。 - ### 从数据库中读取指定会话的消息 可以从数据库中读取指定会话的消息: @@ -66,61 +41,6 @@ EMConversation *conversation = [[EMClient sharedClient].chatManager getConversat NSArray *messages = [conversation loadMessagesStartFromId:startMsgId count:count searchDirection:MessageSearchDirectionUp]; ``` -### 获取指定会话的未读消息数 - -你可以调用接口获取特定会话的未读消息数,示例代码如下: - -```objectivec -// 获取指定会话 ID 的会话。 -EMConversation *conversation = [[EMClient sharedClient].chatManager getConversation:conversationId type:type createIfNotExist:YES]; -// 获取未读消息数。 -NSInteger unreadCount = conversation.unreadMessagesCount; -``` - -### 获取所有会话的未读消息数 - -示例代码如下: - -```objectivec -NSArray *conversations = [[EMClient sharedClient].chatManager getAllConversations]; -NSInteger unreadCount = 0; -for (EMConversation *conversation in conversations) { - unreadCount += conversation.unreadMessagesCount; -} -``` - -### 指定会话的未读消息数清零 - -你可以调用接口将指定会话的未读消息数清零,示例代码如下: - -```objectivec -EMConversation *conversation = [[EMClient sharedClient].chatManager getConversation:conversationId type:type createIfNotExist:YES]; -// 将指定会话的消息未读数清零。 -[conversation markAllMessagesAsRead:nil]; -// 将一条消息置为已读。 -[conversation markMessageAsReadWithId:messageId error:nil]; -``` - -### 删除会话及历史消息 - -你可以删除本地会话和历史消息,示例代码如下: - -```objectivec -// 删除指定会话,如果需要保留历史消息,`isDeleteMessages` 参数传 `NO`,异步方法。 -[[EMClient sharedClient].chatManager deleteConversation:conversationId isDeleteMessages:YES completion:nil]; -// 删除一组会话。 -NSArray *conversations = @{@"conversationID1",@"conversationID2"}; -[[EMClient sharedClient].chatManager deleteConversations:conversations isDeleteMessages:YES completion:nil]; -``` - -```objectivec -// 删除当前会话中指定的一条历史消息。 -EMConversation *conversation = [[EMClient sharedClient].chatManager getConversation:conversationId type:type createIfNotExist:YES]; -[conversation deleteMessageWithId:.messageId error:nil]; -``` - -删除服务端的会话及其历史消息,详见 [删除服务端会话及其历史消息](conversation_delete.html#单向删除服务端会话及其历史消息)。 - ### 根据消息 ID 搜索消息 你可以调用 `getMessageWithMessageId` 方法根据消息 ID 获取本地存储的指定消息。如果消息不存在会返回空值。 diff --git a/docs/document/ios/message_retrieve.md b/docs/document/ios/message_retrieve.md index d69414241..c26d0e491 100644 --- a/docs/document/ios/message_retrieve.md +++ b/docs/document/ios/message_retrieve.md @@ -1,23 +1,15 @@ -# 管理服务端的消息 +# 管理服务端消息 环信即时通讯 IM 提供消息漫游功能,即将用户的所有会话的历史消息保存在消息服务器,用户在任何一个终端设备上都能获取到历史信息,使用户在多个设备切换使用的情况下也能保持一致的会话场景。本文介绍用户如何获取和删除服务端的会话和消息。 -:::tip -本文介绍的功能均为增值服务,需在[环信即时通讯 IM 管理后台](https://console.easemob.com/user/login)开通。 -::: - ## 技术原理 使用环信即时通讯 IM iOS SDK 可以管理服务端的会话和历史消息。 -- `getConversationsFromServerWithCursor:pageSize:completion` 分页获取服务器上保存的会话列表; -- `getPinnedConversationsFromServerWithCursor:limit:completion:` 获取服务端的置顶会话列表; -- `pinConversation:isPinned:completionBlock:` 置顶会话; -- `asyncFetchHistoryMessagesFromServer` 获取服务器保存的指定会话中的消息; -- `removeMessagesFromServerWithTimeStamp`/`removeMessagesFromServerMessageIds` 按消息时间或消息 ID 单向删除服务端的历史消息; -- `deleteServerConversation` 删除服务器端会话及其历史消息。 +- `asyncFetchHistoryMessagesFromServer`:获取服务器保存的指定会话中的消息; +- `removeMessagesFromServerWithTimeStamp`/`removeMessagesFromServerMessageIds`:按消息时间或消息 ID 单向删除服务端的历史消息; ## 前提条件 @@ -28,72 +20,6 @@ ## 实现方法 -### 从服务器分页获取会话列表 - -你可以调用 `getConversationsFromServerWithCursor:pageSize:completion` 方法从服务端分页获取会话列表。若在初始化时,将 `EMOptions#loadEmptyConversations` 设置为 `YES` 允许返回空会话,则会话列表中会包含空会话,否则不包含。 - -SDK 按照会话活跃时间(会话的最新一条消息的时间戳)的倒序返回会话列表,每个会话对象中包含会话 ID、会话类型、是否为置顶状态、置顶时间(对于未置顶的会话,值为 `0`)以及最新一条消息。从服务端拉取会话列表后会更新本地会话列表。 - -服务器默认存储 100 条会话,可存储 7 天。若提升这两个上限,需联系环信商务。 - -:::notice -1. 若使用该功能,需将 SDK 升级至 4.0.3。 -2. 建议你在首次下载、卸载后重装应用等本地数据库无数据情况下拉取服务端会话列表。其他情况下,调用 `getAllConversations:` 或 `getAllConversations` 方法获取本地所有会话即可。 -3. 通过 RESTful 接口发送的消息默认不创建或写入会话。若会话中的最新一条消息通过 RESTful 接口发送,获取会话列表时,该会话中的最新一条消息显示为通过非 RESTful 接口发送的最新消息。若要开通 RESTful 接口发送的消息写入会话列表的功能,需联系商务。 -::: - -示例代码如下: - -```objectivec -// pageSize: 每页返回的会话数。取值范围为 [1,50]。 -// cursor:查询的开始位置。若传入 `nil` 或 `@""`,SDK 从最新活跃的会话开始获取。 -NSString *cursor = @""; -[EMClient.sharedClient.chatManager getConversationsFromServerWithCursor:cursor pageSize:20 completion:^(EMCursorResult * _Nullable result, EMError * _Nullable error) { -}]; -``` - -### 获取服务端的置顶会话列表 - -你可以调用 `getPinnedConversationsFromServerWithCursor:limit:completion:` 方法从服务端分页获取置顶会话列表。SDK 按照会话置顶时间的倒序返回。 - -你最多可以拉取 50 个置顶会话。 - -:::notice -若使用该功能,需将 SDK 升级至 4.0.3。 -::: - -示例代码如下: - -```objectivec -// pageSize: 每页返回的会话数。取值范围为 [1,50]。 -// cursor:查询的开始位置。若传入 `nil` 或 `@""`,SDK 从最新置顶的会话开始查询。 -NSString *cursor = @""; -[EMClient.sharedClient.chatManager getPinnedConversationsFromServerWithCursor:cursor pageSize:20 completion:^(EMCursorResult * _Nullable result, EMError * _Nullable error) { -}]; -``` - -### 置顶会话 - -会话置顶指将单聊或群聊会话固定在会话列表的顶部,方便用户查找。例如,将重点会话置顶,可快速定位会话。 - -置顶状态会存储在服务器上,多设备登录情况下,更新置顶状态会同步到其他登录设备。你最多可以置顶 50 个会话。 - -你可以调用 `pinConversation:isPinned:completionBlock:` 方法设置是否置顶会话。多设备登录情况下,会话置顶或取消置顶后,其他登录设备分别会收到 `EMMultiDevicesEventConversationPinned` 和 `EMMultiDevicesEventConversationUnpinned` 事件。 - -:::notice -若使用该功能,需将 SDK 升级至 4.0.3。 -::: - -示例代码如下: - -```objectivec -[EMClient.sharedClient.chatManager pinConversation:self.conversation.conversationId isPinned:aSwitch.isOn completionBlock:^(EMError * _Nullable error) { -}]; -``` - -你可以通过 `EMConversation` 对象的 `isPinned` 字段检查会话是否为置顶状态,或者调用 `pinnedTime` 方法获取会话置顶时间。 - - ### 分页获取指定会话的历史消息 你可以调用 `asyncFetchHistoryMessagesFromServer` 方法从服务器获取指定会话的消息(消息漫游)。你可以指定消息查询方向,即明确按时间顺序或逆序获取。为确保数据可靠,我们建议你每次最多获取 50 条消息,可多次获取。拉取后,SDK 会自动将消息更新到本地数据库。 @@ -132,13 +58,3 @@ NSString *cursor = @""; }]; ``` -### 单向删除服务端会话及其历史消息 - -你可以调用 `deleteServerConversation` 方法删除服务器端会话和历史消息。会话和消息删除后,当前用户无法从服务器获取该会话和消息,对本地的会话无影响,但会删除本地消息,而其他用户不受影响。 - -```objectivec -// 删除指定会话,如果需要保留历史消息,`isDeleteServerMessages` 参数传 `NO`,异步方法。 -[[EMClient sharedClient].chatManager deleteServerConversation:@"conversationId1" conversationType:EMConversationTypeChat isDeleteServerMessages:YES completion:^(NSString *aConversationId, EMError *aError) { - // 删除回调 -}]; -``` \ No newline at end of file diff --git a/docs/document/react-native/conversation_delete.md b/docs/document/react-native/conversation_delete.md new file mode 100644 index 000000000..f3f878264 --- /dev/null +++ b/docs/document/react-native/conversation_delete.md @@ -0,0 +1,58 @@ +# 删除会话 + + + +删除好友或退出群组后,SDK 不会自动删除对应的单聊或群聊会话。你可以调用相应的接口从服务器和本地删除单个会话及其历史消息。 + +## 前提条件 + +开始前,请确保满足以下条件: + +- 完成 SDK 初始化,并连接到服务器,详见 [快速开始](quickstart.html)。 +- 了解环信即时通讯 IM API 的使用限制,详见 [使用限制](/product/limitation.html)。 + +## 技术原理 + +环信即时通讯 IM 支持从服务器和本地删除单个会话及其历史消息,主要方法如下: + +- `ChatManager.removeConversationFromServer`:单向删除服务端的单个会话及其历史消息。 +- `ChatManager.deleteConversation`:删除本地单个会话及其历史消息。 + +## 实现方法 + +#### 单向删除服务端会话及其历史消息 + +你可以调用 `removeConversationFromServer` 方法删除服务器端会话和历史消息。会话和消息删除后,当前用户无法从服务器获取该会话和消息,对本地的会话无影响,但会删除本地消息,而其他用户不受影响。 + +示例代码如下: + +```typescript +// convId: 会话 ID。 +// convType:会话类型。 +// isDeleteMessage:删除会话时是否同时删除该会话中的消息。 +ChatClient.getInstance() + .chatManager.removeConversationFromServer(convId, convType, isDeleteMessage) + .then(() => { + console.log("remove conversions success"); + }) + .catch((reason) => { + console.log("remove conversions fail.", reason); + }); +``` + +### 删除本地会话及历史消息 + +你可以调用 `deleteConversation` 方法删除本地保存的指定会话,示例代码如下: + +```typescript +// convId: 会话 ID。 +// withMessage:删除会话时是否同时删除该会话中的消息。 +ChatClient.getInstance() + .chatManager.deleteConversation(convId, withMessage) + .then(() => { + console.log("remove conversions success"); + }) + .catch((reason) => { + console.log("remove conversions fail.", reason); + }); +``` diff --git a/docs/document/react-native/conversation_list.md b/docs/document/react-native/conversation_list.md new file mode 100644 index 000000000..6defcf6e3 --- /dev/null +++ b/docs/document/react-native/conversation_list.md @@ -0,0 +1,69 @@ +# 会话列表 + + + +对于单聊、群组聊天和聊天室会话,用户发消息时 SDK 会自动创建会话并将会话添加至用户的会话列表。 + +环信服务器和本地均存储会话,你可以获取会话列表。**服务器默认存储 100 条会话,可存储 7 天。若提升这两个上限,需联系环信商务。** + +## 前提条件 + +开始前,请确保满足以下条件: + +- 完成 SDK 初始化,并连接到服务器,详见 [快速开始](quickstart.html)。 +- 了解环信即时通讯 IM API 的使用限制,详见 [使用限制](/product/limitation.html)。 + +## 技术原理 + +环信即时通讯 IM 支持从服务器和本地获取会话列表,主要方法如下: + +- `ChatManager.fetchConversationsFromServerWithCursor`:从服务器获取会话列表。 +- `ChatManager.getAllConversationsBySort`:获取本地所有会话。 + +## 实现方法 + +### 从服务器分页获取会话列表 + +你可以调用 `fetchConversationsFromServerWithCursor` 方法从服务端分页获取会话列表,包含单聊和群组聊天会话,不包含聊天室会话。SDK 按照会话活跃时间(会话的最新一条消息的时间戳)的倒序返回会话列表,每个会话对象中包含会话 ID、会话类型、是否为置顶状态、置顶时间(对于未置顶的会话,值为 `0`)、会话标记以及最新一条消息。从服务端拉取会话列表后会更新本地会话列表。 + +:::tip +1. **若使用该功能,需在环信控制台开通,并将 SDK 升级至 1.2.0。而且,只有开通该功能,你才能使用置顶会话功能。** +2. 建议你在首次下载、卸载后重装应用等本地数据库无数据情况下拉取服务端会话列表。其他情况下,调用 `getAllConversations` 方法获取本地所有会话即可。 +3. 通过 RESTful 接口发送的消息默认不创建或写入会话。若会话中的最新一条消息通过 RESTful 接口发送,获取会话列表时,该会话中的最新一条消息显示为通过非 RESTful 接口发送的最新消息。若要开通 RESTful 接口发送的消息写入会话列表的功能,需联系商务。 +::: + +示例代码如下: + +```typescript +// pageSize: 每页返回的会话数。取值范围为 [1,50]。 +// cursor: 开始获取数据的游标位置。如果为空字符串或传 `undefined`,SDK 从最新活跃的会话开始获取。 +ChatClient.getInstance() + .chatManager.fetchConversationsFromServerWithCursor(cursor, pageSize) + .then(() => { + console.log("get conversions success"); + }) + .catch((reason) => { + console.log("get conversions fail.", reason); + }); +``` + +若不支持 `fetchConversationsFromServerWithCursor`,你可以调用 `fetchConversationsFromServerWithPage` 接口从服务器获取会话列表。利用该接口,你总共可获取服务器最近 7 天内存储的 100 个会话。若提升这两个上限,需联系环信商务。 + +### 获取本地所有会话 + +你可以调用 `getAllConversations` 方法一次性获取本地所有会话。 + +本地会话列表包含单聊和群组聊天会话,至于是否包含聊天室会话,取决于在 SDK 初始化时 `ChatOptions#deleteMessagesAsExitChatRoom` 参数的设置。若设置为 `true`,即离开聊天室时删除该聊天室的所有本地消息,则本地会话列表中不包含聊天室会话。若设置为 `false`,即保留该聊天室的所有本地消息,则本地会话列表中包含聊天室会话。 + +示例代码如下: + +```typescript +ChatClient.getInstance() + .chatManager.getAllConversations() + .then(() => { + console.log("get conversions success"); + }) + .catch((reason) => { + console.log("get conversions fail.", reason); + }); +``` \ No newline at end of file diff --git a/docs/document/react-native/conversation_overview.md b/docs/document/react-native/conversation_overview.md new file mode 100644 index 000000000..d317a0a62 --- /dev/null +++ b/docs/document/react-native/conversation_overview.md @@ -0,0 +1,66 @@ +# 会话介绍 + + + +会话是一个单聊、群聊或者聊天室所有消息的集合。用户需在会话中发送消息、查看或清空历史消息等操作。 + +环信即时通讯 IM SDK 提供 `ChatManager` 和 `ChatConversation` 类以会话为单位对消息数据进行管理,如获取会话列表、置顶会话、添加会话标记、删除会话和管理未读消息等。 + +## 会话类 + +环信即时通讯 IM 提供会话类 `ChatConversation`。该类定义了以下内容: + +| 类/方法 | 描述 | +| :--------- | :------- | +| ChatSearchDirection | 消息搜索方向枚举。
- `UP`:按照消息中的 Unix 时间戳的逆序搜索。
- `DOWN`:按照消息中的时间戳的正序搜索。 | +| ChatConversationType | 会话类型枚举。
- `PeerChat`:单聊会话;
- `GroupChat`:群聊会话;
- `RoomChat`:聊天室会话。| +| convId | 会话 ID,取决于会话类型。
- 单聊:会话 ID 为对方的用户 ID;
- 群聊:会话 ID 为群组 ID;
- 聊天室:会话 ID 为聊天室的 ID。 | +| convType | 会话类型。
- `Chat`:单聊会话;
- `GroupChat`:群聊会话;
- `ChatRoom`:聊天室会话。
- `HelpDesk`:客服会话。 | +| isChatThread | 是否为 thread 会话。 | +| ext | 会话扩展属性。 | +| isPinned | 是否为置顶会话。 | +| pinnedTime | 会话置顶的 UNIX 时间戳,单位为毫秒。未置顶时值为 `0`。 | +| name | 获取会话 ID。 | +| getUnreadCount | 获取会话的未读消息数量。 | +| getMessageCount | 获取会话中的消息数量。 | +| getLatestMessage | 获取指定会话的最新消息。 | +| getLatestReceivedMessage | 获取指定会话中最近接收到的消息。 | +| setConversationExtension | 设置指定会话的自定义扩展信息。 | +| markMessageAsRead | 标记指定消息为已读。 | +| markAllMessagesAsRead | 标记所有消息为已读。 | +| updateMessage | 更新本地数据库的指定消息。 | +| deleteMessage | 删除本地数据库中的指定消息。 | +| deleteMessagesWithTimestamp | 从本地数据库中删除指定时间段内的消息。 | +| deleteAllMessages | 删除内存和本地数据库中的所有消息。 | +| getMessagesWithMsgType | 从本地数据库获取会话中的指定用户发送的某些类型的消息。 | +| getMessages | 从本地数据库获取指定会话中一定数量的消息。 | +| getMessagesWithKeyword | 从本地数据库获取会话中的指定用户发送的一定数量的特定消息。 | +| getMessageWithTimestamp | 从本地数据库获取指定会话在一段时间内的消息。 | +| fetchHistoryMessages | 分页获取指定会话的历史消息。 | +| fetchHistoryMessagesByOptions | 根据消息拉取参数配置从服务器分页获取指定会话的历史消息。 | +| removeMessagesFromServerWithMsgIds | 根据消息 ID 单向删除漫游消息。 | +| removeMessagesFromServerWithTimestamp | 根据消息时间戳单向删除漫游消息。 | +| pinConversation | 置顶会话。 | + + +## 会话事件 + +`IEMChatManager` 类中提供会话事件的监听接口。开发者可以通过设置此监听,获取会话事件,并做出相应处理。如果不再使用该监听,需要移除,防止出现内存泄漏。 + +示例代码如下: + +```typescript +ChatClient.getInstance().chatManager.addMessageListener({ + onConversationRead(from: string, to?: string): void { + // 收到会话已读的事件。该事件在以下场景中触发: + // 1. 当消息接收方调用 `sendConversationReadAck` 方法,SDK 会执行此回调,并将本地数据库中 `Message` 的 `hasReadAck` 置为 `true`. + // 2. 多端多设备登录时,若一端发送会话已读回执(sendConversationReadAck),服务器端会将该会话的未读消息数置为 0,同时其他端会回调此方法,并将本地数据库中该会话中消息的 `hasRead` 属性置为 `true`。 + }, +}); +``` + + + + + + diff --git a/docs/document/react-native/conversation_pin.md b/docs/document/react-native/conversation_pin.md new file mode 100644 index 000000000..1e18f7ae0 --- /dev/null +++ b/docs/document/react-native/conversation_pin.md @@ -0,0 +1,73 @@ +# 会话置顶 + + + +会话置顶指将单聊或群聊会话固定在会话列表的顶部,方便用户查找。例如,将重点会话置顶,可快速定位会话。 + +## 前提条件 + +开始前,请确保满足以下条件: + +- 完成 SDK 初始化,并连接到服务器,详见 [快速开始](quickstart.html)。 +- 了解环信即时通讯 IM API 的使用限制,详见 [使用限制](/product/limitation.html)。 +- **[开通服务端会话列表功能](conversation_list#从服务器分页获取会话列表)**。 + +## 技术原理 + +环信即时通讯 IM 支持会话置顶,主要方法如下: + +- `ChatManager.pinConversation`:置顶会话。 +- `ChatManager.asyncFetchPinnedConversationsFromServer`:获取服务端置顶会话列表。 + +## 实现方法 + +### 置顶会话 + +你可以调用 `pinConversation` 方法设置是否置顶会话。置顶状态会存储在服务器上,多设备登录情况下,更新的置顶状态会同步到其他登录设备,其他设备分别会收到 `CONVERSATION_PINNED` 和 `CONVERSATION_UNPINNED` 事件。 + +你最多可以置顶 50 个会话。 + +:::tip +若使用该功能,需将 SDK 升级至 1.2.0。 +::: + +示例代码如下: + +```typescript +// isPinned: 设置是否置顶会话。 +ChatClient.getInstance() + .chatManager.pinConversation(convId, isPinned) + .then(() => { + console.log("pin conversions success"); + }) + .catch((reason) => { + console.log("pin conversions fail.", reason); + }); +``` + +你可以通过 `ChatConversation` 对象的 `isPinned` 字段检查会话是否为置顶状态,或查看 `pinnedTime` 字段获取会话置顶时间。 + +### 获取服务端的置顶会话列表 + +你可以调用 `fetchPinnedConversationsFromServerWithCursor` 方法从服务端分页获取置顶会话列表。SDK 按照会话置顶时间的倒序返回。 + +你最多可以拉取 50 个置顶会话。 + +:::notice +若使用该功能,需将 SDK 升级至 1.2.0。 +::: + +示例代码如下: + +```typescript +// pageSize: 每页返回的会话数。取值范围为 [1,50]。 +// cursor: 开始获取数据的游标位置。若获取数据时传 `undefined` 或者空字符串(""),SDK 从最新置顶的会话开始查询。 +ChatClient.getInstance() + .chatManager.fetchPinnedConversationsFromServerWithCursor(cursor, pageSize) + .then(() => { + console.log("get conversions success"); + }) + .catch((reason) => { + console.log("get conversions fail.", reason); + }); +``` \ No newline at end of file diff --git a/docs/document/react-native/conversation_unread.md b/docs/document/react-native/conversation_unread.md new file mode 100644 index 000000000..6732ff8ad --- /dev/null +++ b/docs/document/react-native/conversation_unread.md @@ -0,0 +1,108 @@ +## 会话未读数 + + + +你可以查看本地所有会话或指定会话的未读消息数,并针对会话的未读消息数清零。 + +## 前提条件 + +开始前,请确保满足以下条件: + +- 完成 SDK 初始化并连接到服务器,详见 [快速开始](quickstart.html)。 +- 了解环信即时通讯 IM API 的使用限制,详见 [使用限制](/product/limitation.html)。 + +## 技术原理 + +环信即时通讯 IM React Native SDK 通过 `ChatManager` 类实现对本地会话的未读消息数的管理,其中核心方法如下: + +- `ChatManager#getUnreadCount`:获取本地所有会话的未读消息数。 +- `ChatManager#getConversationUnreadCount`:获取本地指定会话的未读消息数。 +- `ChatManager#markAllConversationsAsRead`:将本地所有会话的未读消息数清零。 +- `ChatManager#markAllMessagesAsRead`:对于本地指定会话的未读消息数清零。 +- `ChatManager#markMessageAsRead`:将指定会话的单条未读消息置为已读。 + +## 实现方法 + +### 获取所有会话的未读消息数 + +你可以调用 `getUnreadCount` 方法获取所有本地会话的未读消息数,示例代码如下: + +```typescript +// convId: 会话 ID +// convType:会话类型 +ChatClient.getInstance() + .chatManager.getUnreadCount() + .then((count) => { + console.log("get count success"); + }) + .catch((reason) => { + console.log("get count fail.", reason); + }); +``` + +### 获取指定会话的未读消息数 + +你可以调用 `getConversationUnreadCount` 方法获取本地指定会话的未读消息数,示例代码如下: + +```typescript +// convId: 会话 ID +// convType:会话类型 +ChatClient.getInstance() + .chatManager.getConversationUnreadCount(convId, convType) + .then((count) => { + console.log("get count success"); + }) + .catch((reason) => { + console.log("get count fail.", reason); + }); +``` + +### 将所有会话的未读消息数清零 + +你可以调用 `markAllConversationsAsRead` 方法将本地所有会话的未读消息数清零,示例代码如下: + +```typescript +ChatClient.getInstance() + .chatManager.markAllConversationsAsRead() + .then(() => { + console.log("conversions had read success"); + }) + .catch((reason) => { + console.log("conversions had read fail.", reason); + }); +``` + +### 指定会话的未读消息数清零 + +你可以调用 `markAllMessagesAsRead` 方法对本地指定会话的未读消息数清零,示例代码如下: + +```typescript +// convId:会话 ID +// convType: 会话类型 +ChatClient.getInstance() + .chatManager.markAllMessagesAsRead(convId, convType) + .then(() => { + console.log("conversions had read success"); + }) + .catch((reason) => { + console.log("conversions had read fail.", reason); + }); +``` + +### 将指定会话的单条未读消息置为已读 + +你可以调用 `markMessageAsRead` 方法将本地指定会话的单条未读消息置为已读。 + +```typescript +// convId:会话 ID +// convType: 会话类型 +// msgId:消息 ID +ChatClient.getInstance() + .chatManager.markMessageAsRead(convId, convType, msgId) + .then(() => { + console.log("conversions had read success"); + }) + .catch((reason) => { + console.log("conversions had read fail.", reason); + }); +``` diff --git a/docs/document/react-native/message_manage.md b/docs/document/react-native/message_manage.md index b97904cf2..e3f03dd67 100644 --- a/docs/document/react-native/message_manage.md +++ b/docs/document/react-native/message_manage.md @@ -1,16 +1,14 @@ -# 管理会话和消息 +# 管理消息 -会话是一个单聊、群聊或者聊天室所有消息的集合。除了在会话中发送和接收消息,环信即时通讯 IM React Native SDK 支持以会话为单位对消息数据进行管理,如获取与管理未读消息、搜索和删除历史消息等。 - -本文介绍环信即时通讯 IM React Native SDK 如何管理会话和消息。 +本文介绍环信即时通讯 IM React Native SDK 如何管理消息,例如获取消息、搜索和删除历史消息等。 ## 技术原理 环信即时通讯 IM React Native SDK 通过 `ChatManager` 和 `ChatConversation` 类实现对会话和消息的管理。 -- 管理服务器端和本地的会话; +- 管理服务器端消息; - 管理本地消息。 ## 前提条件 @@ -22,111 +20,13 @@ ## 实现方法 -### 管理服务端和本地的会话 - -#### 获取会话列表 - -对于单聊或群聊,用户发消息时会自动将对方添加到用户的会话列表。 - -你可以调用 `fetchConversationsFromServerWithCursor` 方法从服务端分页获取会话列表。SDK 按照会话活跃时间(会话的最新一条消息的时间戳)的倒序返回会话列表,每个会话对象中包含会话 ID、会话类型、是否为置顶状态、置顶时间(对于未置顶的会话,值为 `0`)以及最新一条消息。从服务端拉取会话列表后会更新本地会话列表。 - -服务器默认存储 100 条会话,可存储 7 天。若提升这两个上限,需联系环信商务。 - -:::tip -1. 若使用该功能,需将 SDK 升级至 1.2.0。 -2. 建议你在首次下载、卸载后重装应用等本地数据库无数据情况下拉取服务端会话列表。其他情况下,调用 `getAllConversations` 方法获取本地所有会话即可。 -3. 通过 RESTful 接口发送的消息默认不创建或写入会话。若会话中的最新一条消息通过 RESTful 接口发送,获取会话列表时,该会话中的最新一条消息显示为通过非 RESTful 接口发送的最新消息。若要开通 RESTful 接口发送的消息写入会话列表的功能,需联系商务。 -::: - -示例代码如下: - -```typescript -// pageSize: 每页返回的会话数。取值范围为 [1,50]。 -// cursor: 开始获取数据的游标位置。如果为空字符串或传 `undefined`,SDK 从最新活跃的会话开始获取。 -ChatClient.getInstance() - .chatManager.fetchConversationsFromServerWithCursor(cursor, pageSize) - .then(() => { - console.log("get conversions success"); - }) - .catch((reason) => { - console.log("get conversions fail.", reason); - }); -``` - -若不支持 `fetchConversationsFromServerWithCursor`,你可以调用 `fetchConversationsFromServerWithPage` 接口从服务器获取会话列表。利用该接口,你总共可获取服务器最近 7 天内存储的 100 个会话。若提升这两个上限,需联系环信商务。 - - -你可以调用 `getAllConversations` 方法获取本地所有会话,示例代码如下: - -```typescript -ChatClient.getInstance() - .chatManager.getAllConversations() - .then(() => { - console.log("get conversions success"); - }) - .catch((reason) => { - console.log("get conversions fail.", reason); - }); -``` - -#### 获取服务端的置顶会话列表 - -你可以调用 `fetchPinnedConversationsFromServerWithCursor` 方法从服务端分页获取置顶会话列表。SDK 按照会话置顶时间的倒序返回。 - -你最多可以拉取 50 个置顶会话。 - -:::notice -若使用该功能,需将 SDK 升级至 1.2.0。 -::: - -示例代码如下: - -```typescript -// pageSize: 每页返回的会话数。取值范围为 [1,50]。 -// cursor: 开始获取数据的游标位置。若获取数据时传 `undefined` 或者空字符串(""),SDK 从最新置顶的会话开始查询。 -ChatClient.getInstance() - .chatManager.fetchPinnedConversationsFromServerWithCursor(cursor, pageSize) - .then(() => { - console.log("get conversions success"); - }) - .catch((reason) => { - console.log("get conversions fail.", reason); - }); -``` - -#### 置顶会话 - -会话置顶指将单聊或群聊会话固定在会话列表的顶部,方便用户查找。例如,将重点会话置顶,可快速定位会话。 - -你可以调用 `pinConversation` 方法设置是否置顶会话。置顶状态会存储在服务器上,多设备登录情况下,更新的置顶状态会同步到其他登录设备,其他登录设备分别会收到 `CONVERSATION_PINNED` 和 `CONVERSATION_UNPINNED` 事件。你最多可以置顶 50 个会话。 - -:::notice -若使用该功能,需将 SDK 升级至 1.2.0。 -::: - -示例代码如下: - -```typescript -// isPinned: 设置是否置顶会话。 -ChatClient.getInstance() - .chatManager.pinConversation(convId, isPinned) - .then(() => { - console.log("pin conversions success"); - }) - .catch((reason) => { - console.log("pin conversions fail.", reason); - }); -``` - -你可以通过 `ChatConversation` 对象的 `isPinned` 字段检查会话是否为置顶状态,或查看 `pinnedTime` 字段获取会话置顶时间。 +### 管理服务端消息 #### 分页获取指定会话的历史消息 环信即时通讯 IM 提供消息漫游功能,即将用户的所有会话的历史消息保存在消息服务器,用户在任何一个终端设备上都能获取到历史信息,使用户在多个设备切换使用的情况下也能保持一致的会话场景。 -你可以调用 `fetchHistoryMessages` 方法从服务器分页获取指定会话的历史消息。该功能需在[环信即时通讯 IM 管理后台](https://console.easemob.com/user/login)开通。 - -为确保数据可靠,我们建议你多次调用该方法,且每次获取的消息数小于 50 条。获取到数据后,SDK 会自动将消息更新到本地数据库。 +你可以调用 `fetchHistoryMessages` 方法从服务器分页获取指定会话的历史消息。为确保数据可靠,我们建议你多次调用该方法,且每次获取的消息数小于 50 条。获取到数据后,SDK 会自动将消息更新到本地数据库。 :::notice 1. 历史消息和离线消息在服务器上的存储时间与你订阅的套餐包有关,详见[产品价格](/product/pricing.html#套餐包功能详情)。 @@ -179,7 +79,7 @@ ChatClient.getInstance() 你可以调用 `removeMessagesFromServerWithTimestamp` 或者 `removeMessagesFromServerWithMsgIds` 方法单向删除服务端的历史消息,每次最多可删除 50 条消息。消息删除后,该用户无法从服务端拉取到该消息,已删除的消息自动从设备本地移除。其他用户不受该操作影响。 :::tip -若使用该功能,需将 SDK 升级至 V1.1.0 或以上版本并联系商务。 +若使用该功能,需将 SDK 升级至 V1.1.0 或以上版本并联系商务开通。 ::: 示例代码如下: @@ -209,40 +109,7 @@ ChatClient.getInstance() }); ``` -#### 单向删除服务端会话及其历史消息 - -你可以调用 `removeConversationFromServer` 方法删除服务器端会话和历史消息。会话和消息删除后,当前用户无法从服务器获取该会话和消息,对本地的会话无影响,但会删除本地消息,而其他用户不受影响。该功能需在[环信即时通讯 IM 管理后台](https://console.easemob.com/user/login)开通。 - -示例代码如下: - -```typescript -// convId: 会话 ID。 -// convType:会话类型。 -// isDeleteMessage:删除会话时是否同时删除该会话中的消息。 -ChatClient.getInstance() - .chatManager.removeConversationFromServer(convId, convType, isDeleteMessage) - .then(() => { - console.log("remove conversions success"); - }) - .catch((reason) => { - console.log("remove conversions fail.", reason); - }); -``` - -你可以调用 `deleteConversation` 方法删除本地保存的指定会话,示例代码如下: - -```typescript -// convId: 会话 ID。 -// withMessage:删除会话时是否同时删除该会话中的消息。 -ChatClient.getInstance() - .chatManager.deleteConversation(convId, withMessage) - .then(() => { - console.log("remove conversions success"); - }) - .catch((reason) => { - console.log("remove conversions fail.", reason); - }); -``` +### 管理本地消息 #### 更新本地会话中的消息 @@ -262,8 +129,6 @@ ChatClient.getInstance() }); ``` -### 管理本地消息 - #### 根据消息 ID 搜索消息 你可以调用 `getMessage` 方法根据消息 ID 获取本地存储的指定消息。如果消息不存在会返回空值。 @@ -446,90 +311,6 @@ ChatClient.getInstance() }); ``` -#### 获取所有会话的未读消息数 - -你可以调用 `getUnreadCount` 方法获取所有会话的未读消息数。 - -```typescript -// convId: 会话 ID -// convType:会话类型 -ChatClient.getInstance() - .chatManager.getUnreadCount() - .then((count) => { - console.log("get count success"); - }) - .catch((reason) => { - console.log("get count fail.", reason); - }); -``` - -#### 获取指定会话的未读消息数 - -你可以调用 `getConversationUnreadCount` 方法获取指定会话的未读消息数。 - -```typescript -// convId: 会话 ID -// convType:会话类型 -ChatClient.getInstance() - .chatManager.getConversationUnreadCount(convId, convType) - .then((count) => { - console.log("get count success"); - }) - .catch((reason) => { - console.log("get count fail.", reason); - }); -``` - -#### 标记所有会话中的消息已读 - -你可以调用 `markAllConversationsAsRead` 方法标记所有会话中的消息已读。 - -```typescript -ChatClient.getInstance() - .chatManager.markAllConversationsAsRead() - .then(() => { - console.log("conversions had read success"); - }) - .catch((reason) => { - console.log("conversions had read fail.", reason); - }); -``` - -#### 标记指定会话所有消息已读 - -你可以调用 `markAllMessagesAsRead` 方法标记指定会话所有消息已读。 - -```typescript -// convId:会话 ID -// convType: 会话类型 -ChatClient.getInstance() - .chatManager.markAllMessagesAsRead(convId, convType) - .then(() => { - console.log("conversions had read success"); - }) - .catch((reason) => { - console.log("conversions had read fail.", reason); - }); -``` - -#### 标记指定会话中的指定消息已读 - -你可以调用 `markMessageAsRead` 方法标记指定会话中的指定消息已读。 - -```typescript -// convId:会话 ID -// convType: 会话类型 -// msgId:消息 ID -ChatClient.getInstance() - .chatManager.markMessageAsRead(convId, convType, msgId) - .then(() => { - console.log("conversions had read success"); - }) - .catch((reason) => { - console.log("conversions had read fail.", reason); - }); -``` - #### 更新指定消息 你可以调用 `updateMessage` 方法更新指定消息。 diff --git a/docs/document/unity/conversation_delete.md b/docs/document/unity/conversation_delete.md new file mode 100644 index 000000000..226dc7e4b --- /dev/null +++ b/docs/document/unity/conversation_delete.md @@ -0,0 +1,52 @@ +# 删除会话 + + + +删除好友或退出群组后,SDK 不会自动删除对应的单聊或群聊会话。你可以调用相应的接口从服务器和本地删除单个会话及其历史消息。 + +## 前提条件 + +开始前,请确保满足以下条件: + +- 完成 SDK 初始化,并连接到服务器,详见 [快速开始](quickstart.html)。 +- 了解环信即时通讯 IM API 的使用限制,详见 [使用限制](/product/limitation.html)。 + +## 技术原理 + +环信即时通讯 IM 支持从服务器和本地删除单个会话及其历史消息,主要方法如下: + +- `DeleteConversationFromServer`:单向删除服务端的单个会话及其历史消息。 +- `DeleteConversation`:删除本地单个会话及其历史消息。 + +## 实现方法 + +### 单向删除服务端会话及其历史消息 + +你可以调用 `DeleteConversationFromServer` 方法删除服务器端会话和历史消息。会话和消息删除后,当前用户无法从服务器获取该会话和消息,对本地的会话无影响,但会删除本地消息,而其他用户不受影响。 + +```csharp +SDKClient.Instance.ChatManager.DeleteConversationFromServer(conversationId, conversationType, isDeleteServerMessages, new CallBack( + onSuccess: () => + { + }, + onError: (code, desc) => + { + } +)); +``` + +### 删除本地会话及历史消息 + +- 你可以调用 `DeleteConversation` 方法删除本地会话及其聊天消息: + +```csharp +//如需保留历史消息,传 `false`。 +SDKClient.Instance.ChatManager.DeleteConversation(conversationId, true); +``` + +- 你可以调用 `DeleteMessage` 方法删除指定会话中指定的一条历史消息。 + +```csharp +Conversation conv = SDKClient.Instance.ChatManager.GetConversation(conversationId, convType); +conv.DeleteMessage(msgId); +``` diff --git a/docs/document/unity/conversation_list.md b/docs/document/unity/conversation_list.md new file mode 100644 index 000000000..db8603056 --- /dev/null +++ b/docs/document/unity/conversation_list.md @@ -0,0 +1,90 @@ +# 会话列表 + + + +对于单聊、群组聊天和聊天室会话,用户发消息时 SDK 会自动创建会话并将会话添加至用户的会话列表。 + +环信服务器和本地均存储会话,你可以获取会话列表。**服务器默认存储 100 条会话,可存储 7 天。若提升这两个上限,需联系环信商务。** + +## 前提条件 + +开始前,请确保满足以下条件: + +- 完成 SDK 初始化,并连接到服务器,详见 [快速开始](quickstart.html)。 +- 了解环信即时通讯 IM API 的使用限制,详见 [使用限制](/product/limitation.html)。 + +## 技术原理 + +环信即时通讯 IM 支持从服务器和本地获取会话列表,主要方法如下: + +- `IChatManager#GetConversationsFromServerWithCursor`:从服务器获取会话列表。 +- `IChatManager#LoadAllConversations`:获取本地所有会话。 + +## 实现方法 + +### 从服务器分页获取会话列表 + +你可以调用 `GetConversationsFromServerWithCursor` 方法从服务端分页获取会话列表,包含单聊和群组聊天会话,不包含聊天室会话。通过设置该方法中的 `pinOnly` 参数确定是否只获取置顶会话列表: + +- 若 `pinOnly` 为 `false`,获取包括置顶和未置顶会话的列表。SDK 按照会话活跃时间(会话的最新一条消息的时间戳)的倒序返回会话列表,每个会话对象中包含会话 ID、会话类型、是否为置顶状态、置顶时间(对于未置顶的会话,值为 `0`)以及最新一条消息。从服务端拉取会话列表后会更新本地会话列表。 +- 若为 `true` 仅获取置顶会话列表,最多可拉取 50 个置顶会话。SDK 按照会话置顶时间的倒序返回。 + +:::tip +1. 若使用该方法,需将 SDK 升级至 1.2.0。 +2. 建议你在首次下载、卸载后重装应用等本地数据库无数据情况下拉取服务端会话列表。其他情况下,调用 `LoadAllConversations` 方法获取本地所有会话即可。 +3. 通过 RESTful 接口发送的消息默认不创建或写入会话。若会话中的最新一条消息通过 RESTful 接口发送,获取会话列表时,该会话中的最新一条消息显示为通过非 RESTful 接口发送的最新消息。若要开通 RESTful 接口发送的消息写入会话列表的功能,需联系商务。 +::: + +```csharp +// limit: 每页返回的会话数。取值范围为 [1,50]。 +// cursor: 开始获取数据的游标位置。若获取数据时传 `null` 或者空字符串(""),SDK 从最新活跃的会话开始查询。 +int limit = 10; +string cursor = ""; +bool pinOnly = false; // `false`:获取所有会话;`true`仅获取置顶会话列表。 +SDKClient.Instance.ChatManager.GetConversationsFromServerWithCursor(pinOnly, cursor, limit, new ValueCallBack>( + onSuccess: (result) => + { + // 遍历获取到的会话列表 + foreach (var conv in result.Data) + { + + } + // 下一次请求的 cursor + string nextCursor = result.Cursor; + }, + onError: (code, desc) => + { + + } +)); + +``` + +若不支持 `GetConversationsFromServerWithCursor` 方法,你可以调用 `GetConversationsFromServerWithPage` 方法从服务端分页获取会话列表。利用该接口,你总共可获取服务器最近 7 天内存储的 100 个会话。若提升这两个上限,需联系环信商务。 + +若使用该功能,需将 SDK 升级至 V1.1.0。 + +```csharp +SDKClient.Instance.ChatManager.GetConversationsFromServerWithPage(pageNum, pageSize, new ValueCallBack>( + //获取会话成功后的处理逻辑。 + //list 为 List 类型。 + onSuccess: (list) => + { + }, + onError: (code, desc) => + { + } +)); +``` + +### 获取本地所有会话 + +你可以调用 `LoadAllConversations` 方法根据会话 ID 和会话类型获取本地所有会话。SDK 从内存中获取会话,若未从本地数据库中加载过,会先从数据库加载到内存中。获取会话后,SDK 按照会话活跃时间(最新一条消息的时间戳)的倒序返回会话,置顶会话在前,非置顶会话在后,会话列表为 `List` 结构。 + +本地会话列表包含单聊和群组聊天会话,至于是否包含聊天室会话,取决于在 SDK 初始化时 `Options#DeleteMessagesAsExitRoom` 参数的设置。若设置为 `true`,即离开聊天室时删除该聊天室的所有本地消息,则本地会话列表中不包含聊天室会话。若设置为 `false`,即保留该聊天室的所有本地消息,则本地会话列表中包含聊天室会话。 + +示例代码如下: + +```csharp +Listlist = SDKClient.Instance.ChatManager.LoadAllConversations(); +``` \ No newline at end of file diff --git a/docs/document/unity/conversation_overview.md b/docs/document/unity/conversation_overview.md new file mode 100644 index 000000000..fa1477f36 --- /dev/null +++ b/docs/document/unity/conversation_overview.md @@ -0,0 +1,68 @@ +# 会话介绍 + + + +会话是一个单聊、群聊或者聊天室所有消息的集合。用户需在会话中发送消息、查看或清空历史消息等操作。 + +环信即时通讯 IM SDK 提供 `IChatManager` 和 `Conversation` 类以会话为单位对消息数据进行管理,如获取会话列表、置顶会话、添加会话标记、删除会话和管理未读消息等。 + +## 会话类 + +环信即时通讯 IM 提供会话类 `Conversation`。该类定义了以下内容: + +| 类/方法 | 描述 | +| :--------- | :------- | +| Id | 会话 ID,取决于会话类型。
- 单聊:会话 ID 为对方的用户 ID;
- 群聊:会话 ID 为群组 ID;
- 聊天室:会话 ID 为聊天室的 ID。 | +| Type | 会话类型。
- `Chat`:单聊会话;
- `Group`:群聊会话;
- `Room`:聊天室会话。
- `HelpDesk`:客服会话。 | +| IsThread | 判断该会话是否为子区会话。 | +| IsPinned | 判断该会话是否被置顶。 | +| PinnedTime | 会话置顶时间戳(毫秒)。如果 `IsPinned` 为 `false`,将返回 `0`。 | +| LastMessage | 获取指定会话的最新消息。该方法的调用不影响会话的未读消息数。 SDK 首先从内存中获取最新消息,若在内存中未找到,则从数据库中加载,然后将其存放在内存中。 | +| LastReceivedMessage | 获取指定会话中收到的最新消息。 | +| Ext | 获取指定会话的扩展信息。 | +| UnReadCount | 获取指定会话的未读消息数。 | +| MarkMessageAsRead | 设置指定消息为已读。 | +| MarkAllMessageAsRead | 将指定会话的所有未读消息设置为已读。 | +| InsertMessage | 在本地数据库的指定会话中插入一条消息。 | +| AppendMessage | 在本地数据库中指定会话的尾部插入一条消息。 | +| UpdateMessage | 更新本地数据库的指定消息。 | +| DeleteMessage | 删除本地数据库中的一条指定消息。 | +| DeleteMessages | 删除本地数据库中指定时间段的消息。 | +| DeleteAllMessages | 删除指定会话中所有消息。 | +| LoadMessage | 加载指定消息。SDK 首先在内存中查找消息,若在内存中未找到,SDK 会在本地数据库查询并加载。 | +| LoadMessagesWithMsgType | 加载特定类型的多条消息。SDK 首先在内存中查询消息,若在内存中未找到,SDK 会在本地数据库查询并加载。 | +| LoadMessages | 从指定消息 ID 开始加载消息。 | +| LoadMessagesWithKeyword | 根据关键字加载消息。SDK 首先在内存中查找消息,若在内存中未找到,SDK 会在本地数据库查询并加载。 | +| LoadMessagesWithTime | 加载指定时间段内的消息。 | +| MessagesCount | 获取 SDK 本地数据库中会话的全部消息数目。 | + + +## 会话事件 + +`IChatManagerDelegate` 中提供会话事件的监听接口。开发者可以通过设置此监听,获取会话事件,并做出相应处理。如果不再使用该监听,需要移除。 + +示例代码如下: + +```csharp +public class ChatManagerDelegate : IChatManagerDelegate { + // 收到会话已读回调 + public void OnConversationRead(string from, string to) + { + + } +} + +// 注册会话监听回调。 +ChatManagerDelegate adelegate = new ChatManagerDelegate(); +SDKClient.Instance.ChatManager.AddChatManagerDelegate(adelegate); + +// 移除会话监听回调。 +SDKClient.Instance.ChatManager.RemoveChatManagerDelegate(adelegate); + +``` + + + + + + diff --git a/docs/document/unity/conversation_pin.md b/docs/document/unity/conversation_pin.md new file mode 100644 index 000000000..502814934 --- /dev/null +++ b/docs/document/unity/conversation_pin.md @@ -0,0 +1,58 @@ +# 会话置顶 + + + +会话置顶指将单聊或群聊会话固定在会话列表的顶部,方便用户查找。例如,将重点会话置顶,可快速定位会话。 + +## 前提条件 + +开始前,请确保满足以下条件: + +- 完成 SDK 初始化,并连接到服务器,详见 [快速开始](quickstart.html)。 +- 了解环信即时通讯 IM API 的使用限制,详见 [使用限制](/product/limitation.html)。 +- **[开通服务端会话列表功能](conversation_list#从服务器分页获取会话列表)**。 + +## 技术原理 + +环信即时通讯 IM 支持会话置顶,主要方法如下: + +- `IChatManager#PinConversation`:置顶会话。 +- `IChatManager#GetConversationsFromServerWithCursor`:获取服务端置顶会话列表。 + +## 实现方法 + +### 置顶会话 + +你可以调用 `PinConversation` 方法设置是否置顶会话。置顶状态会存储在服务器上,多设备登录情况下,更新的置顶状态会同步到其他登录设备,其他登录设备分别会收到 `CONVERSATION_PINNED` 和 `CONVERSATION_UNPINNED` 事件。 + +你最多可以置顶 50 个会话。 + +:::tip +若使用该功能,需将 SDK 升级至 1.2.0。 +::: + +示例代码如下: + +```csharp +SDKClient.Instance.ChatManager.PinConversation(convId, isPinned, new CallBack( + onSuccess: () => + { + + }, + onError: (code, desc) => + { + + } +)); +``` + +你可以通过 `EMConversation` 对象的 `isPinned` 字段检查会话是否为置顶状态,或者调用 `getPinnedTime` 方法获取会话置顶时间。 + +### 获取服务端的置顶会话列表 + +你可以调用 `GetConversationsFromServerWithCursor` 方法从服务端分页获取置顶会话列表。如果将该方法中的 pinOnly 参数设置为 `true` 则只获取置顶会话列表。该接口详情,请参考[从服务器分页获取会话列表](conversation_list#从服务器分页获取会话列表)。 + +你最多可以拉取 50 个置顶会话。 + + + diff --git a/docs/document/unity/conversation_unread.md b/docs/document/unity/conversation_unread.md new file mode 100644 index 000000000..ed1f3a670 --- /dev/null +++ b/docs/document/unity/conversation_unread.md @@ -0,0 +1,68 @@ +## 会话未读数 + + + +你可以查看本地所有会话或指定会话的未读消息数,并针对会话的未读消息数清零。 + +## 前提条件 + +开始前,请确保满足以下条件: + +- 完成 SDK 初始化并连接到服务器,详见 [快速开始](quickstart.html)。 +- 了解环信即时通讯 IM API 的使用限制,详见 [使用限制](/product/limitation.html)。 + +## 技术原理 + +环信即时通讯 IM SDK 通过 `IChatManager` 和 `Conversation` 类实现对本地会话的未读消息数的管理,其中核心方法如下: + +- `IChatManager#GetUnreadMessageCount`:获取本地所有会话的未读消息数。 +- `Conversation#UnReadCount`:获取本地指定会话的未读消息数。 +- `IChatManager#MarkAllConversationsAsRead`:将本地所有会话的未读消息数清零。 +- `IChatManager#MarkAllMessageAsRead`:对于本地指定会话的未读消息数清零。 +- `IChatManager#MarkMessageAsRead`:将指定会话的单条未读消息置为已读。 + +## 实现方法 + +### 获取所有会话的未读消息数 + +你可以调用 `GetUnreadMessageCount` 方法获取本地所有会话的未读消息数量,示例代码如下: + +```csharp +SDKClient.Instance.ChatManager.GetUnreadMessageCount(); +``` + +### 获取指定会话的未读消息数 + +你可以调用 `UnReadCount` 方法获取本地指定会话的未读消息数,示例代码如下: + +```csharp +Conversation conv = SDKClient.Instance.ChatManager.GetConversation(conversationId, convType); +int unread = conv.UnReadCount; +``` + +### 将所有会话的未读消息数清零 + +你可以调用 `MarkAllConversationsAsRead` 方法将本地所有会话的未读消息数清零,示例代码如下: + +```csharp +Conversation conv = SDKClient.Instance.ChatManager.GetConversation(conversationId, convType); +SDKClient.Instance.ChatManager.MarkAllConversationsAsRead(); +``` + +### 指定会话的未读消息数清零 + +你可以调用 `MarkAllMessageAsRead` 方法对指定会话的未读消息数清零,示例代码如下: + +```csharp +Conversation conv = SDKClient.Instance.ChatManager.GetConversation(conversationId, convType); +conv.MarkAllMessageAsRead(); +``` + +### 将指定会话的单条未读消息置为已读 + +你可以调用 `markMessageAsRead` 方法将指定会话的单条未读消息置为已读。 + +```csharp +Conversation conv = SDKClient.Instance.ChatManager.GetConversation(conversationId, convType); +conv.MarkMessageAsRead(msgId); +``` diff --git a/docs/document/unity/message_manage.md b/docs/document/unity/message_manage.md index dcf36e06b..493efcbcb 100644 --- a/docs/document/unity/message_manage.md +++ b/docs/document/unity/message_manage.md @@ -1,29 +1,21 @@ -# 管理本地会话和消息 +# 管理本地会话和消息 -本文介绍即时通讯 IM SDK 如何管理本地会话和消息。 - -除了发送和接收消息外,环信即时通讯 IM SDK 还支持以会话为单位对本地的消息数据进行管理,如获取与管理未读消息、搜索和删除历史消息等。其中,会话是一个单聊、群聊或者聊天室所有消息的集合。用户需在会话中发送消息以及查看或清空历史消息。 - -本文介绍如何使用环信即时通讯 IM SDK 在 app 中实现这些功能。 +本文介绍即时通讯 IM SDK 如何实现管理本地消息,例如获取消息、搜索消息、导入消息、插入消息、更新消息以及统计消息流量等。 ## 技术原理 SQLCipher 用于加密存储本地消息的数据库。即时通讯 IM SDK 使用 `IChatManager` 和 `Conversation` 管理本地消息。以下是核心方法: -- `IChatManager.LoadAllConversations` 获取本地所有会话; -- `Conversation.LoadMessages` 读取指定会话的消息; -- `Conversation.UnReadCount` 获取指定会话的未读消息数; -- `IChatManager.GetUnreadMessageCount` 获取所有会话的未读消息数; -- `IChatManager.MarkAllConversationsAsRead` 指定会话的未读消息数清零; -- `IChatManager.DeleteConversation` 删除本地会话及历史消息; -- `IChatManager.DeleteConversationFromServer` 删除服务端的会话及历史消息; -- `IChatManager.LoadMessage` 根据消息 ID 搜索消息; -- `Conversation.LoadMessagesWithMsgType` 获取指定会话中特定类型的消息; -- `Conversation.LoadMessagesWithTime` 获取指定会话中一定时间段内的消息; -- `IChatManager.SearchMsgFromDB` 根据关键字搜索会话消息; -- `IChatManager.ImportMessages` 批量导入消息到数据库; +- `Conversation.LoadMessages` 读取指定会话的消息。 +- `IChatManager.DeleteConversation` 删除本地会话及历史消息。 +- `IChatManager.DeleteConversationFromServer` 删除服务端的会话及历史消息。 +- `IChatManager.LoadMessage` 根据消息 ID 搜索消息。 +- `Conversation.LoadMessagesWithMsgType` 获取指定会话中特定类型的消息。 +- `Conversation.LoadMessagesWithTime` 获取指定会话中一定时间段内的消息。 +- `IChatManager.SearchMsgFromDB` 根据关键字搜索会话消息。 +- `IChatManager.ImportMessages` 批量导入消息到数据库。 - `Conversation.InsertMessage` 在指定会话中插入消息。 ## 前提条件 @@ -35,17 +27,6 @@ SQLCipher 用于加密存储本地消息的数据库。即时通讯 IM SDK 使 ## 实现方法 -### 获取本地所有会话 - -你可以调用 `LoadAllConversations` 方法可以根据会话 ID 和会话类型获取本地所有会话: - -```csharp -Listlist = SDKClient.Instance.ChatManager.LoadAllConversations(); - -``` -SDK 从内存中获取会话,若未从本地数据库中加载过,会先从数据库加载到内存中。获取会话后,SDK 按照会话活跃时间(最新一条消息的时间戳)的倒序返回会话,置顶会话在前,非置顶会话在后,会话列表为 `List` 结构。 - - ### 读取指定会话的消息 你可以从本地数据库中读取指定会话的消息,示例代码如下: @@ -64,56 +45,6 @@ conv.LoadMessages(startMsgId, pagesize, callback:new ValueCallBack )); ``` -### 获取指定会话的未读消息数 - -你可以调用接口获取特定会话的未读消息数,示例代码如下: - -```csharp -Conversation conv = SDKClient.Instance.ChatManager.GetConversation(conversationId, convType); -int unread = conv.UnReadCount; -``` - -### 获取所有会话的未读消息数 - -你可以通过接口获取所有会话的未读消息数量,示例代码如下: - -```csharp -SDKClient.Instance.ChatManager.GetUnreadMessageCount(); -``` - -### 指定会话的未读消息数清零 - -你可以调用接口对特定会话的未读消息数清零,示例代码如下: - -```csharp -Conversation conv = SDKClient.Instance.ChatManager.GetConversation(conversationId, convType); -// 指定会话的未读消息数清零。 -conv.MarkAllMessageAsRead(); - -// 将一条消息置为已读。 -conv.MarkMessageAsRead(msgId); - -// 将所有未读消息数清零。 -SDKClient.Instance.ChatManager.MarkAllConversationsAsRead(); -``` - -### 删除会话及历史消息 - -SDK 提供两个接口,分别可以删除本地会话和历史消息或者删除当前用户在服务器端的会话和聊天消息。 - -调用 `DeleteConversation` 和 `DeleteMessage` 删除本地会话和聊天消息,示例代码如下: - -```csharp -//删除和特定用户的会话,如需保留历史消息,传 `false`。 -SDKClient.Instance.ChatManager.DeleteConversation(conversationId, true); - -//删除当前会话中指定的一条历史消息。 -Conversation conv = SDKClient.Instance.ChatManager.GetConversation(conversationId, convType); -conv.DeleteMessage(msgId); -``` - -删除服务端的会话及其历史消息,详见 [删除服务端会话及其历史消息](conversation_delete.html#单向删除服务端会话及其历史消息)。 - ### 根据消息 ID 搜索消息 你可以调用 `LoadMessage` 方法根据消息 ID 获取本地存储的指定消息。如果消息不存在会返回空值。 diff --git a/docs/document/unity/message_retrieve.md b/docs/document/unity/message_retrieve.md index 3c843b942..e3f9a4016 100644 --- a/docs/document/unity/message_retrieve.md +++ b/docs/document/unity/message_retrieve.md @@ -4,20 +4,12 @@ 环信即时通讯 IM 提供消息漫游功能,即将用户的所有会话的历史消息保存在消息服务器,用户在任何一个终端设备上都能获取到历史信息,使用户在多个设备切换使用的情况下也能保持一致的会话场景。本文介绍用户如何从消息服务器获取和删除会话和消息。 -:::tip -本文介绍的功能均为增值服务,需在[环信即时通讯 IM 管理后台](https://console.easemob.com/user/login)开通。 -::: - ## 实现原理 -使用环信即时通讯 IM SDK 可以通过 `IChatManager` 类的以下方法从服务器获取历史消息: +使用环信即时通讯 IM SDK 可以通过 `IChatManager` 类的以下方法从服务器获取和删除历史消息: -- `GetConversationsFromServerWithPage` 分页获取服务器保存的会话列表; -- `GetConversationsFromServerWithCursor` 分页获取服务器保存的置顶会话列表; -- `PinConversation` 置顶会话。 - `FetchHistoryMessagesFromServer` 获取服务器保存的指定会话中的消息; - `RemoveMessagesFromServer` 单向删除服务端的历史消息; -- `DeleteConversationFromServer` 删除服务端的会话及其历史消息。 ## 前提条件 @@ -28,93 +20,6 @@ ## 实现方法 -### 从服务器获取会话 - -对于单聊或群聊,用户发消息时,会自动将对方添加到用户的会话列表。 - -你可以调用 `GetConversationsFromServerWithCursor` 方法从服务端分页获取会话列表。通过设置该方法中的 `pinOnly` 参数确定是否只获取置顶会话列表: - -- 若 `pinOnly` 为 `false`,获取包括置顶和未置顶会话的列表。SDK 按照会话活跃时间(会话的最新一条消息的时间戳)的倒序返回会话列表,每个会话对象中包含会话 ID、会话类型、是否为置顶状态、置顶时间(对于未置顶的会话,值为 `0`)以及最新一条消息。从服务端拉取会话列表后会更新本地会话列表。服务器默认存储 100 条会话,可存储 7 天。若提升这两个上限,需联系环信商务。 -- 若为 `true` 仅获取置顶会话列表,最多可拉取 50 个置顶会话。SDK 按照会话置顶时间的倒序返回。 - -:::notice -1. 若使用该方法,需将 SDK 升级至 1.2.0。 -2. 建议你在首次下载、卸载后重装应用等本地数据库无数据情况下拉取服务端会话列表。其他情况下,调用 `LoadAllConversations` 方法获取本地所有会话即可。 -3. 通过 RESTful 接口发送的消息默认不创建或写入会话。若会话中的最新一条消息通过 RESTful 接口发送,获取会话列表时,该会话中的最新一条消息显示为通过非 RESTful 接口发送的最新消息。若要开通 RESTful 接口发送的消息写入会话列表的功能,需联系商务。 -::: - -```csharp -// limit: 每页返回的会话数。取值范围为 [1,50]。 -// cursor: 开始获取数据的游标位置。若获取数据时传 `null` 或者空字符串(""),SDK 从最新活跃的会话开始查询。 -int limit = 10; -string cursor = ""; -bool pinOnly = false; // `false`:获取所有会话;`true`仅获取置顶会话列表。 -SDKClient.Instance.ChatManager.GetConversationsFromServerWithCursor(pinOnly, cursor, limit, new ValueCallBack>( - onSuccess: (result) => - { - // 遍历获取到的会话列表 - foreach (var conv in result.Data) - { - - } - // 下一次请求的 cursor - string nextCursor = result.Cursor; - }, - onError: (code, desc) => - { - - } -)); - -``` - -若不支持 `GetConversationsFromServerWithCursor` 方法,你可以调用 `GetConversationsFromServerWithPage` 方法从服务端分页获取会话列表。利用该接口,你总共可获取服务器最近 7 天内存储的 100 个会话。若提升这两个上限,需联系环信商务。 - -若使用该功能,需将 SDK 升级至 V1.1.0。 - -```csharp -SDKClient.Instance.ChatManager.GetConversationsFromServerWithPage(pageNum, pageSize, new ValueCallBack>( - //获取会话成功后的处理逻辑。 - //list 为 List 类型。 - onSuccess: (list) => - { - }, - onError: (code, desc) => - { - } -)); -``` - -### 置顶会话 - -会话置顶指将单聊或群聊会话固定在会话列表的顶部,方便用户查找。例如,将重点会话置顶,可快速定位会话。 - -置顶状态会存储在服务器上,多设备登录情况下,更新置顶状态会同步到其他登录设备。你最多可以置顶 50 个会话。 - -你可以调用 `PinConversation` 方法设置是否置顶会话。多设备登录情况下,会话置顶或取消置顶后,其他登录设备分别会收到 `CONVERSATION_PINNED` 和 `CONVERSATION_UNPINNED` 事件。 - -:::notice -若使用该功能,需将 SDK 升级至 1.2.0。 -::: - -示例代码如下: - -```csharp -SDKClient.Instance.ChatManager.PinConversation(convId, isPinned, new CallBack( - onSuccess: () => - { - - }, - onError: (code, desc) => - { - - } -)); -``` - -你可以通过 `EMConversation` 对象的 `isPinned` 字段检查会话是否为置顶状态,或者调用 `getPinnedTime` 方法获取会话置顶时间。 - - ### 分页获取指定会话的历史消息 你可以调用 `FetchHistoryMessagesFromServer` 方法从服务器分页获取指定会话的历史消息,实现消息漫游。该功能需在[环信即时通讯 IM 管理后台](https://console.easemob.com/user/login)开通。 @@ -168,17 +73,3 @@ SDKClient.Instance.ChatManager.RemoveMessagesFromServer(convId, ctype, msgList, )); ``` -### 单向删除服务端会话及其历史消息 - -你可以调用 `DeleteConversationFromServer` 方法删除服务器端会话和历史消息。会话和消息删除后,当前用户无法从服务器获取该会话和消息,对本地的会话无影响,但会删除本地消息,而其他用户不受影响。 - -```csharp -SDKClient.Instance.ChatManager.DeleteConversationFromServer(conversationId, conversationType, isDeleteServerMessages, new CallBack( - onSuccess: () => - { - }, - onError: (code, desc) => - { - } -)); -``` \ No newline at end of file diff --git a/docs/document/web/conversation_delete.md b/docs/document/web/conversation_delete.md new file mode 100644 index 000000000..efb94910f --- /dev/null +++ b/docs/document/web/conversation_delete.md @@ -0,0 +1,43 @@ +# 删除会话 + + + +删除好友或退出群组后,SDK 不会自动删除对应的单聊或群聊会话。你可以调用相应的接口从服务器删除单个会话及其历史消息。 + +## 前提条件 + +开始前,请确保满足以下条件: + +- 完成 SDK 初始化,并连接到服务器,详见 [快速开始](quickstart.html)。 +- 了解环信即时通讯 IM API 的使用限制,详见 [使用限制](/product/limitation.html)。 + +## 技术原理 + +环信即时通讯 IM 支持从服务器删除单个会话及其历史消息,主要方法如下: + +`deleteConversation`:单向删除服务端的单个会话及其历史消息。 + +## 实现方法 + +### 单向删除服务器端会话及其对应的消息 + +你可以调用 `deleteConversation` 方法删除服务器端会话及其对应的消息。会话和消息删除后,当前用户无法从服务器获取该会话和消息,其他用户不受影响。 + +```javascript +let options = { + // 会话 ID:单聊为对方的用户 ID,群聊为群组 ID。 + channel: "channel", + // 会话类型:(默认) `singleChat`:单聊;`groupChat`:群聊。 + chatType: "singleChat", + // 删除会话时是否同时删除服务端漫游消息。 + deleteRoam: true, +}; +WebIM.conn + .deleteConversation(options) + .then((res) => { + console.log(res); + }) + .catch((e) => { + // 删除失败。 + }); +``` diff --git a/docs/document/web/conversation_list.md b/docs/document/web/conversation_list.md new file mode 100644 index 000000000..d17359e21 --- /dev/null +++ b/docs/document/web/conversation_list.md @@ -0,0 +1,58 @@ +# 会话列表 + + + +对于单聊和群组聊天会话,用户发消息时 SDK 会自动创建会话并将会话添加至用户的会话列表。 + +**环信服务器默认存储 100 条会话,可存储 7 天。若提升这两个上限,需联系环信商务。** 你可以获取会话列表。 + +## 前提条件 + +开始前,请确保满足以下条件: + +- 完成 SDK 初始化,并连接到服务器,详见 [快速开始](quickstart.html)。 +- 了解环信即时通讯 IM API 的使用限制,详见 [使用限制](/product/limitation.html)。 + +## 技术原理 + +环信即时通讯 IM 支持从服务器获取会话列表,主要方法如下: + +`getServerConversations`:从服务器分页获取会话列表。 + +## 实现方法 + +### 从服务器分页获取会话列表 + +你可以调用 `getServerConversations` 方法从服务端分页获取会话列表,包含单聊和群组聊天会话,不包含聊天室会话。SDK 按照会话活跃时间(会话的最新一条消息的时间戳)的倒序返回会话列表。 + +:::tip +1. **若使用该功能,需在环信控制台开通,并将 SDK 升级至 4.1.7 或以上版本。而且,只有开通该功能,你才能使用置顶会话和会话标记功能。** +2. 登录用户的 ID 大小写混用会导致拉取会话列表时提示会话列表为空,因此建议用户 ID 使用小写字母。 +3. 服务端会话列表的更新存在延时,建议你仅在登录时调用该方法。 +4. 通过 RESTful 接口发送的消息默认不创建或写入会话。若会话中的最新一条消息通过 RESTful 接口发送,获取会话列表时,该会话中的最新一条消息显示为通过非 RESTful 接口发送的最新消息。若要开通 RESTful 接口发送的消息写入会话列表的功能,需联系商务。 +::: + +示例代码如下: + +```javascript +// pageSize: 每页期望获取的会话数量。取值范围为 [1,50],默认为 `20`。 +// cursor:开始获取数据的游标位置。若传空字符串(''),SDK 从最新活跃的会话开始获取。 +connection.getServerConversations({pageSize:50, cursor: ''}).then((res)=>{ + console.log(res) +}) +``` +该方法的返回数据包含 `conversations` 和 `cursor` 参数: + +- conversations: 会话列表。`conversations` 为 `ConversationItem[]` 类型,`ConversationItem` 包含如下属性: + +| 属性名称 | 描述 | +| :--------- | :----- | +| `conversationId` | 会话 ID。 | +| `conversationType` | 会话类型。| +| `isPinned` | 是否置顶:
- `true`:置顶;
- `false`:不置顶。 | +| `pinnedTime`| 会话置顶的 UNIX 时间戳,单位为毫秒。未置顶时值为 `0` | +| `lastMessage` | 最新一条消息概况。 | +| `unReadCount` | 未读消息数。 | +| `marks` | 会话标记。| + +- cursor: 下次查询数据的游标位置。若 SDK 返回的数据条数小于请求中设置的数目,`cursor` 的值为空字符串(''),表示当前为最后一页数据。否则,SDK 返回具体的游标位置,指定开始获取数据的位置。 \ No newline at end of file diff --git a/docs/document/web/message_manage.md b/docs/document/web/conversation_local.md similarity index 76% rename from docs/document/web/message_manage.md rename to docs/document/web/conversation_local.md index bddf6b89a..5c56b0c5e 100644 --- a/docs/document/web/message_manage.md +++ b/docs/document/web/conversation_local.md @@ -30,13 +30,12 @@ miniCore.open({ 环信即时通讯 IM SDK 支持你通过调用 API 在项目中实现如下功能: -- 获取本地会话列表; -- 获取单个本地会话; -- 设置会话自定义字段; -- 从服务器拉取历史消息; -- 对会话的未读消息数清零; -- 删除单个本地会话; -- 同步服务端会话列表到本地数据库。 +- `getLocalConversations`:获取本地会话列表; +- `getLocalConversation`:获取单个本地会话; +- `setLocalConversationCustomField`:设置会话自定义字段; +- `clearConversationUnreadCount`:对会话的未读消息数清零; +- `removeLocalConversation`:删除单个本地会话; +- `getServerConversations`:同步服务端会话列表到本地数据库。 ## 前提条件 @@ -121,27 +120,6 @@ miniCore.localCache.setLocalConversationCustomField(options).then(()=>{ }) ``` -### 从服务器获取历史消息 - -你可以调用 `getHistoryMessages` 方法基于 `searchOptions` 参数对象允许用户按消息发送方、消息类型或时间段从服务器分页拉取单聊和群组聊天的历史消息。 - -对于群组聊天,你可以通过设置 `searchOptions` 对象中的 `from` 参数拉取群组中单个成员发送的历史消息。 - -```javascript -connection.getHistoryMessages({ - targetId: 'targetId', // 单聊为对端用户 ID,群组聊天为群组 ID。 - chatType: 'groupChat', // 会话类型:单聊和群组聊天分别为 `singleChat` 和 `groupChat`。 - pageSize: 20, // 每次获取的消息数量,取值范围为 [1,50],默认值为 `20`。 - searchDirection: 'down', // 消息搜索方向。`up` 表示按消息时间戳递减的方向获取,即先获取最新消息;`down` 表示按消息时间戳递增的方向获取,即先获取最老的消息。 - searchOptions: { - from: 'message sender userID', // 消息发送方的用户 ID。该参数仅用于群组聊天。 - msgTypes: ['txt'], // 要获取的消息类型的数组。若不传值,会获取所有类型的消息。 - startTime: new Date('2023,11,9').getTime(), // 查询的起始时间戳,单位为毫秒。 - endTime: new Date('2023,11,10').getTime(), // 查询的结束时间戳,单位为毫秒。 - }, -}); -``` - ### 对会话的未读消息数清零 你可以调用 `clearConversationUnreadCount` 方法对单个本地会话的未读消息数清零。示例代码如下: diff --git a/docs/document/web/conversation_mark.md b/docs/document/web/conversation_mark.md index 8d319b6b6..b5ca39ff8 100644 --- a/docs/document/web/conversation_mark.md +++ b/docs/document/web/conversation_mark.md @@ -6,7 +6,7 @@ 如果要使用会话标记功能,你需要确保开通了[会话列表服务](conversation_list.html#从服务器分页获取会话列表)并将 SDK 版本升级至 4.4.0 或以上版本。 -你需要自行维护会话标记与具体业务含义(比如 `MarkType.mark_0`[这里面扔一个连接,跳转到API REFERENCE MarkType] 为待处理会话)之间的映射。 +你需要自行维护会话标记与具体业务含义之间的映射,例如 [`MarkType.mark_0`](https://docs-im-beta.easemob.com/jsdoc/enums/Types.ContactType.MarkType.html)表示待处理会话。 ```javascript const MarkMap = new Map(); diff --git a/docs/document/web/conversation_overview.md b/docs/document/web/conversation_overview.md new file mode 100644 index 000000000..de9b311a9 --- /dev/null +++ b/docs/document/web/conversation_overview.md @@ -0,0 +1,48 @@ + +# 会话介绍 + + + +会话包含单聊会话、群聊会话。用户可与在会话中发送消息、查看或清空历史消息等操作。 + +环信即时通讯 IM SDK 提供会话相关 API,如获取会话列表、置顶会话、添加会话标记、删除会话等。 + +## 会话 API + +环信即时通讯 IM 提供如下会话方法: + +| 方法 | 描述 | +| :--------- | :------- | +| getServerConversations | 分页获取服务器会话列表。 | +| pinConversation | 设置是否置顶会话。 | +| getServerPinnedConversations | 分页获取服务器端的置顶会话列表。 | +| deleteConversation | 删除会话。 | +| getLocalConversations | 获取本地会话列表。 | +| getLocalConversation | 获取单个本地会话。 | +| removeLocalConversation | 删除单个本地会话。 | +| setLocalConversationCustomField | 设置本地会话自定义字段。 | +| clearConversationUnreadCount | 对本地会话的未读消息数清零。 | + +## 会话事件 + +SDK 提供了会话已读事件 `onChannelMessage`,用户可以通过该事件,更新会话未读状态。 + +示例代码如下: + +```javascript +conn.addEventHandler("handlerId", { + onChannelMessage: (message) => { + // 收到会话已读的事件。该事件在以下场景中触发: + // 1. 当消息接收方调用 `send` 方法发送 `channel` 类型消息。SDK 会触发此回调。 + // 2. 多端多设备登录时,若一端发送会话已读回执(`send` 方法发送`channel`类型消息),服务器端会将该会话的未读消息数置为 0,同时其他端会触发此回调。 + console.log("收到会话已读回执消息", message.from, message.to); + }, +}); + +``` + + + + + + diff --git a/docs/document/web/conversation_pin.md b/docs/document/web/conversation_pin.md new file mode 100644 index 000000000..9c66297cc --- /dev/null +++ b/docs/document/web/conversation_pin.md @@ -0,0 +1,57 @@ +# 会话置顶 + + + +会话置顶指将单聊或群聊会话固定在会话列表的顶部,方便用户查找。例如,将重点会话置顶,可快速定位会话。 + +## 前提条件 + +开始前,请确保满足以下条件: + +- 完成 SDK 初始化,并连接到服务器,详见 [快速开始](quickstart.html)。 +- 了解环信即时通讯 IM API 的使用限制,详见 [使用限制](/product/limitation.html)。 +- **[开通服务端会话列表功能](conversation_list#从服务器分页获取会话列表)**。 + +## 技术原理 + +环信即时通讯 IM 支持会话置顶,主要方法如下: + +- `pinConversation`:置顶会话。 +- `getServerPinnedConversations`:获取服务端置顶会话列表。 + +## 实现方法 + +### 置顶会话 + +你可以调用 `pinConversation` 方法设置是否置顶会话。置顶状态会存储在服务器上,多设备登录情况下,更新的置顶状态会同步到其他登录设备,其他登录设备会收到 `onMultiDeviceEvent` 事件,事件名分别为 `pinnedConversation` 和 `unpinnedConversation` 事件。 + +你最多可以置顶 50 个会话。 + +:::tip +若使用该功能,需将 SDK 升级至 4.1.7 或以上版本。 +::: + +示例代码如下: + +```javascript +connection.pinConversation({conversationId:'conversationId', conversationType: 'singleChat', isPinned: true}) +``` + +### 获取服务端的置顶会话列表 + +你可以调用 `getServerPinnedConversations` 方法从服务端分页获取置顶会话列表。SDK 按照会话置顶时间的倒序返回。 + +你最多可以拉取 50 个置顶会话。 + +:::notice +若使用该功能,需将 SDK 升级至 4.1.7 或以上版本。 +::: + +示例代码如下,返回数据类型参见[从服务器分页获取会话列表](conversation_list#从服务器分页获取会话列表)。 + +```javascript +// pageSize: 每页返回的会话数。取值范围为 [1,50]。 +// cursor:开始获取数据的游标位置。若传空字符串(''),SDK 从最新置顶的会话开始查询。 +connection.getServerPinnedConversations({pageSize:50, cursor: ''}) +``` + diff --git a/docs/document/web/message_retrieve.md b/docs/document/web/message_retrieve.md index c65322d33..ba7757bc2 100644 --- a/docs/document/web/message_retrieve.md +++ b/docs/document/web/message_retrieve.md @@ -1,24 +1,15 @@ -# 管理服务端的会话和消息 +# 管理服务端消息 -环信即时通讯 IM 提供消息漫游功能,即将用户的所有会话的历史消息保存在消息服务器,用户在任何一个终端设备上都能获取到历史信息,使用户在多个设备切换使用的情况下也能保持一致的会话场景。本文介绍如何实现用户从消息服务器获取会话和消息。 - -:::tip -本文介绍的功能均为增值服务,需在[环信即时通讯 IM 管理后台](https://console.easemob.com/user/login)开通。 - -::: +环信即时通讯 IM 提供消息漫游功能,即将用户的所有会话的历史消息保存在消息服务器,用户在任何一个终端设备上都能获取到历史信息,使用户在多个设备切换使用的情况下也能保持一致的会话场景。本文介绍如何实现从消息服务器获取和删除消息。 ## 技术原理 -利用环信即时通讯 IM SDK 可从服务器获取会话和历史消息。 +利用环信即时通讯 IM SDK 可从服务器获取和删除历史消息,主要方法如下: -- `getServerConversations` 分页获取会话列表以及会话中的最新一条消息; -- `getServerPinnedConversations` 获取服务端的置顶会话列表; -- `pinConversation` 设置是否置顶会话; -- `getHistoryMessages` 按服务器接收消息的时间顺序获取服务器上保存的指定会话中的消息; -- `removeHistoryMessages` 单向删除服务端的历史消息; -- `deleteConversation` 删除服务器端会话及其对应的消息。 +- `getHistoryMessages`:基于 `searchOptions` 参数对象从服务器获取指定会话的历史消息。 +- `removeHistoryMessages`:单向删除服务端的历史消息。 ## 前提条件 @@ -26,89 +17,33 @@ ## 实现方法 -### 从服务器分页获取会话列表 - -对于单聊或群聊,用户发消息时,会自动将对方添加到用户的会话列表。 - -你可以调用 `getServerConversations` 方法从服务端分页获取会话列表。SDK 按照会话活跃时间(会话的最新一条消息的时间戳)的倒序返回会话列表。服务器默认存储 100 条会话,可存储 7 天。若提升这两个上限,需联系环信商务。 - -:::notice -1. 若使用该功能,需将 SDK 升级至 4.1.7 或以上版本。 -2. 登录用户的 ID 大小写混用会导致拉取会话列表时提示会话列表为空,因此建议用户 ID 使用小写字母。 -3. 服务端会话列表的更新存在延时,建议你仅在登录时调用该方法。 -4. 通过 RESTful 接口发送的消息默认不创建或写入会话。若会话中的最新一条消息通过 RESTful 接口发送,获取会话列表时,该会话中的最新一条消息显示为通过非 RESTful 接口发送的最新消息。若要开通 RESTful 接口发送的消息写入会话列表的功能,需联系商务。 -::: - -示例代码如下: - -```javascript -// pageSize: 每页期望获取的会话数量。取值范围为 [1,50],默认为 `20`。 -// cursor:开始获取数据的游标位置。若传空字符串(''),SDK从最新活跃的会话开始获取。 -connection.getServerConversations({pageSize:50, cursor: ''}).then((res)=>{ - console.log(res) -}) -``` -该方法的返回数据包含 `conversations` 和 `cursor` 参数: - -- conversations: 会话列表。`conversations` 为 `ConversationItem[]` 类型,`ConversationItem` 包含如下属性: - -| 属性名称 | 描述 | -| :--------- | :----- | -| `conversationId` | 会话 ID。 | -| `conversationType`| 会话类型。| -| `isPinned` | 是否置顶:
- `true`:置顶;
- `false`:不置顶。 | -| `pinnedTime`| 会话置顶的 UNIX 时间戳,单位为毫秒。未置顶时值为 `0` | -| `lastMessage` | 最新一条消息概况。 | -| `unReadCount` | 未读消息数。 | - -- cursor: 下次查询数据的游标位置。若 SDK 返回的数据条数小于请求中设置的数目,`cursor` 的值为空字符串(''),表示当前为最后一页数据。否则,SDK 返回具体的游标位置,指定开始获取数据的位置。 - -### 获取服务端的置顶会话列表 - -你可以调用 `getServerPinnedConversations` 方法从服务端分页获取置顶会话列表。SDK 按照会话置顶时间的倒序返回。 - -你最多可以拉取 50 个置顶会话。 - -:::notice -若使用该功能,需将 SDK 升级至 4.1.7 或以上版本。 -::: - -示例代码如下,返回数据类型参见getServerConversations: - -```javascript -// pageSize: 每页返回的会话数。取值范围为 [1,50]。 -// cursor:开始获取数据的游标位置。若传空字符串(''),SDK 从最新置顶的会话开始查询。 -connection.getServerPinnedConversations({pageSize:50, cursor: ''}) -``` - -该方法的返回数据与[获取服务端的会话列表](#从服务器分页获取会话列表)相同。 - -### 置顶会话 - -会话置顶指将单聊或群聊会话固定在会话列表的顶部,方便用户查找。例如,将重点会话置顶,可快速定位会话。 +### 从服务器获取指定会话的历史消息 -置顶状态会存储在服务器上,多设备登录情况下,更新置顶状态会同步到其他登录设备。你最多可以置顶 50 个会话。 +你可以调用 `getHistoryMessages` 方法基于 `searchOptions` 参数对象允许用户按消息发送方、消息类型或时间段从服务器分页拉取单聊和群组聊天的历史消息。为确保数据可靠,我们建议你每次最多获取 50 条消息,可多次获取。 -你可以调用 `pinConversation` 方法设置是否置顶会话。多设备登录情况下,会话置顶或取消置顶后,其他登录设备会收到 `onMultiDeviceEvent` 事件,事件名分别为 `pinnedConversation` 和 `unpinnedConversation` 事件。 +对于群组聊天,你可以通过设置 `searchOptions` 对象中的 `from` 参数拉取群组中单个成员发送的历史消息。 -:::notice -若使用该功能,需将 SDK 升级至 4.1.7 或以上版本。 +:::tip +1. 历史消息和离线消息在服务器上的存储时间与你订阅的套餐包有关,详见[产品价格](/product/pricing.html#套餐包功能详情)。 +2. 各类事件通知发送时,若接收的用户离线时,事件通知的存储时间与离线消息的存储时间一致,即也取决于你订阅的套餐包。 ::: -示例代码如下: - ```javascript -connection.pinConversation({conversationId:'conversationId', conversationType: 'singleChat', isPinned: true}) +connection.getHistoryMessages({ + targetId: 'targetId', // 单聊为对端用户 ID,群组聊天为群组 ID。 + chatType: 'groupChat', // 会话类型:单聊和群组聊天分别为 `singleChat` 和 `groupChat`。 + pageSize: 20, // 每次获取的消息数量,取值范围为 [1,50],默认值为 `20`。 + searchDirection: 'down', // 消息搜索方向。`up` 表示按消息时间戳递减的方向获取,即先获取最新消息;`down` 表示按消息时间戳递增的方向获取,即先获取最老的消息。 + searchOptions: { + from: 'message sender userID', // 消息发送方的用户 ID。该参数仅用于群组聊天。 + msgTypes: ['txt'], // 要获取的消息类型的数组。若不传值,会获取所有类型的消息。 + startTime: new Date('2023,11,9').getTime(), // 查询的起始时间戳,单位为毫秒。 + endTime: new Date('2023,11,10').getTime(), // 查询的结束时间戳,单位为毫秒。 + }, +}); ``` -### 从服务器获取指定会话的历史消息 - -你可以调用 `getHistoryMessages` 方法从服务器获取指定会话的消息(消息漫游)。你可以指定消息查询方向,即明确按时间顺序或逆序获取。为确保数据可靠,我们建议你每次最多获取 50 条消息,可多次获取。拉取后,SDK 会自动将消息更新到本地数据库。 - -:::notice -1. 历史消息和离线消息在服务器上的存储时间与你订阅的套餐包有关,详见[产品价格](/product/pricing.html#套餐包功能详情)。 -2. 各类事件通知发送时,若接收的用户离线时,事件通知的存储时间与离线消息的存储时间一致,即也取决于你订阅的套餐包。 -::: +同时,你可以调用 `getHistoryMessages` 方法从服务器获取指定会话的历史消息。你可以指定消息查询方向,即明确按时间顺序或逆序获取。 ```javascript let options = { @@ -152,26 +87,4 @@ connection.removeHistoryMessages({targetId: 'userId', chatType: 'singleChat', be connection.removeHistoryMessages({targetId: 'userId', chatType: 'singleChat', messageIds: ['messageId']}) ``` -### 删除服务器端会话及其对应的消息 -你可以调用 `deleteConversation` 方法删除服务器端会话及其对应的消息。会话和消息删除后,当前用户无法从服务器获取该会话和消息,其他用户不受影响。 - -```javascript - -let options = { - // 会话 ID:单聊为对方的用户 ID,群聊为群组 ID。 - channel: "channel", - // 会话类型:(默认) `singleChat`:单聊;`groupChat`:群聊。 - chatType: "singleChat", - // 删除会话时是否同时删除服务端漫游消息。 - deleteRoam: true, -}; -WebIM.conn - .deleteConversation(options) - .then((res) => { - console.log(res); - }) - .catch((e) => { - // 删除失败。 - }); -``` diff --git a/docs/document/windows/conversation_delete.md b/docs/document/windows/conversation_delete.md new file mode 100644 index 000000000..226dc7e4b --- /dev/null +++ b/docs/document/windows/conversation_delete.md @@ -0,0 +1,52 @@ +# 删除会话 + + + +删除好友或退出群组后,SDK 不会自动删除对应的单聊或群聊会话。你可以调用相应的接口从服务器和本地删除单个会话及其历史消息。 + +## 前提条件 + +开始前,请确保满足以下条件: + +- 完成 SDK 初始化,并连接到服务器,详见 [快速开始](quickstart.html)。 +- 了解环信即时通讯 IM API 的使用限制,详见 [使用限制](/product/limitation.html)。 + +## 技术原理 + +环信即时通讯 IM 支持从服务器和本地删除单个会话及其历史消息,主要方法如下: + +- `DeleteConversationFromServer`:单向删除服务端的单个会话及其历史消息。 +- `DeleteConversation`:删除本地单个会话及其历史消息。 + +## 实现方法 + +### 单向删除服务端会话及其历史消息 + +你可以调用 `DeleteConversationFromServer` 方法删除服务器端会话和历史消息。会话和消息删除后,当前用户无法从服务器获取该会话和消息,对本地的会话无影响,但会删除本地消息,而其他用户不受影响。 + +```csharp +SDKClient.Instance.ChatManager.DeleteConversationFromServer(conversationId, conversationType, isDeleteServerMessages, new CallBack( + onSuccess: () => + { + }, + onError: (code, desc) => + { + } +)); +``` + +### 删除本地会话及历史消息 + +- 你可以调用 `DeleteConversation` 方法删除本地会话及其聊天消息: + +```csharp +//如需保留历史消息,传 `false`。 +SDKClient.Instance.ChatManager.DeleteConversation(conversationId, true); +``` + +- 你可以调用 `DeleteMessage` 方法删除指定会话中指定的一条历史消息。 + +```csharp +Conversation conv = SDKClient.Instance.ChatManager.GetConversation(conversationId, convType); +conv.DeleteMessage(msgId); +``` diff --git a/docs/document/windows/conversation_list.md b/docs/document/windows/conversation_list.md new file mode 100644 index 000000000..db8603056 --- /dev/null +++ b/docs/document/windows/conversation_list.md @@ -0,0 +1,90 @@ +# 会话列表 + + + +对于单聊、群组聊天和聊天室会话,用户发消息时 SDK 会自动创建会话并将会话添加至用户的会话列表。 + +环信服务器和本地均存储会话,你可以获取会话列表。**服务器默认存储 100 条会话,可存储 7 天。若提升这两个上限,需联系环信商务。** + +## 前提条件 + +开始前,请确保满足以下条件: + +- 完成 SDK 初始化,并连接到服务器,详见 [快速开始](quickstart.html)。 +- 了解环信即时通讯 IM API 的使用限制,详见 [使用限制](/product/limitation.html)。 + +## 技术原理 + +环信即时通讯 IM 支持从服务器和本地获取会话列表,主要方法如下: + +- `IChatManager#GetConversationsFromServerWithCursor`:从服务器获取会话列表。 +- `IChatManager#LoadAllConversations`:获取本地所有会话。 + +## 实现方法 + +### 从服务器分页获取会话列表 + +你可以调用 `GetConversationsFromServerWithCursor` 方法从服务端分页获取会话列表,包含单聊和群组聊天会话,不包含聊天室会话。通过设置该方法中的 `pinOnly` 参数确定是否只获取置顶会话列表: + +- 若 `pinOnly` 为 `false`,获取包括置顶和未置顶会话的列表。SDK 按照会话活跃时间(会话的最新一条消息的时间戳)的倒序返回会话列表,每个会话对象中包含会话 ID、会话类型、是否为置顶状态、置顶时间(对于未置顶的会话,值为 `0`)以及最新一条消息。从服务端拉取会话列表后会更新本地会话列表。 +- 若为 `true` 仅获取置顶会话列表,最多可拉取 50 个置顶会话。SDK 按照会话置顶时间的倒序返回。 + +:::tip +1. 若使用该方法,需将 SDK 升级至 1.2.0。 +2. 建议你在首次下载、卸载后重装应用等本地数据库无数据情况下拉取服务端会话列表。其他情况下,调用 `LoadAllConversations` 方法获取本地所有会话即可。 +3. 通过 RESTful 接口发送的消息默认不创建或写入会话。若会话中的最新一条消息通过 RESTful 接口发送,获取会话列表时,该会话中的最新一条消息显示为通过非 RESTful 接口发送的最新消息。若要开通 RESTful 接口发送的消息写入会话列表的功能,需联系商务。 +::: + +```csharp +// limit: 每页返回的会话数。取值范围为 [1,50]。 +// cursor: 开始获取数据的游标位置。若获取数据时传 `null` 或者空字符串(""),SDK 从最新活跃的会话开始查询。 +int limit = 10; +string cursor = ""; +bool pinOnly = false; // `false`:获取所有会话;`true`仅获取置顶会话列表。 +SDKClient.Instance.ChatManager.GetConversationsFromServerWithCursor(pinOnly, cursor, limit, new ValueCallBack>( + onSuccess: (result) => + { + // 遍历获取到的会话列表 + foreach (var conv in result.Data) + { + + } + // 下一次请求的 cursor + string nextCursor = result.Cursor; + }, + onError: (code, desc) => + { + + } +)); + +``` + +若不支持 `GetConversationsFromServerWithCursor` 方法,你可以调用 `GetConversationsFromServerWithPage` 方法从服务端分页获取会话列表。利用该接口,你总共可获取服务器最近 7 天内存储的 100 个会话。若提升这两个上限,需联系环信商务。 + +若使用该功能,需将 SDK 升级至 V1.1.0。 + +```csharp +SDKClient.Instance.ChatManager.GetConversationsFromServerWithPage(pageNum, pageSize, new ValueCallBack>( + //获取会话成功后的处理逻辑。 + //list 为 List 类型。 + onSuccess: (list) => + { + }, + onError: (code, desc) => + { + } +)); +``` + +### 获取本地所有会话 + +你可以调用 `LoadAllConversations` 方法根据会话 ID 和会话类型获取本地所有会话。SDK 从内存中获取会话,若未从本地数据库中加载过,会先从数据库加载到内存中。获取会话后,SDK 按照会话活跃时间(最新一条消息的时间戳)的倒序返回会话,置顶会话在前,非置顶会话在后,会话列表为 `List` 结构。 + +本地会话列表包含单聊和群组聊天会话,至于是否包含聊天室会话,取决于在 SDK 初始化时 `Options#DeleteMessagesAsExitRoom` 参数的设置。若设置为 `true`,即离开聊天室时删除该聊天室的所有本地消息,则本地会话列表中不包含聊天室会话。若设置为 `false`,即保留该聊天室的所有本地消息,则本地会话列表中包含聊天室会话。 + +示例代码如下: + +```csharp +Listlist = SDKClient.Instance.ChatManager.LoadAllConversations(); +``` \ No newline at end of file diff --git a/docs/document/windows/conversation_overview.md b/docs/document/windows/conversation_overview.md new file mode 100644 index 000000000..fa1477f36 --- /dev/null +++ b/docs/document/windows/conversation_overview.md @@ -0,0 +1,68 @@ +# 会话介绍 + + + +会话是一个单聊、群聊或者聊天室所有消息的集合。用户需在会话中发送消息、查看或清空历史消息等操作。 + +环信即时通讯 IM SDK 提供 `IChatManager` 和 `Conversation` 类以会话为单位对消息数据进行管理,如获取会话列表、置顶会话、添加会话标记、删除会话和管理未读消息等。 + +## 会话类 + +环信即时通讯 IM 提供会话类 `Conversation`。该类定义了以下内容: + +| 类/方法 | 描述 | +| :--------- | :------- | +| Id | 会话 ID,取决于会话类型。
- 单聊:会话 ID 为对方的用户 ID;
- 群聊:会话 ID 为群组 ID;
- 聊天室:会话 ID 为聊天室的 ID。 | +| Type | 会话类型。
- `Chat`:单聊会话;
- `Group`:群聊会话;
- `Room`:聊天室会话。
- `HelpDesk`:客服会话。 | +| IsThread | 判断该会话是否为子区会话。 | +| IsPinned | 判断该会话是否被置顶。 | +| PinnedTime | 会话置顶时间戳(毫秒)。如果 `IsPinned` 为 `false`,将返回 `0`。 | +| LastMessage | 获取指定会话的最新消息。该方法的调用不影响会话的未读消息数。 SDK 首先从内存中获取最新消息,若在内存中未找到,则从数据库中加载,然后将其存放在内存中。 | +| LastReceivedMessage | 获取指定会话中收到的最新消息。 | +| Ext | 获取指定会话的扩展信息。 | +| UnReadCount | 获取指定会话的未读消息数。 | +| MarkMessageAsRead | 设置指定消息为已读。 | +| MarkAllMessageAsRead | 将指定会话的所有未读消息设置为已读。 | +| InsertMessage | 在本地数据库的指定会话中插入一条消息。 | +| AppendMessage | 在本地数据库中指定会话的尾部插入一条消息。 | +| UpdateMessage | 更新本地数据库的指定消息。 | +| DeleteMessage | 删除本地数据库中的一条指定消息。 | +| DeleteMessages | 删除本地数据库中指定时间段的消息。 | +| DeleteAllMessages | 删除指定会话中所有消息。 | +| LoadMessage | 加载指定消息。SDK 首先在内存中查找消息,若在内存中未找到,SDK 会在本地数据库查询并加载。 | +| LoadMessagesWithMsgType | 加载特定类型的多条消息。SDK 首先在内存中查询消息,若在内存中未找到,SDK 会在本地数据库查询并加载。 | +| LoadMessages | 从指定消息 ID 开始加载消息。 | +| LoadMessagesWithKeyword | 根据关键字加载消息。SDK 首先在内存中查找消息,若在内存中未找到,SDK 会在本地数据库查询并加载。 | +| LoadMessagesWithTime | 加载指定时间段内的消息。 | +| MessagesCount | 获取 SDK 本地数据库中会话的全部消息数目。 | + + +## 会话事件 + +`IChatManagerDelegate` 中提供会话事件的监听接口。开发者可以通过设置此监听,获取会话事件,并做出相应处理。如果不再使用该监听,需要移除。 + +示例代码如下: + +```csharp +public class ChatManagerDelegate : IChatManagerDelegate { + // 收到会话已读回调 + public void OnConversationRead(string from, string to) + { + + } +} + +// 注册会话监听回调。 +ChatManagerDelegate adelegate = new ChatManagerDelegate(); +SDKClient.Instance.ChatManager.AddChatManagerDelegate(adelegate); + +// 移除会话监听回调。 +SDKClient.Instance.ChatManager.RemoveChatManagerDelegate(adelegate); + +``` + + + + + + diff --git a/docs/document/windows/conversation_pin.md b/docs/document/windows/conversation_pin.md new file mode 100644 index 000000000..502814934 --- /dev/null +++ b/docs/document/windows/conversation_pin.md @@ -0,0 +1,58 @@ +# 会话置顶 + + + +会话置顶指将单聊或群聊会话固定在会话列表的顶部,方便用户查找。例如,将重点会话置顶,可快速定位会话。 + +## 前提条件 + +开始前,请确保满足以下条件: + +- 完成 SDK 初始化,并连接到服务器,详见 [快速开始](quickstart.html)。 +- 了解环信即时通讯 IM API 的使用限制,详见 [使用限制](/product/limitation.html)。 +- **[开通服务端会话列表功能](conversation_list#从服务器分页获取会话列表)**。 + +## 技术原理 + +环信即时通讯 IM 支持会话置顶,主要方法如下: + +- `IChatManager#PinConversation`:置顶会话。 +- `IChatManager#GetConversationsFromServerWithCursor`:获取服务端置顶会话列表。 + +## 实现方法 + +### 置顶会话 + +你可以调用 `PinConversation` 方法设置是否置顶会话。置顶状态会存储在服务器上,多设备登录情况下,更新的置顶状态会同步到其他登录设备,其他登录设备分别会收到 `CONVERSATION_PINNED` 和 `CONVERSATION_UNPINNED` 事件。 + +你最多可以置顶 50 个会话。 + +:::tip +若使用该功能,需将 SDK 升级至 1.2.0。 +::: + +示例代码如下: + +```csharp +SDKClient.Instance.ChatManager.PinConversation(convId, isPinned, new CallBack( + onSuccess: () => + { + + }, + onError: (code, desc) => + { + + } +)); +``` + +你可以通过 `EMConversation` 对象的 `isPinned` 字段检查会话是否为置顶状态,或者调用 `getPinnedTime` 方法获取会话置顶时间。 + +### 获取服务端的置顶会话列表 + +你可以调用 `GetConversationsFromServerWithCursor` 方法从服务端分页获取置顶会话列表。如果将该方法中的 pinOnly 参数设置为 `true` 则只获取置顶会话列表。该接口详情,请参考[从服务器分页获取会话列表](conversation_list#从服务器分页获取会话列表)。 + +你最多可以拉取 50 个置顶会话。 + + + diff --git a/docs/document/windows/conversation_unread.md b/docs/document/windows/conversation_unread.md new file mode 100644 index 000000000..ed1f3a670 --- /dev/null +++ b/docs/document/windows/conversation_unread.md @@ -0,0 +1,68 @@ +## 会话未读数 + + + +你可以查看本地所有会话或指定会话的未读消息数,并针对会话的未读消息数清零。 + +## 前提条件 + +开始前,请确保满足以下条件: + +- 完成 SDK 初始化并连接到服务器,详见 [快速开始](quickstart.html)。 +- 了解环信即时通讯 IM API 的使用限制,详见 [使用限制](/product/limitation.html)。 + +## 技术原理 + +环信即时通讯 IM SDK 通过 `IChatManager` 和 `Conversation` 类实现对本地会话的未读消息数的管理,其中核心方法如下: + +- `IChatManager#GetUnreadMessageCount`:获取本地所有会话的未读消息数。 +- `Conversation#UnReadCount`:获取本地指定会话的未读消息数。 +- `IChatManager#MarkAllConversationsAsRead`:将本地所有会话的未读消息数清零。 +- `IChatManager#MarkAllMessageAsRead`:对于本地指定会话的未读消息数清零。 +- `IChatManager#MarkMessageAsRead`:将指定会话的单条未读消息置为已读。 + +## 实现方法 + +### 获取所有会话的未读消息数 + +你可以调用 `GetUnreadMessageCount` 方法获取本地所有会话的未读消息数量,示例代码如下: + +```csharp +SDKClient.Instance.ChatManager.GetUnreadMessageCount(); +``` + +### 获取指定会话的未读消息数 + +你可以调用 `UnReadCount` 方法获取本地指定会话的未读消息数,示例代码如下: + +```csharp +Conversation conv = SDKClient.Instance.ChatManager.GetConversation(conversationId, convType); +int unread = conv.UnReadCount; +``` + +### 将所有会话的未读消息数清零 + +你可以调用 `MarkAllConversationsAsRead` 方法将本地所有会话的未读消息数清零,示例代码如下: + +```csharp +Conversation conv = SDKClient.Instance.ChatManager.GetConversation(conversationId, convType); +SDKClient.Instance.ChatManager.MarkAllConversationsAsRead(); +``` + +### 指定会话的未读消息数清零 + +你可以调用 `MarkAllMessageAsRead` 方法对指定会话的未读消息数清零,示例代码如下: + +```csharp +Conversation conv = SDKClient.Instance.ChatManager.GetConversation(conversationId, convType); +conv.MarkAllMessageAsRead(); +``` + +### 将指定会话的单条未读消息置为已读 + +你可以调用 `markMessageAsRead` 方法将指定会话的单条未读消息置为已读。 + +```csharp +Conversation conv = SDKClient.Instance.ChatManager.GetConversation(conversationId, convType); +conv.MarkMessageAsRead(msgId); +``` diff --git a/docs/document/windows/message_manage.md b/docs/document/windows/message_manage.md index 5595e77c9..493efcbcb 100644 --- a/docs/document/windows/message_manage.md +++ b/docs/document/windows/message_manage.md @@ -1,29 +1,21 @@ -# 管理本地会话和消息 +# 管理本地会话和消息 -本文介绍即时通讯 IM SDK 如何管理本地会话和消息。 - -除了发送和接收消息外,环信即时通讯 IM SDK 还支持以会话为单位对本地的消息数据进行管理,如获取与管理未读消息、搜索和删除历史消息等。其中,会话是一个单聊、群聊或者聊天室所有消息的集合。用户需在会话中发送消息以及查看或清空历史消息。 - -本文介绍如何使用环信即时通讯 IM SDK 在 app 中实现这些功能。 +本文介绍即时通讯 IM SDK 如何实现管理本地消息,例如获取消息、搜索消息、导入消息、插入消息、更新消息以及统计消息流量等。 ## 技术原理 SQLCipher 用于加密存储本地消息的数据库。即时通讯 IM SDK 使用 `IChatManager` 和 `Conversation` 管理本地消息。以下是核心方法: -- `IChatManager.LoadAllConversations` 获取本地所有会话; -- `Conversation.LoadMessages` 读取指定会话的消息; -- `Conversation.UnReadCount` 获取指定会话的未读消息数; -- `IChatManager.GetUnreadMessageCount` 获取所有会话的未读消息数; -- `IChatManager.MarkAllConversationsAsRead` 指定会话的未读消息数清零; -- `IChatManager.DeleteConversation` 删除本地会话及历史消息; -- `IChatManager.DeleteConversationFromServer` 删除服务端的会话及历史消息; -- `IChatManager.LoadMessage` 根据消息 ID 搜索消息; -- `Conversation.LoadMessagesWithMsgType` 获取指定会话中特定类型的消息; -- `Conversation.LoadMessagesWithTime` 获取指定会话中一定时间段内的消息; -- `IChatManager.SearchMsgFromDB` 根据关键字搜索会话消息; -- `IChatManager.ImportMessages` 批量导入消息到数据库; +- `Conversation.LoadMessages` 读取指定会话的消息。 +- `IChatManager.DeleteConversation` 删除本地会话及历史消息。 +- `IChatManager.DeleteConversationFromServer` 删除服务端的会话及历史消息。 +- `IChatManager.LoadMessage` 根据消息 ID 搜索消息。 +- `Conversation.LoadMessagesWithMsgType` 获取指定会话中特定类型的消息。 +- `Conversation.LoadMessagesWithTime` 获取指定会话中一定时间段内的消息。 +- `IChatManager.SearchMsgFromDB` 根据关键字搜索会话消息。 +- `IChatManager.ImportMessages` 批量导入消息到数据库。 - `Conversation.InsertMessage` 在指定会话中插入消息。 ## 前提条件 @@ -35,17 +27,6 @@ SQLCipher 用于加密存储本地消息的数据库。即时通讯 IM SDK 使 ## 实现方法 -### 获取本地所有会话 - -你可以调用 `LoadAllConversations` 方法可以根据会话 ID 和会话类型获取本地所有会话: - -```csharp -Listlist = SDKClient.Instance.ChatManager.LoadAllConversations(); - -``` -SDK 从内存中获取会话,若未从本地数据库中加载过,会先从数据库加载到内存中。获取会话后,SDK 按照会话活跃时间(最新一条消息的时间戳)的倒序返回会话,置顶会话在前,非置顶会话在后,会话列表为 `List` 结构。 - - ### 读取指定会话的消息 你可以从本地数据库中读取指定会话的消息,示例代码如下: @@ -64,56 +45,6 @@ conv.LoadMessages(startMsgId, pagesize, callback:new ValueCallBack )); ``` -### 获取指定会话的未读消息数 - -你可以调用接口获取特定会话的未读消息数,示例代码如下: - -```csharp -Conversation conv = SDKClient.Instance.ChatManager.GetConversation(conversationId, convType); -int unread = conv.UnReadCount; -``` - -### 获取所有会话的未读消息数 - -你可以通过接口获取所有会话的未读消息数量,示例代码如下: - -```csharp -SDKClient.Instance.ChatManager.GetUnreadMessageCount(); -``` - -### 指定会话的未读消息数清零 - -你可以调用接口对特定会话的未读消息数清零,示例代码如下: - -```csharp -Conversation conv = SDKClient.Instance.ChatManager.GetConversation(conversationId, convType); -// 指定会话的未读消息数清零。 -conv.MarkAllMessageAsRead(); - -// 将一条消息置为已读。 -conv.MarkMessageAsRead(msgId); - -// 将所有未读消息数清零。 -SDKClient.Instance.ChatManager.MarkAllConversationsAsRead(); -``` - -### 删除会话及历史消息 - -SDK 提供两个接口,分别可以删除本地会话和历史消息或者删除当前用户在服务器端的会话和聊天消息。 - -调用 `DeleteConversation` 和 `DeleteMessage` 删除本地会话和聊天消息,示例代码如下: - -```csharp -//删除和特定用户的会话,如需保留历史消息,传 `false`。 -SDKClient.Instance.ChatManager.DeleteConversation(conversationId, true); - -//删除当前会话中指定的一条历史消息。 -Conversation conv = SDKClient.Instance.ChatManager.GetConversation(conversationId, convType); -conv.DeleteMessage(msgId); -``` - -删除服务端的会话及其历史消息,详见 [删除服务端会话及其历史消息](message_retrieve.html#单向删除服务端会话及其历史消息)。 - ### 根据消息 ID 搜索消息 你可以调用 `LoadMessage` 方法根据消息 ID 获取本地存储的指定消息。如果消息不存在会返回空值。 diff --git a/docs/document/windows/message_retrieve.md b/docs/document/windows/message_retrieve.md index 22019c8fb..e3f9a4016 100644 --- a/docs/document/windows/message_retrieve.md +++ b/docs/document/windows/message_retrieve.md @@ -4,20 +4,12 @@ 环信即时通讯 IM 提供消息漫游功能,即将用户的所有会话的历史消息保存在消息服务器,用户在任何一个终端设备上都能获取到历史信息,使用户在多个设备切换使用的情况下也能保持一致的会话场景。本文介绍用户如何从消息服务器获取和删除会话和消息。 -:::tip -本文介绍的功能均为增值服务,需在[环信即时通讯 IM 管理后台](https://console.easemob.com/user/login)开通。 -::: - ## 实现原理 -使用环信即时通讯 IM SDK 可以通过 `IChatManager` 类的以下方法从服务器获取历史消息: +使用环信即时通讯 IM SDK 可以通过 `IChatManager` 类的以下方法从服务器获取和删除历史消息: -- `GetConversationsFromServerWithPage` 分页获取服务器保存的会话列表; -- `GetConversationsFromServerWithCursor` 分页获取服务器保存的置顶会话列表; -- `PinConversation` 置顶会话。 - `FetchHistoryMessagesFromServer` 获取服务器保存的指定会话中的消息; - `RemoveMessagesFromServer` 单向删除服务端的历史消息; -- `DeleteConversationFromServer` 删除服务端的会话及其历史消息。 ## 前提条件 @@ -28,93 +20,6 @@ ## 实现方法 -### 从服务器获取会话 - -对于单聊或群聊,用户发消息时,会自动将对方添加到用户的会话列表。 - -你可以调用 `GetConversationsFromServerWithCursor` 方法从服务端分页获取会话列表。通过设置该方法中的 `pinOnly` 参数确定是否只获取置顶会话列表: - -- 若 `pinOnly` 为 `false`,获取包括置顶和未置顶会话的列表。SDK 按照会话活跃时间(会话的最新一条消息的时间戳)的倒序返回会话列表,每个会话对象中包含会话 ID、会话类型、是否为置顶状态、置顶时间(对于未置顶的会话,值为 `0`)以及最新一条消息。从服务端拉取会话列表后会更新本地会话列表。服务器默认存储 100 条会话,可存储 7 天。若提升这两个上限,需联系环信商务。 -- 若为 `true` 仅获取置顶会话列表,最多可拉取 50 个置顶会话。SDK 按照会话置顶时间的倒序返回。 - -:::notice -1. 若使用该方法,需将 SDK 升级至 1.2.0。 -2. 建议你在首次下载、卸载后重装应用等本地数据库无数据情况下拉取服务端会话列表。其他情况下,调用 `LoadAllConversations` 方法获取本地所有会话即可。 -3. 通过 RESTful 接口发送的消息默认不创建或写入会话。若会话中的最新一条消息通过 RESTful 接口发送,获取会话列表时,该会话中的最新一条消息显示为通过非 RESTful 接口发送的最新消息。若要开通 RESTful 接口发送的消息写入会话列表的功能,需联系商务。 -::: - -```csharp -// limit: 每页返回的会话数。取值范围为 [1,50]。 -// cursor:开始获取数据的游标位置。若传空字符串(''),SDK 则从最新活跃的会话开始获取。 -int limit = 10; -string cursor = ""; -bool pinOnly = false; // `false`:获取所有会话;`true`仅获取置顶会话列表。 -SDKClient.Instance.ChatManager.GetConversationsFromServerWithCursor(pinOnly, cursor, limit, new ValueCallBack>( - onSuccess: (result) => - { - // 遍历获取到的会话列表 - foreach (var conv in result.Data) - { - - } - // 下一次请求的 cursor - string nextCursor = result.Cursor; - }, - onError: (code, desc) => - { - - } -)); - -``` - -若不支持 `GetConversationsFromServerWithCursor` 方法,你可以调用 `GetConversationsFromServerWithPage` 方法从服务端分页获取会话列表。利用该接口,你总共可获取服务器最近 7 天内存储的 100 个会话。若提升这两个上限,需联系环信商务。 - -若使用该功能,需将 SDK 升级至 V1.1.0。 - -```csharp -SDKClient.Instance.ChatManager.GetConversationsFromServerWithPage(pageNum, pageSize, new ValueCallBack>( - //获取会话成功后的处理逻辑。 - //list 为 List 类型。 - onSuccess: (list) => - { - }, - onError: (code, desc) => - { - } -)); -``` - -### 置顶会话 - -会话置顶指将单聊或群聊会话固定在会话列表的顶部,方便用户查找。例如,将重点会话置顶,可快速定位会话。 - -置顶状态会存储在服务器上,多设备登录情况下,更新置顶状态会同步到其他登录设备。你最多可以置顶 50 个会话。 - -你可以调用 `PinConversation` 方法设置是否置顶会话。多设备登录情况下,会话置顶或取消置顶后,其他登录设备分别会收到 `CONVERSATION_PINNED` 和 `CONVERSATION_UNPINNED` 事件。 - -:::notice -若使用该功能,需将 SDK 升级至 1.2.0。 -::: - -示例代码如下: - -```csharp -SDKClient.Instance.ChatManager.PinConversation(convId, isPinned, new CallBack( - onSuccess: () => - { - - }, - onError: (code, desc) => - { - - } -)); -``` - -你可以通过 `EMConversation` 对象的 `isPinned` 字段检查会话是否为置顶状态,或者调用 `getPinnedTime` 方法获取会话置顶时间。 - - ### 分页获取指定会话的历史消息 你可以调用 `FetchHistoryMessagesFromServer` 方法从服务器分页获取指定会话的历史消息,实现消息漫游。该功能需在[环信即时通讯 IM 管理后台](https://console.easemob.com/user/login)开通。 @@ -168,17 +73,3 @@ SDKClient.Instance.ChatManager.RemoveMessagesFromServer(convId, ctype, msgList, )); ``` -### 单向删除服务端会话及其历史消息 - -你可以调用 `DeleteConversationFromServer` 方法删除服务器端会话和历史消息。会话和消息删除后,当前用户无法从服务器获取该会话和消息,对本地的会话无影响,但会删除本地消息,而其他用户不受影响。 - -```csharp -SDKClient.Instance.ChatManager.DeleteConversationFromServer(conversationId, conversationType, isDeleteServerMessages, new CallBack( - onSuccess: () => - { - }, - onError: (code, desc) => - { - } -)); -``` \ No newline at end of file From bf07153c6e21f5afb358b5b2ea56504455b0d1c6 Mon Sep 17 00:00:00 2001 From: haoxiuwen Date: Fri, 22 Dec 2023 17:42:40 +0800 Subject: [PATCH 3/8] modify --- docs/.vuepress/sidebar/document.ts | 17 +++++++++++++++-- docs/document/applet/conversation_delete.md | 6 ++++++ docs/document/applet/conversation_list.md | 6 ++++++ docs/document/applet/conversation_local.md | 6 ++++++ docs/document/applet/conversation_mark.md | 6 ++++++ docs/document/applet/conversation_overview.md | 6 ++++++ docs/document/applet/conversation_pin.md | 6 ++++++ 7 files changed, 51 insertions(+), 2 deletions(-) create mode 100644 docs/document/applet/conversation_delete.md create mode 100644 docs/document/applet/conversation_list.md create mode 100644 docs/document/applet/conversation_local.md create mode 100644 docs/document/applet/conversation_mark.md create mode 100644 docs/document/applet/conversation_overview.md create mode 100644 docs/document/applet/conversation_pin.md diff --git a/docs/.vuepress/sidebar/document.ts b/docs/.vuepress/sidebar/document.ts index 597ced12f..bb2af6f1e 100644 --- a/docs/.vuepress/sidebar/document.ts +++ b/docs/.vuepress/sidebar/document.ts @@ -41,14 +41,27 @@ const documentSidebar = [ { text: '基础功能', children: [ + { + text: '会话管理', + collapsible: true, + children: [ + { text: '会话介绍', link: 'conversation_overview.html' }, + { text: '会话列表', link: 'conversation_list.html' }, + { text: '本地会话', link: 'conversation_local.html', only: ['web'] }, + { text: '会话未读数', link: 'conversation_unread.html', except: ['web'] }, + { text: '置顶会话', link: 'conversation_pin.html' }, + { text: '会话标记', link: 'conversation_mark.html', except: ['windows', 'react-native', 'flutter', 'unity'] }, + { text: '删除会话', link: 'conversation_delete.html' }, + ] + } { text: '消息管理', collapsible: true, children: [ { text: '消息概述', link: 'message_overview.html' }, { text: '发送和接收消息', link: 'message_send_receive.html' }, - { text: '管理本地会话和消息', link: 'message_manage.html', except: ['react-native'] }, - { text: '管理会话和消息', link: 'message_manage.html', only: ['react-native'] }, + { text: '管理本地消息', link: 'message_manage.html', except: ['react-native'] }, + { text: '管理消息', link: 'message_manage.html', only: ['react-native'] }, { text: '管理服务端消息', link: 'message_retrieve.html', except: ['react-native'] }, { text: '管理消息回执', link: 'message_receipt.html' }, { text: '修改消息', link: 'message_modify.html' }, diff --git a/docs/document/applet/conversation_delete.md b/docs/document/applet/conversation_delete.md new file mode 100644 index 000000000..c30df234f --- /dev/null +++ b/docs/document/applet/conversation_delete.md @@ -0,0 +1,6 @@ +--- +{ + pageUri: "/document/web/conversation_delete.html", + title: "删除会话" +} +--- \ No newline at end of file diff --git a/docs/document/applet/conversation_list.md b/docs/document/applet/conversation_list.md new file mode 100644 index 000000000..3c8da0869 --- /dev/null +++ b/docs/document/applet/conversation_list.md @@ -0,0 +1,6 @@ +--- +{ + pageUri: "/document/web/conversation_list.html", + title: "会话列表" +} +--- \ No newline at end of file diff --git a/docs/document/applet/conversation_local.md b/docs/document/applet/conversation_local.md new file mode 100644 index 000000000..c59e4cdd3 --- /dev/null +++ b/docs/document/applet/conversation_local.md @@ -0,0 +1,6 @@ +--- +{ + pageUri: "/document/web/conversation_local.html", + title: "本地会话" +} +--- \ No newline at end of file diff --git a/docs/document/applet/conversation_mark.md b/docs/document/applet/conversation_mark.md new file mode 100644 index 000000000..244bb1842 --- /dev/null +++ b/docs/document/applet/conversation_mark.md @@ -0,0 +1,6 @@ +--- +{ + pageUri: "/document/web/conversation_mark.html", + title: "会话标记" +} +--- \ No newline at end of file diff --git a/docs/document/applet/conversation_overview.md b/docs/document/applet/conversation_overview.md new file mode 100644 index 000000000..a9f6c2485 --- /dev/null +++ b/docs/document/applet/conversation_overview.md @@ -0,0 +1,6 @@ +--- +{ + pageUri: "/document/web/conversation_overview.html", + title: "会话介绍" +} +--- \ No newline at end of file diff --git a/docs/document/applet/conversation_pin.md b/docs/document/applet/conversation_pin.md new file mode 100644 index 000000000..59fa428ff --- /dev/null +++ b/docs/document/applet/conversation_pin.md @@ -0,0 +1,6 @@ +--- +{ + pageUri: "/document/web/conversation_pin.html", + title: "置顶会话" +} +--- \ No newline at end of file From fb2a022707cc8904c4b54c5f608725e96e7709cc Mon Sep 17 00:00:00 2001 From: haoxiuwen Date: Fri, 22 Dec 2023 17:51:35 +0800 Subject: [PATCH 4/8] modify --- docs/.vuepress/sidebar/document.ts | 2 +- docs/document/android/conversation_overview.md | 1 - docs/document/android/conversation_unread.md | 2 +- docs/document/unity/conversation_unread.md | 2 +- docs/document/web/conversation_overview.md | 1 - docs/document/windows/conversation_unread.md | 2 +- 6 files changed, 4 insertions(+), 6 deletions(-) diff --git a/docs/.vuepress/sidebar/document.ts b/docs/.vuepress/sidebar/document.ts index bb2af6f1e..effade2af 100644 --- a/docs/.vuepress/sidebar/document.ts +++ b/docs/.vuepress/sidebar/document.ts @@ -53,7 +53,7 @@ const documentSidebar = [ { text: '会话标记', link: 'conversation_mark.html', except: ['windows', 'react-native', 'flutter', 'unity'] }, { text: '删除会话', link: 'conversation_delete.html' }, ] - } + }, { text: '消息管理', collapsible: true, diff --git a/docs/document/android/conversation_overview.md b/docs/document/android/conversation_overview.md index 55877dbc4..db6870471 100644 --- a/docs/document/android/conversation_overview.md +++ b/docs/document/android/conversation_overview.md @@ -1,4 +1,3 @@ - # 会话介绍 diff --git a/docs/document/android/conversation_unread.md b/docs/document/android/conversation_unread.md index 081b7976d..2d86b8ef3 100644 --- a/docs/document/android/conversation_unread.md +++ b/docs/document/android/conversation_unread.md @@ -1,4 +1,4 @@ -## 会话未读数 +# 会话未读数 diff --git a/docs/document/unity/conversation_unread.md b/docs/document/unity/conversation_unread.md index ed1f3a670..64af88cc5 100644 --- a/docs/document/unity/conversation_unread.md +++ b/docs/document/unity/conversation_unread.md @@ -1,4 +1,4 @@ -## 会话未读数 +# 会话未读数 diff --git a/docs/document/web/conversation_overview.md b/docs/document/web/conversation_overview.md index de9b311a9..d5acf6646 100644 --- a/docs/document/web/conversation_overview.md +++ b/docs/document/web/conversation_overview.md @@ -1,4 +1,3 @@ - # 会话介绍 diff --git a/docs/document/windows/conversation_unread.md b/docs/document/windows/conversation_unread.md index ed1f3a670..64af88cc5 100644 --- a/docs/document/windows/conversation_unread.md +++ b/docs/document/windows/conversation_unread.md @@ -1,4 +1,4 @@ -## 会话未读数 +# 会话未读数 From 2aaeb45183b5ca8942d6324bd8ec5de0f789b122 Mon Sep 17 00:00:00 2001 From: haoxiuwen Date: Fri, 22 Dec 2023 18:28:36 +0800 Subject: [PATCH 5/8] modify --- docs/.vuepress/sidebar/document.ts | 13 +++++++++++++ docs/document/android/conversation_overview.md | 2 +- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/docs/.vuepress/sidebar/document.ts b/docs/.vuepress/sidebar/document.ts index effade2af..c3c6428fe 100644 --- a/docs/.vuepress/sidebar/document.ts +++ b/docs/.vuepress/sidebar/document.ts @@ -146,6 +146,19 @@ const documentSidebar = [ text: '基本功能', children: [ { text: '初始化及登录', link: 'initialization.html' }, + { + text: '会话管理', + collapsible: true, + children: [ + { text: '会话介绍', link: 'conversation_overview.html' }, + { text: '会话列表', link: 'conversation_list.html' }, + { text: '本地会话', link: 'conversation_local.html' }, + { text: '会话未读数', link: 'conversation_unread.html' }, + { text: '置顶会话', link: 'conversation_pin.html' }, + { text: '会话标记', link: 'conversation_mark.html'}, + { text: '删除会话', link: 'conversation_delete.html'}, + ] + }, { text: '消息管理', collapsible: true, diff --git a/docs/document/android/conversation_overview.md b/docs/document/android/conversation_overview.md index db6870471..5bef54a2f 100644 --- a/docs/document/android/conversation_overview.md +++ b/docs/document/android/conversation_overview.md @@ -42,7 +42,7 @@ | getPinnedTime | 获取会话置顶时间。会话置顶的 UNIX 时间戳,单位为毫秒。未置顶时值为 `0`。 | | insertMessage | 在本地数据库的会话中插入一条消息。消息的会话 ID 应与会话的 ID 一致。消息会根据消息里的 Unix 时间戳插入本地数据库,SDK 会更新会话的 `latestMessage` 等属性。 | | updateMessage | 更新本地数据库的指定消息。消息更新后,消息 ID 不会修改,SDK 会自动更新会话的 `latestMessage` 等属性。 | -| removeMessagesFromServer(List, EMCallBack) | 根据消息 ID 删除单向删除漫游消息。 | +| `removeMessagesFromServer(List, EMCallBack)` | 根据消息 ID 单向删除漫游消息。 | | removeMessagesFromServer(long, EMCallBack) | 根据时间单向删除漫游消息。 | | removeMessages | 从本地数据库中删除指定时间段内的消息。 | From 3fd4442cbd483c4cab8f3603b704b3313046fc64 Mon Sep 17 00:00:00 2001 From: haoxiuwen Date: Fri, 22 Dec 2023 18:42:06 +0800 Subject: [PATCH 6/8] modify --- docs/document/web/message_overview.md | 2 +- docs/product/product_dynamics.md | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/docs/document/web/message_overview.md b/docs/document/web/message_overview.md index ff4436c7b..e6f668449 100644 --- a/docs/document/web/message_overview.md +++ b/docs/document/web/message_overview.md @@ -33,7 +33,7 @@ Web 端暂无相关功能。 #### 从服务器获取消息 环信即时通讯 IM 在消息服务器保存历史消息,方便用户在新设备上获取历史消息。 -历史消息存储时间与套餐版本相关,详见[产品价格](/pricing.html#套餐包功能详情)。 +历史消息存储时间与套餐版本相关,详见[产品价格](/product/pricing.html#套餐包功能详情)。 | 功能 | 描述 | | :------------------------- | :----------------------------------- | diff --git a/docs/product/product_dynamics.md b/docs/product/product_dynamics.md index 332a2ff35..819ecec07 100644 --- a/docs/product/product_dynamics.md +++ b/docs/product/product_dynamics.md @@ -1,5 +1,11 @@ # 产品动态 +## 2023-12 + +| 动态名称 | 动态描述 | 发布时间 | 相关文档 | +| :----- | :------- | :---------------- | :---------------- | +| SDK 4.3.0 开发版发布 | **新增特性**:
- [会话标记功能](/document/android/conversation_mark.html):支持标记会话,并按照标记获取会话。
- 附件消息支持分片上传。
**优化**
- 移动端移除 FPA 功能,减小 SDK 体积。
- 移动端单个日志文件大小由 2 MB 提升到 5 MB。
- Web 端增加 `onMessage` 回调。在收到文本、图片、视频、语音、地理位置和文件等消息时,批量将消息回调给应用。
- Web 端视频类型消息增加视频首帧缩略图, 通过 videoMessage.thumb 访问。 | 2023-12-22 |
- [Android 4.3.0 更新日志](/document/android/releasenote.html)
- [iOS 4.3.0 更新日志](/document/ios/releasenote.html)
- [Web 4.4.0 更新日志](/document/web/releasenote.html)
- [小程序 4.4.0 更新日志](/document/applet/releasenote.html)。 | + ## 2023-11 @@ -7,4 +13,5 @@ | :----- | :------- | :---------------- | :---------------- | | SDK 4.2.0 开发版发布 | **新增特性**:
- 客户端支持[好友备注功能](/document/android/releasenote.html)。
- 客户端支持聊天室全局广播消息,可根据消息属性判断。
- 移动端可以[从服务器获取当前用户已加入的群组数量](/document/android/group_manage.html#查询当前用户已加入的群组数量)。
- 移动端在申请入群被拒绝时,返回的回调中增加了申请者和拒绝者。
- 移动端在初始化时可配置获取会话列表时是否返回空会话。
**优化**
- 客户端统一 Agora Token 和 EaseMob Token 登录方式,新增 EaseMob Token 即将过期及已过期的回调。
- 移动端优化发消息时重试的逻辑。
- 移动端优化数据库升级逻辑。| 2023-11-17 |
- [Android 4.2.1 更新日志](/document/android/releasenote.html)
- [iOS 4.2.1 更新日志](/document/ios/releasenote.html)
- [Web 4.3.0 更新日志](/document/web/releasenote.html)
- [小程序 4.3.0 更新日志](/document/applet/releasenote.html)。 | | REST API | 支持[通过 REST API 向 app 下的所有活跃聊天室发送全局广播消息](/document/server-side/message_chatroom.html#发送聊天室全局广播消息) 。活跃聊天室指聊天室至少存在一个成员,而且至少发送过一条消息。| 2023-11-17 | 详见[发送聊天室广播消息](/document/server-side/message_chatroom.html#发送聊天室全局广播消息)。 | -| IM Demo | 好友详情页面可添加和修改好友备注。 | 2023-11-17 |
- [Android 4.2.1 Demo](https://www.easemob.com/download/demo)
- [iOS 4.2.0 Demo](https://www.easemob.com/download/demo) | \ No newline at end of file +| IM Demo | 好友详情页面可添加和修改好友备注。 | 2023-11-17 |
- [Android 4.2.1 Demo](https://www.easemob.com/download/demo)
- [iOS 4.2.0 Demo](https://www.easemob.com/download/demo) | + From 91fc6fa6d792f8343734e86cda83c168defce624 Mon Sep 17 00:00:00 2001 From: haoxiuwen Date: Fri, 22 Dec 2023 18:52:33 +0800 Subject: [PATCH 7/8] modify --- docs/document/android/conversation_overview.md | 9 ++++++--- docs/document/flutter/conversation_overview.md | 7 +++++-- docs/document/ios/conversation_overview.md | 7 +++++-- docs/document/react-native/conversation_overview.md | 7 +++++-- docs/document/web/conversation_overview.md | 3 ++- 5 files changed, 23 insertions(+), 10 deletions(-) diff --git a/docs/document/android/conversation_overview.md b/docs/document/android/conversation_overview.md index 5bef54a2f..75a7c9bac 100644 --- a/docs/document/android/conversation_overview.md +++ b/docs/document/android/conversation_overview.md @@ -14,7 +14,7 @@ | :--------- | :------- | | EMConversationType | 会话类型枚举。
- `Chat`:单聊会话;
- `GroupChat`:群聊会话;
- `ChatRoom`:聊天室会话。 | | EMSearchDirection | 消息搜索方向枚举。
- UP:按照消息中的 Unix 时间戳的逆序搜索。
- DOWN:按照消息中的时间戳的正序搜索。 | -| EMMarkType | 会话标记枚举类型:MARK_0,MARK_1,MARK_2,MARK_3,MARK_4,MARK_5,MARK_6,MARK_7,MARK_8,MARK_9,MARK_10,MARK_11,MARK_12,MARK_13,MARK_14,MARK_15,MARK_16,MARK_17,MARK_18,MARK_19。 | +| EMMarkType | 会话标记枚举类型:MARK_0,MARK_1,MARK_2,MARK_3,
MARK_4,MARK_5,MARK_6,MARK_7,MARK_8,
MARK_9,MARK_10,MARK_11,MARK_12,
MARK_13,MARK_14,MARK_15,
MARK_16,MARK_17,MARK_18,MARK_19。 | | marks | 获取会话的所有标记。 | | conversationId | 会话 ID,取决于会话类型。
- 单聊:会话 ID 为对方的用户 ID;
- 群聊:会话 ID 为群组 ID;
- 聊天室:会话 ID 为聊天室的 ID。| | getType | 获取会话类型。 | @@ -56,8 +56,11 @@ ```java EMConversationListener listener=new EMConversationListener() { // 收到会话已读的事件。该事件在以下场景中触发: - // 1. 当消息接收方调用 `ackConversationRead()` 方法,SDK 会执行此回调,会将本地数据库中该会话中消息的 `isAcked` 属性置为 `true`。 - // 2. 多端多设备登录时,若一端发送会话已读回执(conversation ack),服务器端会将会话的未读消息数置为 0,同时其他端会回调此方法,并将本地数据库中该会话中消息的 `isRead` 属性置为 `true`。 + // 1. 当消息接收方调用 `ackConversationRead()` 方法,SDK 会执行此回调, + // 会将本地数据库中该会话中消息的 `isAcked` 属性置为 `true`。 + // 2. 多端多设备登录时,若一端发送会话已读回执(conversation ack), + // 服务器端会将会话的未读消息数置为 0, + // 同时其他端会回调此方法,并将本地数据库中该会话中消息的 `isRead` 属性置为 `true`。 @Override public void onConversationRead(String from, String to) { } diff --git a/docs/document/flutter/conversation_overview.md b/docs/document/flutter/conversation_overview.md index 4af4df3e9..bbba20239 100644 --- a/docs/document/flutter/conversation_overview.md +++ b/docs/document/flutter/conversation_overview.md @@ -48,8 +48,11 @@ EMClient.getInstance.chatManager.addEventHandler( sdkEventKey, EMChatEventHandler( // 收到会话已读的事件。该事件在以下场景中触发: - // 1. 当消息接收放调用 `sendConversationReadAck` 方法,SDK 会执行此回调,并将本地数据库中 `Message` 的 `hasReadAck` 置为 `true`. - // 2. 多端多设备登录时,若一端发送会话已读回执(sendConversationReadAck),服务器端会将该会话的未读消息数置为 0,同时其他端会回调此方法,并将本地数据库中该会话中消息的 `hasRead` 属性置为 `true`。 + // 1. 当消息接收放调用 `sendConversationReadAck` 方法,SDK 会执行此回调, + // 并将本地数据库中 `Message` 的 `hasReadAck` 置为 `true`. + // 2. 多端多设备登录时,若一端发送会话已读回执(sendConversationReadAck), + // 服务器端会将该会话的未读消息数置为 0, + // 同时其他端会回调此方法,并将本地数据库中该会话中消息的 `hasRead` 属性置为 `true`。 onConversationRead: (from, to) {}, ), ); diff --git a/docs/document/ios/conversation_overview.md b/docs/document/ios/conversation_overview.md index 8444a1af4..60447b9d0 100644 --- a/docs/document/ios/conversation_overview.md +++ b/docs/document/ios/conversation_overview.md @@ -50,8 +50,11 @@ ```Objective-C // 收到会话已读的事件。该事件在以下场景中触发: -// 1. 当消息接收方调用 `ackConversationRead()` 方法,SDK 会执行此回调,会将本地数据库中该会话中消息的 `isAcked` 属性置为 `true`。 -// 2. 多端多设备登录时,若一端发送会话已读回执(conversation ack),服务器端会将会话的未读消息数置为 0,同时其他端会回调此方法,并将本地数据库中该会话中消息的 `isRead` 属性置为 `true`。 +// 1. 当消息接收方调用 `ackConversationRead()` 方法,SDK 会执行此回调, +// 会将本地数据库中该会话中消息的 `isAcked` 属性置为 `true`。 +// 2. 多端多设备登录时,若一端发送会话已读回执(conversation ack), +// 服务器端会将会话的未读消息数置为 0, +// 同时其他端会回调此方法,并将本地数据库中该会话中消息的 `isRead` 属性置为 `true`。 - (void)onConversationRead:(NSString *)from to:(NSString *)to { diff --git a/docs/document/react-native/conversation_overview.md b/docs/document/react-native/conversation_overview.md index d317a0a62..4555d7fa8 100644 --- a/docs/document/react-native/conversation_overview.md +++ b/docs/document/react-native/conversation_overview.md @@ -53,8 +53,11 @@ ChatClient.getInstance().chatManager.addMessageListener({ onConversationRead(from: string, to?: string): void { // 收到会话已读的事件。该事件在以下场景中触发: - // 1. 当消息接收方调用 `sendConversationReadAck` 方法,SDK 会执行此回调,并将本地数据库中 `Message` 的 `hasReadAck` 置为 `true`. - // 2. 多端多设备登录时,若一端发送会话已读回执(sendConversationReadAck),服务器端会将该会话的未读消息数置为 0,同时其他端会回调此方法,并将本地数据库中该会话中消息的 `hasRead` 属性置为 `true`。 + // 1. 当消息接收方调用 `sendConversationReadAck` 方法,SDK 会执行此回调, + // 并将本地数据库中 `Message` 的 `hasReadAck` 置为 `true`. + // 2. 多端多设备登录时,若一端发送会话已读回执(sendConversationReadAck), + // 服务器端会将该会话的未读消息数置为 0, + // 同时其他端会回调此方法,并将本地数据库中该会话中消息的 `hasRead` 属性置为 `true`。 }, }); ``` diff --git a/docs/document/web/conversation_overview.md b/docs/document/web/conversation_overview.md index d5acf6646..582319857 100644 --- a/docs/document/web/conversation_overview.md +++ b/docs/document/web/conversation_overview.md @@ -33,7 +33,8 @@ conn.addEventHandler("handlerId", { onChannelMessage: (message) => { // 收到会话已读的事件。该事件在以下场景中触发: // 1. 当消息接收方调用 `send` 方法发送 `channel` 类型消息。SDK 会触发此回调。 - // 2. 多端多设备登录时,若一端发送会话已读回执(`send` 方法发送`channel`类型消息),服务器端会将该会话的未读消息数置为 0,同时其他端会触发此回调。 + // 2. 多端多设备登录时,若一端发送会话已读回执(`send` 方法发送`channel`类型消息), + // 服务器端会将该会话的未读消息数置为 0,同时其他端会触发此回调。 console.log("收到会话已读回执消息", message.from, message.to); }, }); From b148fd955067210f41a6d4f5ce2ef9e9310210de Mon Sep 17 00:00:00 2001 From: haoxiuwen Date: Fri, 22 Dec 2023 19:02:23 +0800 Subject: [PATCH 8/8] modify --- docs/document/android/releasenote.md | 1 + docs/document/applet/releasenote.md | 1 + docs/document/ios/releasenote.md | 1 + docs/document/web/releasenote.md | 1 + 4 files changed, 4 insertions(+) diff --git a/docs/document/android/releasenote.md b/docs/document/android/releasenote.md index c0ed8bea5..9f3eed5f8 100644 --- a/docs/document/android/releasenote.md +++ b/docs/document/android/releasenote.md @@ -12,6 +12,7 @@ - `EMChatManager#asyncRemoveConversationMark`:[取消标记会话](conversation_mark.html#取消标记会话)。 - `EMChatManager#asyncGetConversationsFromServerWithCursor`:[根据会话标记从服务器分页查询会话列表](conversation_mark.html#根据会话标记从服务器分页查询会话列表)。 - `EMConversation#marks`:[获取本地单个会话的所有标记](conversation_mark.html#获取本地单个会话的所有标记)。 + - `onChatThreadEvent#CONVERSATION_MARK_UPDATE`:[多设备场景下的会话标记事件](multi_device.html#获取其他设备上的操作)。当前用户在一台登录设备上更新了会话标记,包括添加和移除会话标记,其他登录设备会收到该事件。 ### 优化 diff --git a/docs/document/applet/releasenote.md b/docs/document/applet/releasenote.md index a376dde3e..5bbc20e99 100644 --- a/docs/document/applet/releasenote.md +++ b/docs/document/applet/releasenote.md @@ -10,6 +10,7 @@ - `addConversationMark`:[标记会话](conversation_mark.html#标记会话)。 - `removeConversationMark`:[取消标记会话](conversation_mark.html#取消标记会话)。 - `getServerConversationsByFilter`:[根据会话标记从服务器分页查询会话列表](conversation_mark.html#根据会话标记从服务器分页查询会话列表)。 + - `onMultiDeviceEvent#markConversation`:[多设备场景下的会话标记事件](multi_device.html#实现方法)。当前用户在一台登录设备上更新了会话标记,包括添加和移除会话标记,其他登录设备会收到该事件。 - [IM SDK] 增加 `onMessage` 回调。在收到文本、图片、视频、语音、地理位置和文件等消息时,批量将消息回调给应用。 ### 修复 diff --git a/docs/document/ios/releasenote.md b/docs/document/ios/releasenote.md index 9fa60434b..04f1fe128 100644 --- a/docs/document/ios/releasenote.md +++ b/docs/document/ios/releasenote.md @@ -12,6 +12,7 @@ - `EMChatManager#removeConversationMark:completion`:[取消标记会话](conversation_mark.html#取消标记会话)。 - `EMChatManager#getConversationsFromServerWithCursor:filter:completion`:[根据会话标记从服务器分页查询会话列表](conversation_mark.html#根据会话标记从服务器分页查询会话列表)。 - `EMConversation#marks`:[获取本地单个会话的所有标记](conversation_mark.html#获取本地单个会话的所有标记)。 + - `multiDevicesConversationEvent#EMMultiDevicesEventConversationUpdateMark`:[多设备场景下的会话标记事件](multi_device.html#获取其他设备上的操作)。当前用户在一台登录设备上更新了会话标记,包括添加和移除会话标记,其他登录设备会收到该事件。 ### 优化 diff --git a/docs/document/web/releasenote.md b/docs/document/web/releasenote.md index f7e429c81..585f92f1d 100644 --- a/docs/document/web/releasenote.md +++ b/docs/document/web/releasenote.md @@ -11,6 +11,7 @@ - `addConversationMark`:[标记会话](conversation_mark.html#标记会话)。 - `removeConversationMark`:[取消标记会话](conversation_mark.html#取消标记会话)。 - `getServerConversationsByFilter`:[根据会话标记从服务器分页查询会话列表](conversation_mark.html#根据会话标记从服务器分页查询会话列表)。 + - `onMultiDeviceEvent#markConversation`:[多设备场景下的会话标记事件](multi_device.html#实现方法)。当前用户在一台登录设备上更新了会话标记,包括添加和移除会话标记,其他登录设备会收到该事件。 - [IM SDK] 增加 `onMessage` 回调。在收到文本、图片、视频、语音、地理位置和文件等消息时,批量将消息回调给应用。 - [IM SDK] 视频类型消息增加视频首帧缩略图, 通过 `videoMessage.thumb` 访问。