一、关系链事件监听器
你可以调用 addFriendListener (Java / Swift / Objective-C / C++) 添加关系链事件监听器。
当不想再接收关系链事件时,可调用 removeFriendListener (Java / Swift / Objective-C / C++) 移除关系链事件监听器。
注意:只有预先设置好关系链事件监听器,才能正常接收到下文中的各种事件通知。
示例代码如下:
JavaSwiftObjective-CC++// 添加关系链监听器V2TIMManager.getFriendshipManager().addFriendListener(listener);// 移除关系链监听器V2TIMManager.getFriendshipManager().removeFriendListener(listener);// 添加关系链监听器V2TIMManager.shared.addFriendListener(listener: self)// 移除关系链监听器V2TIMManager.shared.removeFriendListener(listener: self)// 添加关系链监听器// self 为 id<V2TIMFriendshipListener>[[V2TIMManager sharedInstance] addFriendListener:self];// 移除关系链监听器[[V2TIMManager sharedInstance] removeFriendListener:self];class FriendshipListener final : public V2TIMFriendshipListener { // 成员 …};// 添加关系链事件监听器,注意在移除监听器之前需要保持 friendshipListener 的生命期,以免接收不到事件回调FriendshipListener friendshipListener;V2TIMManager::GetInstance()->GetFriendshipManager()->AddFriendListener(&friendshipListener);// 移除关系链监听器V2TIMManager::GetInstance()->GetFriendshipManager()->RemoveFriendListener(&friendshipListener);
二、查询和修改自己的资料
你可以调用 getUsersInfo (Java / Swift / Objective-C / C++) 接口查询个人资料,其中参数 userIDList 需填入自己的 UserID。
示例代码如下:
JavaSwiftObjective-CC++// 获取个人资料String loginUser = V2TIMManager.getInstance().getLoginUser();List<String> userIDList = new ArrayList<>();userIDList.add(loginUser);V2TIMManager.getInstance().getUsersInfo(userIDList, new V2TIMValueCallback<List<V2TIMUserFullInfo>>() { @Override public void onSuccess(List<V2TIMUserFullInfo> profiles) { // 获取个人资料成功 } @Override public void onError(int code, String desc) { // 获取个人资料失败 }});if let userID = V2TIMManager.shared.getLoginUser() { V2TIMManager.shared.getUsersInfo(userIDList: [userID]) { infoList in infoList.forEach { item in print( item.description) } } fail: { code, desc in print( "getUsersInfo group fail, \\(code), \\(desc)") }}// 获取个人资料NSString *loginUser = [[V2TIMManager sharedInstance] getLoginUser];[[V2TIMManager sharedInstance] getUsersInfo:@[loginUser] succ:^(NSArray<V2TIMUserFullInfo *> *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_;};V2TIMString loginUser = V2TIMManager::GetInstance()->GetLoginUser();V2TIMStringVector userIDList;userIDList.PushBack(loginUser);auto callback = new ValueCallback<V2TIMUserFullInfoVector>{};callback->SetCallback( [=](const V2TIMUserFullInfoVector& userFullInfoList) { // 获取个人资料成功 delete callback; }, [=](int error_code, const V2TIMString& error_message) { // 获取个人资料失败 delete callback; });V2TIMManager::GetInstance()->GetUsersInfo(userIDList, callback);
你可以调用 setSelfInfo (Java / Swift / Objective-C / C++) 接口修改个人资料。
个人资料包括昵称、头像、签名、性别、出生日期、好友验证方式等,详情可参见 V2TIMUserFullInfo(Java / Swift / Objective-C / C++) 类定义。
资料修改成功后,你会收到 onSelfInfoUpdated (Java / Swift / Objective-C / C++) 回调。
示例代码如下:
JavaSwiftObjective-CC++// 设置个人资料V2TIMUserFullInfo info = new V2TIMUserFullInfo();info.setNickname("nickName");info.setFaceUrl("faceUrl");V2TIMManager.getInstance().setSelfInfo(info, new V2TIMCallback() { @Override public void onSuccess() { // 设置个人资料成功 } @Override public void onError(int code, String desc) { // 设置个人资料失败 }});// 监听个人资料变更回调V2TIMManager.getInstance().addIMSDKListener(new V2TIMSDKListener() { @Override public void onSelfInfoUpdated(V2TIMUserFullInfo info) { // 收到个人资料变更回调 }});let info = V2TIMUserFullInfo()info.selfSignature = "this is self signature by swift"info.gender = .V2TIM_GENDER_FEMALEinfo.role = 200info.level = 222info.birthday = UInt(Date().timeIntervalSince1970)info.allowType = .V2TIM_FRIEND_ALLOW_ANYinfo.nickName = "nickName"info.faceURL = "URL"info.customInfo = ["Str": "value1".data(using: .utf8) ?? Data()]V2TIMManager.shared.setSelfInfo(info: info) { print( "setSelfInfo succ, \\(info.description)")} fail: { code, desc in print( "setSelfInfo fail, \\(code), \\(desc)")}// 设置个人资料V2TIMUserFullInfo *info = [[V2TIMUserFullInfo alloc] init];info.nickName = @"nickName";info.faceURL = @"faceURL";[[V2TIMManager sharedInstance] setSelfInfo:info succ:^{ // 设置个人资料成功} fail:^(int code, NSString *desc) { // 设置个人资料失败}];// 监听个人资料变更回调[[V2TIMManager sharedInstance] addIMSDKListener:self];- (void)onSelfInfoUpdated:(V2TIMUserFullInfo *)Info { // 收到个人资料变更回调}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_;};V2TIMUserFullInfo info;info.nickName = u8"nickName";info.faceURL = u8"faceUrl";info.modifyFlag = V2TIMUserInfoModifyFlag::V2TIM_USER_INFO_MODIFY_FLAG_NICK | V2TIMUserInfoModifyFlag::V2TIM_USER_INFO_MODIFY_FLAG_FACE_URL;auto callback = new Callback{};callback->SetCallback( [=]() { // 设置个人资料成功 delete callback; }, [=](int error_code, const V2TIMString& error_message) { // 设置个人资料失败 delete callback; });V2TIMManager::GetInstance()->SetSelfInfo(info, callback);// 监听个人资料变更回调class SDKListener final : public V2TIMSDKListener {public: SDKListener() = default; ~SDKListener() override = default; void OnSelfInfoUpdated(const V2TIMUserFullInfo& info) override { // 收到个人资料变更回调 } // 其他成员 …};// 添加事件监听器,注意在移除监听器之前需要保持 sdkListener 的生命期,以免接收不到事件回调SDKListener sdkListener;V2TIMManager::GetInstance()->AddSDKListener(&sdkListener);
三、查询和修改好友资料
你可以调用 getFriendsInfo(Java / Swift / Objective-C / C++)接口查询指定的好友资料,调用 setFriendInfo(Java / Swift / Objective-C / C++)接口修改好友资料。详情请参见 好友管理。
四、查询非好友用户资料
你可以调用 getUsersInfo(Java / Swift / Objective-C / C++)接口查询非好友资料,其中参数 userIDList 填入非好友的 UserID 即可。
注意:说明:
示例代码如下:
JavaSwiftObjective-CC++List<String> userIDList = new ArrayList<>();userIDList.add("userA");V2TIMManager.getInstance().getUsersInfo(userIDList, new V2TIMValueCallback<List<V2TIMUserFullInfo>>() { @Override public void onSuccess(List<V2TIMUserFullInfo> profiles) { // 获取非好友资料成功 } @Override public void onError(int code, String desc) { // 获取非好友资料失败 }});// 获取非好友资料V2TIMManager.shared.getUsersInfo(userIDList: ["userID1"]) { infoList in infoList.forEach { item in print( item.description) }} fail: { code, desc in print( "getUsersInfo group fail, \\(code), \\(desc)")}// 获取非好友资料[[V2TIMManager sharedInstance] getUsersInfo:@[@"userA"] succ:^(NSArray<V2TIMUserFullInfo *> *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_;};V2TIMStringVector userIDList;userIDList.PushBack(u8"userA");auto callback = new ValueCallback<V2TIMUserFullInfoVector>{};callback->SetCallback( [=](const V2TIMUserFullInfoVector& userFullInfoList) { // 获取非好友资料成功 delete callback; }, [=](int error_code, const V2TIMString& error_message) { // 获取非好友资料失败 delete callback; });V2TIMManager::GetInstance()->GetUsersInfo(userIDList, callback);
五、订阅非好友用户资料
你可以调用接口subscribeUserInfo (Java / Swift / Objective-C / C++) 来订阅非好友用户的资料,订阅成功后,当被订阅的非好友用户资料发生变更时,IM SDK 会通过 onUserInfoChanged (Java / Swift / Objective-C / C++) 回调通知给你。
通过订阅非好友用户资料,你可以实时感知某些非好友用户资料的变更。
注意:说明:
注意:
注意:好友的资料和自己的资料都不需要订阅,当好友或自己的资料变更时,默认会通过onFriendInfoChanged或onSelfInfoUpdated 回调来通知给你。
示例代码如下:
JavaSwiftObjective-CC++List<String> useridList = Arrays.asList("useridA", "useridB", "useridC");V2TIMManager.getInstance().subscribeUserInfo(useridList, new V2TIMCallback() { @Override public void onSuccess() { // 订阅用户资料成功 } @Override public void onError(int code, String desc) { // 订阅用户资料失败 }});V2TIMManager.shared.subscribeUserInfo(userIDList: ["useridA", "useridB"]) { print( "subscribeUserInfo succ")} fail: { code, desc in print( "subscribeUserInfo fail, \\(code), \\(desc)")}[V2TIMManager.sharedInstance subscribeUserInfo:@[@"useridA", @"useridB", @"useridC"] 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_;};V2TIMStringVector userIDList;userIDList.PushBack(u8"useridA");userIDList.PushBack(u8"useridB");auto callback = new Callback{};callback->SetCallback( [=]() { // 订阅用户资料成功 delete callback; }, [=](int error_code, const V2TIMString& error_message) { // 订阅用户资料成功 delete callback; });V2TIMManager::GetInstance()->SubscribeUserInfo(userIDList, callback);
六、取消订阅非好友用户资料
如果你不想接收订阅用户资料变更通知,可以调用接口unsubscribeUserInfo (Java / Swift / Objective-C / C++) 来取消某些已订阅用户。
当传入的用户列表为空时,会取消当前所有的订阅。
注意:说明:
注意:
示例代码如下所示:
JavaSwiftObjective-CC++List<String> useridList = Arrays.asList("useridA", "useridB", "useridC");V2TIMManager.getInstance().unsubscribeUserInfo(useridList, new V2TIMCallback() { @Override public void onSuccess() { // 取消订阅用户资料成功 } @Override public void onError(int code, String desc) { // 取消订阅用户资料失败 }});V2TIMManager.shared.unsubscribeUserInfo(userIDList: []) { print( "unsubscribeUserInfo succ")} fail: { code, desc in print( "unsubscribeUserInfo fail, \\(code), \\(desc)")}[V2TIMManager.sharedInstance unsubscribeUserInfo:@[@"useridA", @"useridB", @"useridC"] 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_;};V2TIMStringVector userIDList;userIDList.PushBack(u8"useridA");userIDList.PushBack(u8"useridB");auto callback = new Callback{};callback->SetCallback( [=]() { // 取消订阅用户资料成功 delete callback; }, [=](int error_code, const V2TIMString& error_message) { // 取消订阅用户资料失败 delete callback; });V2TIMManager::GetInstance()->UnsubscribeUserInfo(userIDList, callback);
七、用户资料变更通知
根据用户类型的不同,用户资料变更可以分为如下三种:
·自己的资料变更,通过 onSelfInfoUpdated(Java / Swift / Objective-C / C++)回调通知。
·好友的资料变更,通过 onFriendProfileChanged(Java / Swift / Objective-C / C++)回调通知。
·订阅用户(非好友)的资料变更,通过 onUserInfoChanged(Java / Swift / Objective-C / C++)回调通知。
其中 onSelfInfoUpdated和onUserInfoChanged 回调需要你调用addIMSDKListener(Java / Swift / Objective-C / C++)通过添加 SDK 监听器来设置,onFriendInfoChanged回调需要你调用 addFriendListener(Java / Swift / Objective-C / C++)通过添加关系链监听器来设置。
注意:只有满足如下条件的用户,其资料变更才会通过 onUserInfoChanged 回调进行通知:
示例代码如下:
JavaSwiftObjective-CC++V2TIMSDKListener v2TIMSDKListener = new V2TIMSDKListener() { @Override public void onSelfInfoUpdated(V2TIMUserFullInfo info) { // 收到自己的资料变更通知 } @Override public void onUserInfoChanged(List<V2TIMUserFullInfo> infoList) { // 收到订阅用户 (非好友) 的资料变更通知 }};// 添加 SDK 监听器V2TIMManager.getInstance().addIMSDKListener(v2TIMSDKListener);V2TIMFriendshipListener v2TIMFriendshipListener = new V2TIMFriendshipListener() { @Override public void onFriendInfoChanged(List<V2TIMFriendInfo> infoList) { // 收到好友资料变更通知 }};// 添加关系链监听器V2TIMManager.getFriendshipManager().addFriendListener(v2TIMFriendshipListener);// 添加 SDK 监听器V2TIMManager.shared.addIMSDKListener(listener: self)func onSelfInfoUpdated(info: V2TIMUserFullInfo) {}func onUserInfoChanged(userInfoList: Array<V2TIMUserFullInfo>) { userInfoList.forEach { item in print( item.description) }}// 添加关系链监听器V2TIMManager.shared.addFriendListener(listener: self)func onFriendProfileChanged(infoList: Array<V2TIMFriendInfo>) { print( infoList)}// 添加 SDK 监听器[[V2TIMManager sharedInstance] addIMSDKListener:self];- (void)onSelfInfoUpdated:(V2TIMUserFullInfo *)info { // 收到自己的资料变更回调}- (void)onUserInfoChanged:(NSArray<V2TIMUserFullInfo *> *)infoList { // 收到订阅用户 (非好友) 的资料变更通知}// 添加关系链监听器[[V2TIMManager sharedInstance] addFriendListener:self];- (void)onFriendProfileChanged:(NSArray<V2TIMFriendInfo *> *)infoList { // 收到好友资料变更通知}class SDKListener final : public V2TIMSDKListener {public: SDKListener() = default; ~SDKListener() override = default; void OnSelfInfoUpdated(const V2TIMUserFullInfo& Info) override { // 收到自己的资料变更回调 } void OnUserInfoChanged(const V2TIMUserFullInfoVector& InfoList) override { // 收到订阅用户 (非好友) 的资料变更通知 } // 其他成员函数 …};// 添加 SDK 事件监听器,注意在移除监听器之前需要保持 sdkListener 的生命期,以免接收不到事件回调SDKListener sdkListener;V2TIMManager::GetInstance()->AddSDKListener(&sdkListener);class FriendshipListener final : public V2TIMFriendshipListener {public: FriendshipListener() = default; ~FriendshipListener() override = default; void OnFriendInfoChanged(const V2TIMFriendInfoVector& InfoList) override { // 收到好友资料变更通知 } // 其他成员函数 …};// 添加关系链事件监听器,注意在移除监听器之前需要保持 friendshipListener 的生命期,以免接收不到事件回调FriendshipListener friendshipListener;V2TIMManager::GetInstance()->GetFriendshipManager()->AddFriendListener(&friendshipListener);