会话列表页面
会话列表页面展示了当前用户设备上的所有会话。一旦 SDK 的本地消息数据库生成消息,SDK 就会生成会话列表,并按照时间倒序排列,置顶会话会排在最前。IMKit 提供基于 UIKit UITableView
的会话页面类 RCConversationListViewController
。
会话列表页面
会话列表页面一般由标题栏和会话列表两部分组成。
如需显示会话列表的昵称和头像,您需要为 IMKit 设置一个用户信息提供者。IMKit 通过用户信息提供者获取需要显示的资料数据。详情请参见用户信息。
初始化
基于 IMKit 开发时,推荐继承使用 RCConversationListViewController
类,创建自定义的会话列表页面。在排查或复现与会话页面相关的问题时,可以直接使用 RCConversationListViewController
类。
调用 RCConversationListViewController
类的初始化方法构建会话列表页面,设置会话列表中需要包含的会话的类型。注意,您需要将 RCConversationType
转为 NSNumber构建 Array。
NSArray *displayConversationTypeArray = @[@(ConversationType_PRIVATE), @(ConversationType_GROUP), @(ConversationType_SYSTEM)];
NSArray *collectionConversationTypeArray = nil;
RCConversationListViewController *conversationListVC = [[RCDChatListViewController alloc] initWithDisplayConversationTypes:displayConversationTypeArray collectionConversationType:collectionConversationTypeArray];
[self.navigationController pushViewController:conversationListVC animated:YES];
参数 | 类型 | 说明 |
---|---|---|
displayConversationTypeArray | NSArray (NSNumber *) | 列表中需要显示的会话类型数组。需要将 RCConversationType 转为 NSNumber构建 Array。 |
collectionConversationTypeArray | NSArray (NSNumber *) | 列表中需要聚合为一条显示的会话类型数组。您需要将 RCConversationType 转为 NSNumber构建 Array。详见按类型聚合会话。 |
用法
标题栏
IMKit 的 RCConversationListViewController
使用了系统的导航栏,可用于显示会话列表的标题,自行通过 UIViewController
的 title
属性设置标题。详情请参见用户信息。
会话列表
会话列表组件按时间倒序显示所有会话的列表,置顶会话会排在最前。IMKit 默认已实现了左滑会话 Cell 删除会话功能。
会话列表的每个项目的视图是在 RCConversationCell
中创建和自定义的。您还可以创建自定义会话 Cell。
如果开启了多设备消息同步,在 换新设备登录 或 应用卸载重装 场景下,离线补偿机制仅可获取到最近(默认离线补偿天数为 1 天,最大 7 天)的单聊、群聊会话消息。早于该天数的会话无法通过离线补偿机制获取。因此,离线补偿后的会话列表可能与原设备上或卸载前的会话列表并不一致(您可能会有丢失部分会话的错觉)。
定制化
IMKit 会话列表界面的样式可供自定义修改。
修改会话头像形状
会话列表中的每个会话项目上均会显示一个头像图标,即会话头像(不是聊天页面内中消息列表中的头像)。单聊会话显示对方用户头像,群聊会话显示群组头像,聚合会话显示默认头像或应用程序主动设置的头像。IMKit 支持通过 IMKit 全局配置单独控制会话列表中的会话头像样式。
会话头像显示默认为矩形,可修改为圆形。头像显示大小默认值为 46*46
。请在 App 初始化之后调用以下代码进行设置:
RCKitConfigCenter.ui.globalConversationAvatarStyle = RC_USER_AVATAR_CYCLE;
RCUserAvatarStyle
说明:
类型名 | 说明 |
---|---|
RC_USER_AVATAR_RECTANGLE | 矩形 |
RC_USER_AVATAR_CYCLE | 圆形 |
会话头像高度必须大于或者等于 36,修改方法如下:
RCKitConfigCenter.ui.globalConversationPortraitSize = CGSizeMake(46, 46);
是否展示网络连接状态提示
当连接断开或者重连时,SDK 会在会话列表页面顶部展示连接状态提示栏。该功能默认开启。可通过 RCConversationListViewController
的属性关闭该提示。
@property (nonatomic, assign) BOOL isShowNetworkIndicatorView;
如需修改提示文字,可修改语言包中的 en.lproj
和 zh-Hans.lproj
。
自定义空视图
RCConversationListViewController
中提供了会话列表空视图 emptyConversationView
(即无会话需要显示)。如果您需要自定义空视图 View,赋值给 emptyConversationView
即可。
- (void)viewDidLoad {
[super viewDidLoad];
//视图的 frame 需要开发者根据需求设定
UIImageView *empty = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
empty.center = self.view.center;
empty.backgroundColor = [UIColor redColor];
self.emptyConversationView = empty;
}
自定义会话 Cell
您可以参考融云的开源项目 SealTalk(GitHub · Gitee)中会话列表 RCDChatListViewController
类中相关方法实现和自定义 Cell(RCDChatListCell
)。SealTalk 示例项目具体是针对系统会话( ConversationType_SYSTEM
)的好友请求消息( RCContactNotificationMessage
)制作了自定义 Cell。
-
重写数据源方法。
在该方法内筛选数据源
dataSource
中具体的会话类型及消息的model
。model
类型必须修改为model.conversationModelType = RC_CONVERSATION_MODEL_TYPE_CUSTOMIZATION
。-(NSMutableArray *)willReloadTableData:(NSMutableArray *)dataSource;
-
重写自定义 Cell。
// 自定义 cell
-(RCConversationBaseCell *)rcConversationListTableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath; -
重写自定义 Cell 高度的方法。
// 高度
-(CGFloat)rcConversationListTableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath; -
重写收到消息处理方法。
在方法里生成新的 model,插入会话列表数据源
conversationListDataSource
,更新页面。生成的model
类型conversationModelType
必须是RC_CONVERSATION_MODEL_TYPE_CUSTOMIZATION
。#pragma mark - 收到消息监听
-(void)didReceiveMessageNotification:(NSNotification *)notification;
卸载重装或换设备登录后的处理方案
如果您的用户卸载重装或换设备登录,可能会发现会话列表为空,或者有部分会话丢失的错觉。
原因如下:
- 在卸载的时候会删除本地数据库,本地没有任何历史消息,导致重新安装后会话列表为空。
- 如果换设备登录,可能本地没有历史消息数据,导致会话列表为空。
- 如果您的 App Key 开启了多设备消息同步 功能,服务端会同时启用离线消息补偿功能。服务端会在 SDK 连接成功后自动同步当天 0 点后的消息,客户端 SDK 接收到服务端补偿的消息后,可生成部分会话和会话列表。与卸载前或换设备前比较,可能会有部分会话丢失的错觉。
如果您希望在卸载重装或换设备登录后,获取到之前的会话列表,可以参考如下方案:
- 申请增加离线消息补偿的天数,最大可修改为 7 天。注意,设置时间过长,当单用户消息量超大时,可能会因为补偿消息量过大,造成端上处理压力的问题。如有需要,请[提交工单]。
- 在您的服务器中自行维护会话列表,并通过 API 向服务端获取需要展示的历史消息。
[提交工单]: https://console.rongcloud.cn/agile/formwork/ticket/create