管理用户关系
管理用户关系
SDK 提供用户关系管理功能,包括好友管理和黑名单管理。
技术原理
环信即时通讯 IM HarmonyOS SDK 提供 ContactManager 类实现好友的添加移除,黑名单的添加移除等功能。
- 添加、删除好友。
- 设置和获取好友备注。
- 从服务器获取好友列表。
- 将用户添加到或移除黑名单。
- 从服务器获取黑名单列表。
前提条件
开始前,请确保满足以下条件:
好友管理
添加好友事件监听
为了接收好友添加、删除和好友申请状态的变更事件,你需要添加好友事件监听。
let contactListener: ContactListener = {
onContactAdded : (userId: string) => {
// 增加好友时回调此方法。
},
onContactDeleted : (userId: string) => {
// 被删除好友时回调此方法。
},
onContactInvited : (userId: string, reason: string) => {
// 收到好友邀请。
},
onFriendRequestAccepted : (userId: string) => {
// 好友请求被同意。
},
onFriendRequestDeclined : (userId: string) => {
// 好友请求被拒绝。
}
}
ChatClient.getInstance().contactManager()?.addContactListener(contactListener);
添加好友
添加好友用于建立稳定的单聊关系。对方接受申请后,双方成为彼此的好友。当前 SDK 仅支持双向好友关系,不支持单向好友或关注关系。
典型流程如下:
- 调用
addContact发起好友申请。 - 对方通过
onContactInvited收到申请,并选择接受或拒绝。 - 若对方接受,双方建立好友关系;若对方拒绝,本次申请结束。
你可以调用 addContact 发起好友申请:
ChatClient.getInstance().contactManager()?.addContact(toAddUsername, reason);
接收方会通过 onContactInvited 回调收到该申请,可按需接受或拒绝:
- 调用
acceptInvitation接受好友申请。请求方会收到onFriendRequestAccepted,双方都会收到onContactAdded。 - 调用
declineInvitation拒绝好友申请。请求方会收到onFriendRequestDeclined。
ChatClient.getInstance().contactManager()?.acceptInvitation(userId).then(()=>{
// success logic
});
ChatClient.getInstance().contactManager()?.declineInvitation(userId).then(()=>{
// success logic
});
提示
- 服务器不会重复下发好友申请事件。若业务需要展示待处理申请列表,建议在收到
onContactInvited时本地保存申请记录。 - 当前 SDK 不提供好友申请列表拉取接口。
删除好友
调用 deleteContact 删除好友后,对方好友列表中的该用户也会被移除。该操作无需对方确认,建议在应用侧增加二次确认。
ChatClient.getInstance().contactManager()?.deleteContact(userId, isKeepConversation).then(()=> {
// success logic
});
删除后,对方会收到 onContactDeleted 事件。
设置好友备注
你可以调用 setContactRemark 方法设置单个好友的备注。
好友备注的长度不能超过 100 个字符。
ChatClient.getInstance().contactManager()?.setContactRemark(userId, remark).then(()=> {
// success logic
});
获取好友列表和好友信息
从服务端获取好友列表
你可以调用 fetchAllContactsFromServer 方法从服务器一次性获取好友列表,可以调用 fetchAllContactsFromServerByPage 方法从服务器分页获取好友列表,其中每个好友对象包含好友的用户 ID 和好友备注。
- 一次性获取服务端好友列表。
ChatClient.getInstance().contactManager()?.fetchAllContactsFromServer().then(contacts => {
// success logic
});
- 分页获取服务端好友列表。
// limit 的取值范围为 [1,50]
let contacts = new Array<Contact>();
let cursor = "";
let limit = 20;
this.doAsyncFetchAllContactsFromServer(contacts, cursor, limit);
private doAsyncFetchAllContactsFromServer(contacts: Array<Contact>, cursor: string, limit: number) {
ChatClient.getInstance().contactManager()?.fetchAllContactsFromServerByPage(limit, cursor).then(result => {
let data = result.getResult();
let resultCursor = result.getNextCursor();
if(data && data.length > 0) {
contacts.concat(data);
}
if (resultCursor) {
this.doAsyncFetchAllContactsFromServer(contacts, cursor, limit);
}
});
}
此外,你也可以调用 fetchAllContactsIDFromServer 方法从服务器获取所有好友的列表,该列表只包含好友的用户 ID。
ChatClient.getInstance().contactManager()?.fetchAllContactsIDFromServer().then(result => {
// success logic
});
从本地获取好友列表
你可以调用 getContactsFromLocal 方法一次性获取整个好友列表,其中每个好友对象包含好友的用户 ID 和好友备注。
自 1.5.3 版本开始,你可以调用 getContact 方法从本地获取单个好友的用户 ID 和好友备注。
提示
需要先从服务器获取好友列表,才能从本地读取到好友列表。
- 本地获取单个好友。
ChatClient.getInstance().contactManager()?.getContact(this.contactId).then((contact) => {
if (contact) {
let remark = contact.remark();
let username = contact.userId();
}
}).catch((e: ChatError) => {
// failure logic
});
- 一次性获取本地好友列表。
ChatClient.getInstance().contactManager()?.getContactsFromLocal().then(result => {
// success logic
});
此外,你也可以调用 allContacts 方法从本地一次性获取所有好友的列表,该列表只包含好友的用户 ID。
示例代码如下:
ChatClient.getInstance().contactManager()?.allContacts().then(result => {
// success logic
});
设置仅给好友发消息
环信即时通讯 IM 默认支持非好友用户之间发送单聊消息,即无需添加好友即可聊天。若仅允许好友之间发送单聊消息,你需要在 环信控制台 开启好友关系检查。开启后,SDK 会在用户发起单聊时检查好友关系;若用户向非好友用户发送单聊消息,SDK 会返回错误码 221。
黑名单管理
添加用户到黑名单
黑名单是与好友无任何关系的独立体系。可以将任何用户加入黑名单,不论该用户与你是否是好友关系。
黑名单功能包括加入黑名单,从黑名单移出用户和获取黑名单列表。对于获取黑名单,你可从服务器获取黑名单列表,也可从本地数据库获取已保存的黑名单列表。
你可以调用 addUsersToBlocklist 添加用户到黑名单。用户被加入黑名单后,无法向你发送消息,也无法发送好友申请。
用户可以将任何其他用户添加到黑名单列表,无论该用户是否是好友。好友被加入黑名单后仍在好友列表上显示。
ChatClient.getInstance().contactManager()?.addUsersToBlocklist(userIds).then(()=> {
// success logic
});
将用户从黑名单移除
你可以调用 removeUserFromBlockList 将用户从黑名单移除,用户发送消息等行为将恢复。
ChatClient.getInstance().contactManager()?.removeUserFromBlockList(userId).then(()=> {
// success logic
});
从服务器获取黑名单列表
你可以调用 getBlockListFromServer 从服务端获取黑名单列表。示例代码如下:
ChatClient.getInstance().contactManager()?.getBlockListFromServer().then(result => {
// success logic
});
从本地数据库获取黑名单列表
从服务器获取黑名单列表之后,才能从本地数据库获取到黑名单列表。
示例代码如下:
ChatClient.getInstance().contactManager()?.blockList().then(result => {
// success logic
});
