群组页面
群组页面:信息托管页面用 IMKit 的列表/详情能力承载好友、群组与用户资料;页面级路由与数据编排由宿主完成。
适用场景
- 快速搭出通讯录/群组/用户资料页
- 需要与既有账号体系打通
- 需要搜索、申请、管理的完整交互
前置条件
- 已导入 IMKit 并完成初始化
- IMLib 已连接且有好友/群组数据
- 宿主提供导航容器
rev28 契约状态
已实现 / 部分覆盖
rev28 已冻结 IMKit features 8 组件与 Swift/ObjC 绑定;本页覆盖信息托管/群管理/联系人/多选/转发/引用的契约接入,未覆盖的特别关注/搜索用户等仍按能力边界说明。
组件:GroupInfoProvider
群资料托管:群名称/头像/公告
| 契约项 | 内容 |
|---|---|
| Props | provider:(groupId) async -> IMPKitGroupInfo? |
| Events | resolve(groupId,info) |
| Behaviors | 群会话标题/头像使用 provider;缺失回退 groupId;群资料更新可主动 invalidate 缓存 |
真实签名(bindings.ios.imkit.features)
| 语言 | 签名 |
|---|---|
| Swift | protocol IMPGroupInfoProvider: AnyObject { func groupInfo(groupId: String) async -> IMPKitGroupInfo? } |
| Objective-C | @protocol IMPOSGroupInfoProvider <NSObject> - (void)groupInfoWithGroupId:(NSString *)groupId completion:(void (^)(IMPOSKitGroupInfo * _Nullable))completion; @end |
Swift 接入示例
Swift
final class HostentrustgroupGroupInfoProvider: IMPGroupInfoProvider {
func groupInfo(groupId: String) async -> IMPKitGroupInfo? {
IMPKitGroupInfo(groupId: groupId, name: "产品群", avatarUrl: nil)
}
}
let groupInfoProvider: IMPGroupInfoProvider = HostentrustgroupGroupInfoProvider()Objective-C 接入示例
Objective-C
@interface IMPOSHostentrustgroupGroupInfoProvider : NSObject <IMPOSGroupInfoProvider>
@end
@implementation IMPOSHostentrustgroupGroupInfoProvider
- (void)groupInfoWithGroupId:(NSString *)groupId completion:(void (^)(IMPOSKitGroupInfo * _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 HostentrustgroupGroupMemberProvider: IMPGroupMemberProvider {
func memberInfo(groupId: String, userId: String) async -> IMPKitGroupMemberInfo? {
IMPKitGroupMemberInfo(groupId: groupId, userId: userId, name: "Bob", groupNickname: nil)
}
}
let groupMemberProvider: IMPGroupMemberProvider = HostentrustgroupGroupMemberProvider()Objective-C 接入示例
Objective-C
@interface IMPOSHostentrustgroupGroupMemberProvider : NSObject <IMPOSGroupMemberProvider>
@end
@implementation IMPOSHostentrustgroupGroupMemberProvider
- (void)memberInfoWithGroupId:(NSString *)groupId userId:(NSString *)userId completion:(void (^)(IMPOSKitGroupMemberInfo * _Nullable))completion {
completion(nil);
}
@end组件:GroupManagementController
群管理页控制器:成员列表/加人/移除/禁言/管理员/转让/改名/公告/退群(仅调 IMLib 公开接口)
| 契约项 | 内容 |
|---|---|
| Props | client:IMPClient groupId:String options?:{canManage:Bool} |
| Events | membersChanged([IMPGroupMember]) groupInfoChanged(IMPGroup) error(Error) |
| Behaviors | loadMembers 分页/刷新;addMembers/removeMembers/muteMember/setAdmin/transferOwner/updateName/updateNotice/quitGroup 调用对应 IMLib op;权限不足/群不存在等错误透传;操作后刷新群资料与成员;不自行导航 |
真实签名(bindings.ios.imkit.features)
| 语言 | 签名 |
|---|---|
| Swift | IMPGroupManagementController(client: IMPClient, groupId: String, options: IMPGroupManagementOptions?) |
| Objective-C | - (instancetype)initWithClient:(IMPOSClient *)client groupId:(NSString *)groupId options:(IMPOSGroupManagementOptions *)options; |
Swift 接入示例
Swift
let groupManager = IMPGroupManagementController(client: client, groupId: "g_1001", options: nil)Objective-C 接入示例
Objective-C
IMPOSGroupManagementController *groupManager = [[IMPOSGroupManagementController alloc] initWithClient:client groupId:@"g_1001" options:nil];注入方式与回退策略
- 宿主实现 UserInfoProvider / GroupInfoProvider / GroupMemberProvider,并由宿主页面把 provider 注入 IMKit 渲染上下文;协议声明来自 bindings.ios.imkit.features。
- provider 返回 nil 或抛错时回退 userId/groupId 首字;不阻断消息与列表渲染,记录日志。
- 资料缓存由宿主控制 TTL;群/成员资料变更时主动 invalidate,下一次渲染重新拉取。
与融云对应页 / 差异
| 项 | 内容 |
|---|---|
| 融云页面 | ios-imkit/info-entrust/entrust-group(群组页面) |
| 融云接口状态 | 部分覆盖(主路径可用,子能力缺失) |
| 我方对应 | GroupInfoProvider、GroupMemberProvider |
| 差异说明 | 群/成员资料通过 rev27 provider 托管;群管理/转让/特别关注页面仍边界 |
相关错误码
| 错误码 | 名称 | 含义 | 处理 |
|---|---|---|---|
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 | 网络错误 | 可重试(退避) |