好友列表页面
好友列表页面:信息托管页面用 IMKit 的列表/详情能力承载好友、群组与用户资料;页面级路由与数据编排由宿主完成。
适用场景
- 快速搭出通讯录/群组/用户资料页
- 需要与既有账号体系打通
- 需要搜索、申请、管理的完整交互
前置条件
- 已导入 IMKit 并完成初始化
- IMLib 已连接且有好友/群组数据
- 宿主提供导航容器
rev28 契约状态
已实现 / 部分覆盖
rev28 已冻结 IMKit features 8 组件与 Swift/ObjC 绑定;本页覆盖信息托管/群管理/联系人/多选/转发/引用的契约接入,未覆盖的特别关注/搜索用户等仍按能力边界说明。
组件:UserInfoProvider
用户资料托管:宿主按 userId 返回昵称/头像/扩展
| 契约项 | 内容 |
|---|---|
| Props | provider:(userId) async -> IMPKitUserInfo? |
| Events | resolve(userId,info) |
| Behaviors | 会话列表/聊天页/头像/引用优先调用 provider;缺失时回退 userId 首字;provider 抛错不阻断消息渲染,记录日志并回退 |
真实签名(bindings.ios.imkit.features)
| 语言 | 签名 |
|---|---|
| Swift | protocol 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
群成员资料托管:成员昵称/群昵称/头像
| 契约项 | 内容 |
|---|---|
| Props | provider:(groupId,userId) async -> IMPKitGroupMemberInfo? |
| Events | resolve(groupId,userId,info) |
| Behaviors | 群聊气泡/已读明细/输入状态使用成员资料;成员资料缓存按会话维度失效 |
真实签名(bindings.ios.imkit.features)
| 语言 | 签名 |
|---|---|
| Swift | protocol 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
联系人页控制器:好友列表/申请/备注/删除/黑名单
| 契约项 | 内容 |
|---|---|
| Props | client:IMPClient |
| Events | friendsChanged([IMPUserInfo]) requestsChanged([IMPFriendRequest]) error(Error) |
| Behaviors | loadFriends/loadRequests/accept/reject/delete/remark/blacklist add/remove 调 IMLib op;操作成功后本地状态刷新并通知;错误透传不吞没 |
真实签名(bindings.ios.imkit.features)
| 语言 | 签名 |
|---|---|
| Swift | IMPContactListController(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 仍宿主实现 |
相关错误码
| 错误码 | 名称 | 含义 | 处理 |
|---|---|---|---|
1001 | INVALID_PARAMETER | 参数错误 | 修正参数/权限后重试 |
1002 | INVALID_TOKEN | Token 无效或已过期 | 修正参数/权限后重试 |
1007 | MESSAGE_TOO_LARGE | 消息体过大(上限 5KB) | 修正参数/权限后重试 |
1009 | GROUP_MUTED | 你已被禁言 | 修正参数/权限后重试 |
1010 | SENSITIVE_WORD | 内容包含敏感词 | 修正参数/权限后重试 |
3001 | SDK_NOT_CONNECTED | 长连接未就绪 | 可重试(退避) |
3002 | SDK_TIMEOUT | 请求超时 | 可重试(退避) |
3003 | SDK_NETWORK_ERROR | 网络错误 | 可重试(退避) |