功能描述
IM SDK 支持好友的管理,用户可以主动添加、删除好友,也可以设置仅针对好友才能发送消息。
获取好友列表
IM SDK 支持好友关系链逻辑,您可以调用 getFriendList
(Android / iOS & Mac / Windows) 接口获取好友列表。
示例代码如下:
V2TIMManager.getFriendshipManager().getFriendList(new V2TIMValueCallback<List<V2TIMFriendInfo>>() {
@Override
public void onSuccess(List<V2TIMFriendInfo> v2TIMFriendInfos) {
}
@Override
public void onError(int code, String 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
(Android / iOS & Mac / Windows) 接口添加好友。
示例代码如下:
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) {
}
});
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);
根据对方用户资料中的加好友需要验证与否,可以分为两种处理流程:
第一种:加好友不需要对方验证
用户 A 和 B 调用 setFriendListener
设置关系链监听器。
用户 B 通过 setSelfInfo
函数里的 allowType
(Android / iOS & Mac / Windows) 字段设置为 “加好友不需要验证(V2TIM_FRIEND_ALLOW_ANY
)”。
用户 A 调用 addFriend
申请添加 B 为好友即可添加成功。添加成功后,按照申请参数 V2TIMFriendAddApplication
中 addType
的设置有两种情况:
- 如果设置为双向好友 (
V2TIM_FRIEND_TYPE_BOTH
) ,则用户 A 和 B 都会收到 onFriendListAdded
(Android / iOS & Mac / Windows) 回调;
- 如果设置为单向好友(
V2TIM_FRIEND_TYPE_SINGLE
),则只有用户 A 收到 onFriendListAdded
回调。
第二种:加好友需要通过对方验证
用户 A 和 B 调用 setFriendListener
设置关系链监听。
用户 B 通过 setSelfInfo
函数里的 allowType
字段设置为 “加好友需要验证(V2TIM_FRIEND_NEED_CONFIRM
)”。
用户 A 调用 addFriend
申请添加 B 为好友,接口的成功回调参数中 resultCode
返回 30539,表示需要等待用户 B 的验证。同时 A 和 B 都会收到 onFriendApplicationListAdded
(Android / iOS & Mac / Windows) 的回调。
用户 B 会收到 onFriendApplicationListAdded
的回调,当参数 V2TIMFriendApplication
中的 type
为 V2TIM_FRIEND_APPLICATION_COME_IN
时,可以选择接受或者拒绝:
- B 调用
acceptFriendApplication
(Android / iOS & Mac / Windows) 接受好友请求。如果参数接受类型为仅同意加单向好友(V2TIM_FRIEND_ACCEPT_AGREE
)时:
- A 会收到
onFriendListAdded
回调,说明单向加好友成功。
- B 会收到
onFriendApplicationListDeleted
(Android / iOS & Mac / Windows) 回调,此时 B 成为 A 的好友,但 A 仍不是 B 的好友。
- B 调用
acceptFriendApplication
接受好友请求,如果参数接受类型为同意加双向好友时(V2TIM_FRIEND_ACCEPT_AGREE_AND_ADD
),A 和 B 都会收到 onFriendListAdded
回调,说明互相加好友成功。
- B 调用
refuseFriendApplication
(Android / iOS & Mac / Windows) 拒绝好友请求,双方都会收到 onFriendApplicationListDeleted
回调。
删除好友
您可以调用 deleteFromFriendList
(Android / iOS & Mac / Windows) 接口删除好友关系。
示例代码如下:
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 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
(Android / iOS & Mac / Windows) 接口检查好友关系。
示例代码如下:
V2TIMManager.getFriendshipManager().checkFriend(userIDList, V2TIMFriendInfo.V2TIM_FRIEND_TYPE_BOTH, new V2TIMValueCallback<List<V2TIMFriendCheckResult>>() {
@Override
public void onSuccess(List<V2TIMFriendCheckResult> v2TIMFriendCheckResults) {
for (V2TIMFriendCheckResult checkResult : v2TIMFriendCheckResults) {
String userID = checkResult.getUserID();
int relationType = checkResult.getResultType();
}
}
@Override
public void onError(int code, String desc) {
}
});
[[V2TIMManager sharedInstance] checkFriend:@[@"user1"] checkType:V2TIM_FRIEND_TYPE_BOTH succ:^(NSArray<V2TIMFriendCheckResult *> *resultList) {
for (V2TIMFriendCheckResult *result in resultList) {
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];
V2TIMString userID = friendCheckResult.userID;
V2TIMFriendRelationType relationType = friendCheckResult.relationType;
}
delete callback;
},
[=](int error_code, const V2TIMString& error_message) {
delete callback;
});
V2TIMManager::GetInstance()->GetFriendshipManager()->CheckFriend(userIDList, checkType, callback);
查询和修改好友资料
您可以调用 getFriendsInfo
(Android / iOS & Mac / Windows) 接口查询指定的好友资料。
从回调信息中通过 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 发送系统通知,因此好友资料可以实时更新。
示例代码如下:
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 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
(Android / iOS & Mac / Windows) 接口修改好友资料,包括好友备注、好友自定义字段、好友分组等字段。详情可参考 V2TIMFriendInfo
(Android / iOS & Mac / Windows) 类定义。
如果要修改好友自定义字段,您必须提前在 即时通信 IM 控制台 配置好该字段,配置页面如下图所示:

注意:
最多可设置 20 个好友自定义字段。字段创建后,该字段将不可删除,也无法修改字段名与字段类型。
示例代码如下:
V2TIMFriendInfo friendInfo = new V2TIMFriendInfo();
friendInfo.setUserID("userA");
friendInfo.setFriendRemark("friendRemark");
V2TIMManager.getFriendshipManager().setFriendInfo(friendInfo, new V2TIMCallback() {
@Override
public void onSuccess() {
}
@Override
public void onError(int code, String desc) {
}
});
V2TIMFriendInfo *friendInfo = [[V2TIMFriendInfo alloc] init];
friendInfo.userID = @"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 错误码。配置页面路径为:

本页内容是否解决了您的问题?