好友列表页面

好友列表页面:信息托管页面用 IMKit 的列表/详情能力承载好友、群组与用户资料;页面级路由与数据编排由宿主完成。

适用场景​

  • 快速搭出通讯录/群组/用户资料页
  • 需要与既有账号体系打通
  • 需要搜索、申请、管理的完整交互

前置条件​

  • 已导入 IMKit 并完成初始化
  • IMLib 已连接且有好友/群组数据
  • 宿主提供导航容器

rev28 契约状态​

已实现 / 部分覆盖

rev28 已冻结 IMKit features 8 组件与 Swift/ObjC 绑定;本页覆盖信息托管/群管理/联系人/多选/转发/引用的契约接入,未覆盖的特别关注/搜索用户等仍按能力边界说明。

组件:UserInfoProvider​

用户资料托管:宿主按 userId 返回昵称/头像/扩展

契约项内容
Propsprovider:(userId) async -> IMPKitUserInfo?
Eventsresolve(userId,info)
Behaviors会话列表/聊天页/头像/引用优先调用 provider;缺失时回退 userId 首字;provider 抛错不阻断消息渲染,记录日志并回退

真实签名(bindings.ios.imkit.features)​

语言签名
Swiftprotocol IMPUserInfoProvider: AnyObject { func userInfo(userId: String) async -> IMPKitUserInfo? }
Objective-C@protocol IMPOSUserInfoProvider <NSObject> - (void)userInfoWithUserId:(NSString *)userId completion:(void (^)(IMPOSKitUserInfo * _Nullable))completion; @end

Swift 接入示例​

Swift
final class HostentrustcontactUserInfoProvider: IMPUserInfoProvider {
    func userInfo(userId: String) async -> IMPKitUserInfo? {
        IMPKitUserInfo(userId: userId, name: "Bob", avatarUrl: nil)
    }
}
let userInfoProvider: IMPUserInfoProvider = HostentrustcontactUserInfoProvider()

Objective-C 接入示例​

Objective-C
@interface IMPOSHostentrustcontactUserInfoProvider : NSObject <IMPOSUserInfoProvider>
@end
@implementation IMPOSHostentrustcontactUserInfoProvider
- (void)userInfoWithUserId:(NSString *)userId completion:(void (^)(IMPOSKitUserInfo * _Nullable))completion {
    completion(nil);
}
@end

组件:GroupMemberProvider​

群成员资料托管:成员昵称/群昵称/头像

契约项内容
Propsprovider:(groupId,userId) async -> IMPKitGroupMemberInfo?
Eventsresolve(groupId,userId,info)
Behaviors群聊气泡/已读明细/输入状态使用成员资料;成员资料缓存按会话维度失效

真实签名(bindings.ios.imkit.features)​

语言签名
Swiftprotocol IMPGroupMemberProvider: AnyObject { func memberInfo(groupId: String, userId: String) async -> IMPKitGroupMemberInfo? }
Objective-C@protocol IMPOSGroupMemberProvider <NSObject> - (void)memberInfoWithGroupId:(NSString *)groupId userId:(NSString *)userId completion:(void (^)(IMPOSKitGroupMemberInfo * _Nullable))completion; @end

Swift 接入示例​

Swift
final class HostentrustcontactGroupMemberProvider: IMPGroupMemberProvider {
    func memberInfo(groupId: String, userId: String) async -> IMPKitGroupMemberInfo? {
        IMPKitGroupMemberInfo(groupId: groupId, userId: userId, name: "Bob", groupNickname: nil)
    }
}
let groupMemberProvider: IMPGroupMemberProvider = HostentrustcontactGroupMemberProvider()

Objective-C 接入示例​

Objective-C
@interface IMPOSHostentrustcontactGroupMemberProvider : NSObject <IMPOSGroupMemberProvider>
@end
@implementation IMPOSHostentrustcontactGroupMemberProvider
- (void)memberInfoWithGroupId:(NSString *)groupId userId:(NSString *)userId completion:(void (^)(IMPOSKitGroupMemberInfo * _Nullable))completion {
    completion(nil);
}
@end

组件:ContactListController​

联系人页控制器:好友列表/申请/备注/删除/黑名单

契约项内容
Propsclient:IMPClient
EventsfriendsChanged([IMPUserInfo]) requestsChanged([IMPFriendRequest]) error(Error)
BehaviorsloadFriends/loadRequests/accept/reject/delete/remark/blacklist add/remove 调 IMLib op;操作成功后本地状态刷新并通知;错误透传不吞没

真实签名(bindings.ios.imkit.features)​

语言签名
SwiftIMPContactListController(client: IMPClient)
Objective-C- (instancetype)initWithClient:(IMPOSClient *)client;

Swift 接入示例​

Swift
let contacts = IMPContactListController(client: client)

Objective-C 接入示例​

Objective-C
IMPOSContactListController *contacts = [[IMPOSContactListController alloc] initWithClient:client];

注入方式与回退策略​

  • 宿主实现 UserInfoProvider / GroupInfoProvider / GroupMemberProvider,并由宿主页面把 provider 注入 IMKit 渲染上下文;协议声明来自 bindings.ios.imkit.features。
  • provider 返回 nil 或抛错时回退 userId/groupId 首字;不阻断消息与列表渲染,记录日志。
  • 资料缓存由宿主控制 TTL;群/成员资料变更时主动 invalidate,下一次渲染重新拉取。

与融云对应页 / 差异​

项内容
融云页面ios-imkit/info-entrust/entrust-contact(好友列表页面)
融云接口状态部分覆盖(主路径可用,子能力缺失)
我方对应UserInfoProvider、GroupMemberProvider、ContactListController
差异说明好友数据由 IMLib + ContactListController(rev28)提供;好友列表 UI 仍宿主实现

相关错误码​

错误码名称含义处理
1001INVALID_PARAMETER参数错误修正参数/权限后重试
1002INVALID_TOKENToken 无效或已过期修正参数/权限后重试
1007MESSAGE_TOO_LARGE消息体过大(上限 5KB)修正参数/权限后重试
1009GROUP_MUTED你已被禁言修正参数/权限后重试
1010SENSITIVE_WORD内容包含敏感词修正参数/权限后重试
3001SDK_NOT_CONNECTED长连接未就绪可重试(退避)
3002SDK_TIMEOUT请求超时可重试(退避)
3003SDK_NETWORK_ERROR网络错误可重试(退避)

相关页面​