即时通信 IM Android&iOS&Windows&Mac(好友管理)

IM SDK 支持好友的管理,用户可以主动添加、删除好友,也可以设置仅针对好友才能发送消息。

相关产品
即时通信 IM 产品页,含版本规格、价格与购买入口。

一、获取好友列表

IM SDK 支持好友关系链逻辑,你可以调用 getFriendList (Java / Swift / Objective-C / C++) 接口获取好友列表。

示例代码如下:

JavaSwiftObjective-CC++V2TIMManager.getFriendshipManager().getFriendList(new V2TIMValueCallback<List<V2TIMFriendInfo>>() { @Override public void onSuccess(List<V2TIMFriendInfo> v2TIMFriendInfos) { // 获取好友列表成功 } @Override public void onError(int code, String desc) { // 获取好友列表失败 }});V2TIMManager.shared.getFriendList { infoList in infoList.forEach { item in print( item.description) }} fail: { code, desc in print( "getFriendList fail, \\(code), \\(desc)")}// 获取好友列表[[V2TIMManager sharedInstance] getFriendList:^(NSArray<V2TIMFriendInfo *> *infoList) { // 获取好友列表成功} fail:^(int code, NSString *desc) { // 获取好友列表失败}];template <class T>class ValueCallback final : public V2TIMValueCallback<T> {public: using SuccessCallback = std::function<void(const T&)>; using ErrorCallback = std::function<void(int, const V2TIMString&)>; ValueCallback() = default; ~ValueCallback() override = default; void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback) { success_callback_ = std::move(success_callback); error_callback_ = std::move(error_callback); } void OnSuccess(const T& value) override { if (success_callback_) { success_callback_(value); } } void OnError(int error_code, const V2TIMString& error_message) override { if (error_callback_) { error_callback_(error_code, error_message); } }private: SuccessCallback success_callback_; ErrorCallback error_callback_;};auto callback = new ValueCallback<V2TIMFriendInfoVector>{};callback->SetCallback( [=](const V2TIMFriendInfoVector& friendInfoList) { // 获取好友列表成功 delete callback; }, [=](int error_code, const V2TIMString& error_message) { // 获取好友列表失败 delete callback; });V2TIMManager::GetInstance()->GetFriendshipManager()->GetFriendList(callback);

二、添加好友

你可以调用 addFriend (Java / Swift / Objective-C / C++) 接口添加好友。

示例代码如下:

JavaSwiftObjective-CC++// 添加好友V2TIMFriendAddApplication application = new V2TIMFriendAddApplication("userA");application.setAddType(V2TIMFriendInfo.V2TIM_FRIEND_TYPE_BOTH);V2TIMManager.getFriendshipManager().addFriend(application, new V2TIMValueCallback<V2TIMFriendOperationResult>() { @Override public void onSuccess(V2TIMFriendOperationResult v2TIMFriendOperationResult) { // 添加好友请求成功 } @Override public void onError(int code, String desc) { // 添加好友失败 }});let application = V2TIMFriendAddApplication()application.userID = "userA"application.friendRemark = "remark swift"application.friendGroup = "swift"application.addWording = "this is an addwording from swift api"application.addSource = "swift"application.addType = .V2TIM_FRIEND_TYPE_BOTHV2TIMManager.shared.addFriend(application: application) { result in print( "addFriend succ, \\(result.description)")} fail: { code, desc in print( "addFriend fail, \\(code), \\(desc)")}// 添加好友V2TIMFriendAddApplication *application = [[V2TIMFriendAddApplication alloc] init];application.userID = @"userA";application.addType = V2TIM_FRIEND_TYPE_BOTH;[[V2TIMManager sharedInstance] addFriend:application succ:^(V2TIMFriendOperationResult *result) { // 添加好友请求成功} fail:^(int code, NSString *desc) { // 添加好友失败}];template <class T>class ValueCallback final : public V2TIMValueCallback<T> {public: using SuccessCallback = std::function<void(const T&)>; using ErrorCallback = std::function<void(int, const V2TIMString&)>; ValueCallback() = default; ~ValueCallback() override = default; void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback) { success_callback_ = std::move(success_callback); error_callback_ = std::move(error_callback); } void OnSuccess(const T& value) override { if (success_callback_) { success_callback_(value); } } void OnError(int error_code, const V2TIMString& error_message) override { if (error_callback_) { error_callback_(error_code, error_message); } }private: SuccessCallback success_callback_; ErrorCallback error_callback_;};V2TIMFriendAddApplication application;application.userID = u8"userA";application.addType = V2TIMFriendType::V2TIM_FRIEND_TYPE_BOTH;auto callback = new ValueCallback<V2TIMFriendOperationResult>{};callback->SetCallback( [=](const V2TIMFriendOperationResult& friendOperationResult) { // 添加好友请求成功 delete callback; }, [=](int error_code, const V2TIMString& error_message) { // 添加好友失败 delete callback; });V2TIMManager::GetInstance()->GetFriendshipManager()->AddFriend(application, callback);

根据对方用户资料中的加好友需要验证与否,可以分为两种处理流程:

三、场景一:加好友不需要对方验证

1. 用户 A 和 B 调用 setFriendListener 设置关系链监听器。

2. 用户 B 通过 setSelfInfo 函数里的 allowType (Java / Swift / Objective-C / C++) 字段设置为 “加好友不需要验证(V2TIM_FRIEND_ALLOW_ANY)”。

3. 用户 A 调用 addFriend 申请添加 B 为好友即可添加成功。添加成功后,按照申请参数 V2TIMFriendAddApplication 中 addType 的设置有两种情况:

·如果设置为双向好友 (V2TIM_FRIEND_TYPE_BOTH) ,则用户 A 和 B 都会收到 onFriendListAdded (Java / Swift / Objective-C / C++) 回调;

·如果设置为单向好友(V2TIM_FRIEND_TYPE_SINGLE),则只有用户 A 收到 onFriendListAdded 回调。

四、场景二:加好友需要通过对方验证

1. 用户 A 和 B 调用 setFriendListener 设置关系链监听。

2. 用户 B 通过 setSelfInfo 函数里的 allowType 字段设置为 “加好友需要验证(V2TIM_FRIEND_NEED_CONFIRM)”。

3. 用户 A 调用 addFriend 申请添加 B 为好友,接口的成功回调参数中 resultCode 返回 30539,表示需要等待用户 B 的验证。同时 A 和 B 都会收到 onFriendApplicationListAdded (Java / Swift / Objective-C / C++) 的回调。

4. 用户 B 会收到 onFriendApplicationListAdded 的回调,当参数 V2TIMFriendApplication 中的 type 为 V2TIM_FRIEND_APPLICATION_COME_IN 时,可以选择接受或者拒绝:

·B 调用 acceptFriendApplication (Java / Swift / Objective-C / C++) 接受好友请求。如果参数接受类型为仅同意加单向好友(V2TIM_FRIEND_ACCEPT_AGREE)时:

·A 会收到 onFriendListAdded 回调,说明单向加好友成功。

·B 会收到 onFriendApplicationListDeleted (Java / Swift / Objective-C / C++) 回调,此时 B 成为 A 的好友,但 A 仍不是 B 的好友。

·B 调用 acceptFriendApplication 接受好友请求,如果参数接受类型为同意加双向好友时(V2TIM_FRIEND_ACCEPT_AGREE_AND_ADD),A 和 B 都会收到 onFriendListAdded 回调,说明互相加好友成功。

·B 调用 refuseFriendApplication (Java / Swift / Objective-C / C++) 拒绝好友请求,双方都会收到 onFriendApplicationListDeleted 回调。

注意:说明:

注意:你还可以通过调用 getFriendApplicationList(Java / Swift / Objective-C / C++)获取暂未处理的好友申请列表,包括发起的好友申请和收到的好友申请。但是请注意,已经处理的好友申请不能再拉取到。最多支持拉取 100 条。

五、删除好友

你可以调用 deleteFromFriendList (Java / Swift / Objective-C / C++) 接口删除好友关系。

示例代码如下:

JavaSwiftObjective-CC++List<String> friendIDList = new ArrayList<>();friendIDList.add("userA");V2TIMManager.getFriendshipManager().deleteFromFriendList(friendIDList, V2TIMFriendInfo.V2TIM_FRIEND_TYPE_BOTH, new V2TIMValueCallback<List<V2TIMFriendOperationResult>>() { @Override public void onSuccess(List<V2TIMFriendOperationResult> v2TIMFriendOperationResults) { // 删除好友成功 } @Override public void onError(int code, String desc) { // 删除好友失败 }});V2TIMManager.shared.deleteFromFriendList(userIDList: ["userID"], deleteType: .V2TIM_FRIEND_TYPE_BOTH) { resultList in resultList.forEach { item in // V2TIMFriendOperationResult print( item.description) }} fail: { code, desc in print( "deleteFromFriendList fail, \\(code), \\(desc)")}// 删除好友[[V2TIMManager sharedInstance] deleteFromFriendList:@[@"userA"] deleteType:V2TIM_FRIEND_TYPE_BOTH succ:^(NSArray<V2TIMFriendOperationResult *> *resultList) { // 删除好友成功} fail:^(int code, NSString *desc) { // 删除好友失败}];template <class T>class ValueCallback final : public V2TIMValueCallback<T> {public: using SuccessCallback = std::function<void(const T&)>; using ErrorCallback = std::function<void(int, const V2TIMString&)>; ValueCallback() = default; ~ValueCallback() override = default; void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback) { success_callback_ = std::move(success_callback); error_callback_ = std::move(error_callback); } void OnSuccess(const T& value) override { if (success_callback_) { success_callback_(value); } } void OnError(int error_code, const V2TIMString& error_message) override { if (error_callback_) { error_callback_(error_code, error_message); } }private: SuccessCallback success_callback_; ErrorCallback error_callback_;};V2TIMStringVector userIDList;userIDList.PushBack(u8"userA");V2TIMFriendType deleteType = V2TIMFriendType::V2TIM_FRIEND_TYPE_BOTH;auto callback = new ValueCallback<V2TIMFriendOperationResultVector>{};callback->SetCallback( [=](const V2TIMFriendOperationResultVector& friendOperationResultList) { // 删除好友成功 delete callback; }, [=](int error_code, const V2TIMString& error_message) { // 删除好友失败 delete callback; });V2TIMManager::GetInstance()->GetFriendshipManager()->DeleteFromFriendList(userIDList, deleteType, callback);

六、检查好友关系

你可以调用 checkFriend (Java / Swift / Objective-C / C++) 接口检查好友关系。

示例代码如下:

JavaSwiftObjective-CC++V2TIMManager.getFriendshipManager().checkFriend(userIDList, V2TIMFriendInfo.V2TIM_FRIEND_TYPE_BOTH, new V2TIMValueCallback<List<V2TIMFriendCheckResult>>() { @Override public void onSuccess(List<V2TIMFriendCheckResult> v2TIMFriendCheckResults) { // 检查好友关系成功 for (V2TIMFriendCheckResult checkResult : v2TIMFriendCheckResults) { // 用户 ID String userID = checkResult.getUserID(); // 用户和自己的好友关系 int relationType = checkResult.getResultType(); } } @Override public void onError(int code, String desc) { // 检查好友关系失败 }});// 检查 user1 和自己的好友关系V2TIMManager.shared.checkFriend(userIDList: ["user1"], checkType: .V2TIM_FRIEND_TYPE_BOTH) { resultList in resultList.forEach { item in // V2TIMFriendCheckResult print( item.description) }} fail: { code, desc in print( "checkFriend fail, \\(code), \\(desc)")}// 检查 user1 和自己的好友关系[[V2TIMManager sharedInstance] checkFriend:@[@"user1"] checkType:V2TIM_FRIEND_TYPE_BOTH succ:^(NSArray<V2TIMFriendCheckResult *> *resultList) { // 检查好友关系成功 for (V2TIMFriendCheckResult *result in resultList) { // 用户 ID NSString *userID = result.userID; // 用户和自己的好友关系 V2TIMFriendRelationType relationType = result.relationType; }} fail:^(int code, NSString *desc) { // 检查好友关系失败}];template <class T>class ValueCallback final : public V2TIMValueCallback<T> {public: using SuccessCallback = std::function<void(const T&)>; using ErrorCallback = std::function<void(int, const V2TIMString&)>; ValueCallback() = default; ~ValueCallback() override = default; void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback) { success_callback_ = std::move(success_callback); error_callback_ = std::move(error_callback); } void OnSuccess(const T& value) override { if (success_callback_) { success_callback_(value); } } void OnError(int error_code, const V2TIMString& error_message) override { if (error_callback_) { error_callback_(error_code, error_message); } }private: SuccessCallback success_callback_; ErrorCallback error_callback_;};V2TIMStringVector userIDList;userIDList.PushBack(u8"userA");V2TIMFriendType checkType = V2TIMFriendType::V2TIM_FRIEND_TYPE_BOTH;auto callback = new ValueCallback<V2TIMFriendCheckResultVector>{};callback->SetCallback( [=](const V2TIMFriendCheckResultVector& friendCheckResultList) { // 检查好友关系成功 for (size_t i = 0; i < friendCheckResultList.Size(); ++i) { const V2TIMFriendCheckResult& friendCheckResult = friendCheckResultList[i]; // 用户 ID V2TIMString userID = friendCheckResult.userID; // 用户 ID V2TIMFriendRelationType relationType = friendCheckResult.relationType; } delete callback; }, [=](int error_code, const V2TIMString& error_message) { // 检查好友关系失败 delete callback; });V2TIMManager::GetInstance()->GetFriendshipManager()->CheckFriend(userIDList, checkType, callback);

七、查询和修改好友资料

你可以调用 getFriendsInfo (Java / Swift / Objective-C / C++) 接口查询指定的好友资料。

从回调信息中通过 V2TIMFriendInfoResult 的 relation 字段可以得到该用户与自己的关系:

V2TIMFriendInfoResult.relation 与自己的关系
V2TIM_FRIEND_RELATION_TYPE_NONE 不是好友。
V2TIM_FRIEND_RELATION_TYPE_BOTH_WAY 互为好友。
V2TIM_FRIEND_RELATION_TYPE_IN_MY_FRIEND_LIST 对方在我的好友列表中。
V2TIM_FRIEND_RELATION_TYPE_IN_OTHER_FRIEND_LIST 我在对方的好友列表中。

注意:说明:

注意:好友资料更新时,后台会主动向 SDK 发送系统通知,因此好友资料可以实时更新。

示例代码如下:

JavaSwiftObjective-CC++List<String> userIDList = new ArrayList<>();userIDList.add("userA");V2TIMManager.getFriendshipManager().getFriendsInfo(userIDList, new V2TIMValueCallback<List<V2TIMFriendInfoResult>>() { @Override public void onSuccess(List<V2TIMFriendInfoResult> v2TIMFriendInfoResults) { // 获取好友资料成功 } @Override public void onError(int code, String desc) { // 获取好友资料失败 }});V2TIMManager.shared.getFriendsInfo(userIDList: ["userID1", "userID2"]) { resultList in resultList.forEach { item in // V2TIMFriendInfoResult print( item.description) }} fail: { code, desc in print( "getFriendsInfo fail, \\(code), \\(desc)")}// 获取好友资料[[V2TIMManager sharedInstance] getFriendsInfo:@[@"userA"] succ:^(NSArray<V2TIMFriendInfoResult *> *resultList) { // 获取好友资料成功} fail:^(int code, NSString *desc) { // 获取好友资料失败}];template <class T>class ValueCallback final : public V2TIMValueCallback<T> {public: using SuccessCallback = std::function<void(const T&)>; using ErrorCallback = std::function<void(int, const V2TIMString&)>; ValueCallback() = default; ~ValueCallback() override = default; void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback) { success_callback_ = std::move(success_callback); error_callback_ = std::move(error_callback); } void OnSuccess(const T& value) override { if (success_callback_) { success_callback_(value); } } void OnError(int error_code, const V2TIMString& error_message) override { if (error_callback_) { error_callback_(error_code, error_message); } }private: SuccessCallback success_callback_; ErrorCallback error_callback_;};V2TIMStringVector userIDList;userIDList.PushBack(u8"userA");auto callback = new ValueCallback<V2TIMFriendInfoResultVector>{};callback->SetCallback( [=](const V2TIMFriendInfoResultVector& friendInfoResultList) { // 获取好友资料成功 delete callback; }, [=](int error_code, const V2TIMString& error_message) { // 获取好友资料成功 delete callback; });V2TIMManager::GetInstance()->GetFriendshipManager()->GetFriendsInfo(userIDList, callback);

你可以调用 setFriendInfo (Java / Swift / Objective-C / C++) 接口修改好友资料,包括好友备注、好友自定义字段、好友分组等字段。详情可参考 V2TIMFriendInfo(Java / Swift / Objective-C / C++) 类定义。

如果要修改好友自定义字段,你必须提前在 即时通信 IM 控制台 配置好该字段,配置页面如下:

注意:最多可设置 20 个好友自定义字段。字段创建后,该字段将不可删除,也无法修改字段名与字段类型。

示例代码如下:

JavaSwiftObjective-CC++V2TIMFriendInfo friendInfo = new V2TIMFriendInfo();// userA 为自己的好友friendInfo.setUserID("userA");friendInfo.setFriendRemark("friendRemark");V2TIMManager.getFriendshipManager().setFriendInfo(friendInfo, new V2TIMCallback() { @Override public void onSuccess() { // 设置好友资料成功 } @Override public void onError(int code, String desc) { // 设置好友资料失败 }});let friendInfo = V2TIMFriendInfo()friendInfo.userID = "userA"friendInfo.friendRemark = "friendRemark"friendInfo.friendCustomInfo = ["key1": "11".data(using: .utf8) ?? Data()]V2TIMManager.shared.setFriendInfo(info: friendInfo) { print( "setFriendInfo succ")} fail: { code, desc in print( "setFriendInfo fail, \\(code), \\(desc)")}// 设置好友资料V2TIMFriendInfo *friendInfo = [[V2TIMFriendInfo alloc] init];friendInfo.userID = @"userA"; // userA 为自己的好友friendInfo.friendRemark = @"friendRemark";[[V2TIMManager sharedInstance] setFriendInfo:friendInfo succ:^{ // 设置好友资料成功} fail:^(int code, NSString *desc) { // 设置好友资料失败}];class Callback final : public V2TIMCallback {public: using SuccessCallback = std::function<void()>; using ErrorCallback = std::function<void(int, const V2TIMString&)>; Callback() = default; ~Callback() override = default; void SetCallback(SuccessCallback success_callback, ErrorCallback error_callback) { success_callback_ = std::move(success_callback); error_callback_ = std::move(error_callback); } void OnSuccess() override { if (success_callback_) { success_callback_(); } } void OnError(int error_code, const V2TIMString& error_message) override { if (error_callback_) { error_callback_(error_code, error_message); } }private: SuccessCallback success_callback_; ErrorCallback error_callback_;};V2TIMFriendInfo info;info.userID = u8"userA";info.friendRemark = u8"friendRemark";info.modifyFlag = V2TIMFriendInfoModifyFlag::V2TIM_FRIEND_INFO_MODIFY_FLAG_REMARK;auto callback = new Callback{};callback->SetCallback( [=]() { // 设置好友资料成功 delete callback; }, [=](int error_code, const V2TIMString& error_message) { // 设置好友资料失败 delete callback; });V2TIMManager::GetInstance()->GetFriendshipManager()->SetFriendInfo(info, callback);

八、设置只能给好友发消息

在客服场景中,如果用户需要先加客服为好友才能进行沟通,非常不方便,因此 IM SDK 在发送单聊消息的时候,默认不检查好友关系。

如需实现微信或 QQ 中 “先加好友,再发消息” 的交互体验,你可以登录 即时通信 IM 控制台 修改“发送单聊消息检查关系链”。开启后,用户只能给好友发送消息,当用户给非好友发消息时,SDK 会报 20009 错误码。配置页面路径为:

赞 (0)
上一篇 4天前
下一篇 4天前