子区消息属于群聊消息类,与普通群消息的区别是需要添加 isChatThread
标记。本文介绍即时通讯 IM iOS SDK 如何发送、接收、撤回以及获取子区消息。
即时通讯 IM iOS SDK 提供 AgoraChatManager
、AgoraChatMessage
和 AgoraChatThread
类,可以实现以下功能:
消息收发流程如下图所示:
开始前,请确保满足以下条件:
每个版本的套餐包都支持子区功能。在声网控制台中启用即时通讯服务后默认开启子区功能。
本节介绍如何使用即时通讯 IM SDK 提供的 API 实现上述功能。
发送子区消息和发送群组消息的方法基本一致,区别在于 isChatThread
字段,如以下示例代码所示:
// 调用 `initWithConversationID` 创建一条文本消息
// 设置 `*message` 为消息文字内容
// 设置 `*to` 为子区 ID
NSString *from = [[AgoraChatClient sharedClient] currentUsername];
NSString *to = self.currentConversation.conversationId;
AgoraChatMessage *message = [[AgoraChatMessage alloc] initWithConversationID:to from:from to:to body:aBody ext:aExt];
// 是否需要消息已读回执。
if([aExt objectForKey:MSG_EXT_READ_RECEIPT]) {
message.isNeedGroupAck = YES;
}
// 设置 `chatType` 为 `AgoraChatTypeGroupChat` 标示为群组消息
message.chatType = (AgoraChatType)self.conversationType;
// 设置 `isChatThread` 为 `YES` 标记为子区消息
message.isChatThreadMessage = self.isChatThread;
// 发送消息。
[[AgoraChatClient sharedClient].chatManager sendMessage:message progress:nil completion:^(AgoraChatMessage *message, AgoraChatError *error) {
}];
关于发送消息的逻辑,详见发送消息。
单设备登录时,子区所属群组的所有成员会收到 AgoraChatThreadManagerDelegate#onChatThreadUpdated
回调。子区成员也可以通过监听 AgoraChatManagerDelegate#messagesDidReceive
回调接收子区消息,如下代码示例所示:
// 收到消息时,SDK 触发 `messagesDidReceive` 回调。收到该回调后,SDK 解析并显示消息。
- (void)messagesDidReceive:(NSArray *)aMessages
{
// 做相关处理。
}
// 添加消息监听器。
[[AgoraChatClient sharedClient].chatManager addDelegate:self delegateQueue:nil];
// 移除消息监听器。
[[AgoraChatClient sharedClient].chatManager removeDelegate:self];
关于接收消息的具体逻辑,详见接收消息。
在子区中撤回消息后,所有群组成员都会收到 AgoraChatThreadManagerDelegate#onChatThreadUpdated
回调。子区成员也可以监听 AgoraChatManagerDelegate#messagesInfoDidRecall
回调,如下代码示例所示:
- (void)messagesInfoDidRecall:(NSArray<EMRecallMessageInfo *> *)aRecallMessagesInfo
{}
关于撤回消息的逻辑,详见撤回消息。
从服务器还是本地数据库获取子区消息取决于你的生产环境。
进入单个子区会话后默认展示最早消息,用户可以从服务器获取子区历史消息;若需要合并本地和服务器拉取到的消息(例如有用户撤回子区消息的提示是 SDK 在本地生成的一条消息,可以选择从本地获取子区消息。
关于如何从服务器获取子区消息,详见从服务器获取历史消息。
调用 AgoraChatManager#getAllConversations
方法只能获取单聊或群聊会话。要获取子区会话,参考以下示例代码:
// 需设置会话类型为 `AgoraChatConversationTypeGroupChat` 和 `isThread` 为 `YES`
AgoraChatConversation* conversation = [AgoraChatClient.sharedClient.chatManager getConversation:conversationId type:AgoraChatConversationTypeGroupChat createIfNotExist:NO isThread:YES];
// 获取此子区会话的消息
[conversation loadMessagesStartFromId:@"" count:20 searchDirection:AgoraChatMessageSearchDirectionUp completion:^(NSArray<AgoraChatMessage *> * _Nullable aMessages, AgoraChatError * _Nullable aError) {
}];