聊天室属性管理(KV)
从 1.1.0 版本开始,SDK 提供了聊天室属性(KV)管理接口,用于在指定聊天室中设置自定义属性。
在语音直播聊天室场景中,可利用此功能记录聊天室中各麦位的属性;或在狼人杀等卡牌类游戏场景中记录用户的角色和牌局状态等。
开通服务
使用聊天室属性(KV)接口要求开通聊天室属性自定义设置服务。您可以前往控制台的免费基础功能页面开启服务。
聊天室业务还提供服务端回调功能,支持由融云服务端将应用下的全部聊天室属性变化(设置,删除,全部删除等操作)同步到您指定的地址,方便 App 业务服务端了解聊天室属性变化。详见服务端文档聊天室属性同步(KV)。
功能局限
提示
- 聊天室销毁后,聊天室中的自定义属性同时销毁。
- 每个聊天室中,最多允许设置 100 个属性信息,以
Key-Value
的方式进行存储。 - 客户端 SDK 未针对聊天室属性 KV 的操作频率进行限制。建议每个聊天室,每秒钟操作
Key-Value
频率保持在 100 次及以下(一秒内单次操作 100 个 KV 等同于操作 100 次)。
监听聊天室属性变化
SDK 在聊天室业务中提供了 ChatroomKVStatusListener
,用于监听聊天室属性(KV)变化。
/**
* IMLib 聊天室 KV 状态变化监听器
* @version 1.1.0
*/
interface ChatroomKVStatusListener {
/**
* IMLib 刚加入聊天室时 KV 同步完成的回调。加入聊天室成功后,SDK 默认从服务端同步 KV 列表,同步完成后触发。
*
* @param roomId 聊天室 ID
*/
onChatroomKVSync(roomId: string): void;
/**
* IMLib 聊天室 KV 变化的回调。聊天室 KV 更新时。如果刚进入聊天室时存在 KV,会通过此回调将所有 KV 返回,再次回调时为其他人设置或者修改 KV 的增量数据。
*
* @param roomId 聊天室 ID
* @param entries 发生变化的 KV,返回 KV 变化的增量数据。加入某个聊天室后第一次回调会返回全量 KV。
*/
onChatroomKVUpdate(roomId: string, entries: Map<string, string>): void;
/**
* IMLib 聊天室 KV 被删除的回调。KV 被删除时触发。
*
* @param roomId 聊天室 ID
* @param entries 被删除的 KV
*/
onChatroomKVRemove(roomId: string, entries: Map<string, string>): void;
}
设置聊天室 KV 监听器
使用 setChatroomKVStatusListener
方法,添加聊天室 KV 监听器 setChatroomKVStatusListener。
let listener: ChatroomKVStatusListener = {
onChatroomKVSync: (roomId: string): void => {
hilog.info(0x0000, 'IM-App', 'onChatroomKVSync roomId:%{public}s', roomId);
},
onChatroomKVUpdate: (roomId: string, entries: Map<string, string>): void => {
let json = JSON.stringify(Array.from(entries));
hilog.info(0x0000, 'IM-App', 'onChatroomKVUpdate roomId:%{public}s entries:%{public}s', roomId, json);
},
onChatroomKVRemove: (roomId: string, entries: Map<string, string>): void => {
let json = JSON.stringify(Array.from(entries));
hilog.info(0x0000, 'IM-App', 'onChatroomKVRemove roomId:%{public}s entries:%{public}s', roomId, json);
}
}
IMEngine.getInstance().setChatroomKVStatusListener(listener);
获取指定一批属性
通过属性的 Key 获取指定聊天室中的一批属性 KV。
let roomId = "聊天室 ID";
let list = new List<string>();
list.add("key1");
list.add("key2");
IMEngine.getInstance().getChatroomEntries(roomId, list).then(result => {
if (EngineError.Success !== result.code) {
// 获取 KV 失败
return;
}
if (!result.data) {
// KV 为空
return;
}
// KV map
let kvMap = result.data as Map<string,string>;
});
参数 | 类型 | 说明 |
---|---|---|
roomId | string | 聊天室 ID |
list | string 集合 | 聊天室属性名称列表 ,Key 支持大小写英文字母、数字、部分特殊符号 + = - _ 的组合方式,最大长度 128 个字符 |
获取所有属性
获取指定聊天室中所有属性 KV 对。
let roomId = "聊天室 ID";
IMEngine.getInstance().getAllChatroomEntries(roomId).then(result => {
if (EngineError.Success !== result.code) {
// 获取 KV 失败
return;
}
if (!result.data) {
// KV 为空
return;
}
// KV map
let kvMap = result.data as Map<string,string>;
});
参数 | 类型 | 说明 |
---|---|---|
roomId | string | 聊天室 ID |
批量设置属性
批量设置聊天室属性。通过 overWrite
参数可控制是否强制覆盖他人设置的属性。
let roomId = "聊天室 ID";
let map = new Map<string, string>();
map.set("key1","value1");
map.set("key2","value2");
let autoDelete = true;
let overWrite = true;
IMEngine.getInstance().setChatroomEntries(roomId, map, autoDelete, overWrite).then(result => {
if (EngineError.Success !== result.code) {
// 设置 KV 失败
return;
}
if (!result.data) {
// 所有 KV 都设置成功
return;
}
// 设置失败的 key 和对应的失败错误码,视情况决定是否重新设置失败的 KV
let errorMap = result.data as Map<string, EngineError>;
});
参数 | 类型 | 说明 |
---|---|---|
roomId | string | 聊天室 ID |
map | Map | map size 最大限制为10,超过限制返回错误码 ChatroomKvLimit (23429)。 |
autoDelete | boolean | 用户掉线或退 出时,是否自动删除该 Key、Value 值。 |
overWrite | boolean | 是否强制覆盖 |
批量删除属性
从指定单个聊天室中批量删除属性。单次最多删除 10 个属性。通过 isForce
参数可控制是否强制删除他人设置的属性。
let roomId = "聊天室 ID";
let list = new List<string>();
list.add("key1");
list.add("key2");
let isForce = true;
IMEngine.getInstance().deleteChatroomEntries(roomId, list, isForce).then(result => {
if (EngineError.Success !== result.code) {
// 删除 KV 失败
return;
}
if (!result.data) {
// 删除 KV 成功
return;
}
// 删除失败的 K 和对应的错误,视情况决定是否重新删除失败的 KV
let errorMap = result.data as Map<string,EngineError>;
});
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
roomId | String | 是 | 聊天室 ID |
list | string 集合 | 是 | 聊天室属性名称集合,集合 size 最大限制 10 |
isForce | boolean | 是 | 是否强制覆盖 |