全部文档

更新时间: 2021-03-08

以下内容为快速集成摘要,具体细节可依次参考全局配置

# 导入 SDK

环境要求

名称 版本
Xcode 11 +
手机系统 8.0 +

SDK 支持使用 CocoaPods 导入并管理 SDK。 需安装 CocoaPods 环境,请参照 CocoaPods 安装 (opens new window)

导入 SDK

  1. cd 至项目根目录

  2. 执行 pod init

  3. 执行 open -e Podfile

  4. Podfile 文件中添加下面内容

    pod 'RongCloudIM/IMKit', '~> 4.0.3.3'
    pod 'RongCloudIM/IMLib', '~> 4.0.3.3'
    
    已复制
    1
    2

    如需指定具体版本,请注意 pod 使用规范 (opens new window)。 请点击 SDK下载页 (opens new window) 获知最新版本。

  5. 执行 pod install

  6. 双击打开 .xcworkspace

# 初始化

  1. 引入

使用 SDK 功能前,需要 import 下面的头文件,Swift 项目需要在工程的 Bridging-Header.h 文件中添加 SDK 的引用。

#import <RongIMKit/RongIMKit.h>
已复制
1
  1. 调用初始化方法
  1. 请使用从 融云开发者管理后台 (opens new window) 注册得到的 AppKey,通过 RCIM 的单例,传入 initWithAppKey: 方法初始化 SDK。
  2. 开发者在使用融云 SDK 所有功能之前,必须先调用此方法初始化 SDK。 在 App 的整个生命周期中,开发者只需要将 SDK 初始化一次。
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
    [[RCIM sharedRCIM] initWithAppKey:@"获取到的 AppKey"];
}
已复制
1
2
3

# 连接 IM

将通过 Server 获取到的 Token,通过 RCIM 的单例,调用下面的方法,即可建立与服务器的连接。

在 App 整个生命周期,开发者只需要调用一次此方法与融云服务器建立连接。之后无论是网络出现异常或者 App 有前后台的切换等,SDK 都会负责自动重连。除非已经手动将连接断开,否则不需要自己再手动重连。

当出现 SDK 无法处理的错误(如 SDK 没有初始化、token 非法)时,SDK 将停止连接,并通过 errorBlock 进行回调。

- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
    [[RCIM sharedRCIM] initWithAppKey:@"获取到的 AppKey"];
    [[RCIM sharedRCIM] connectWithToken:@"开发者的 server 通过请求 server api 获取到的 token 值"
                           dbOpened:^(RCDBErrorCode code) {}
                            success:^(NSString *userId) {}
                              error:^(RCConnectErrorCode status) {}];
}
已复制
1
2
3
4
5
6
7

# 构建会话列表

新建一个继承于 RCConversationListViewController 的控制器 CustomConversationListViewController, 初始化控制器对象并设置需要显示的会话类型和需要聚合显示的会话类型。此处将会话列表页当做 Window 的根视图,实际开发中开发者需根据业务场景决定。

  1. 导入会话列表页子类头文件
#import "CustomConversationListViewController.h"
已复制
1
  1. 替换根视图
- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
    [[RCIM sharedRCIM] initWithAppKey:@"获取到的 AppKey"];
    [[RCIM sharedRCIM] connectWithToken:@"开发者的 server 通过请求 server api 获取到的 token 值"
                           dbOpened:^(RCDBErrorCode code) {}
                            success:^(NSString *userId) {}
                              error:^(RCConnectErrorCode status) {}];
  
	UIWindowScene *windowScene = (UIWindowScene *)scene;
    self.window = [[UIWindow alloc] initWithWindowScene:windowScene];
    self.window.frame = [UIScreen mainScreen].bounds;
    CustomConversationListViewController *conversationListViewController = [[CustomConversationListViewController alloc] initWithDisplayConversationTypes:@[@(ConversationType_PRIVATE),@(ConversationType_GROUP),@(ConversationType_SYSTEM)] collectionConversationType:@[@(ConversationType_SYSTEM)]];
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:conversationListViewController];
    self.window.rootViewController = navigationController;
    [self.window makeKeyAndVisible];
}
已复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

会话列表页需要从融云数据库中读取会话信息进行展示,实际使用中应该在连接接口的 dbOpenedBlock 中进行页面跳转,这里为了演示方便使用了顺序调用的方式。连接接口的回调不是在主线程,开发者在 dbOpenedBlock 中进行页面跳转时请记得先切换到主线程。

# 构建会话页面

第一次连接成功时,由于没有任何消息,会话列表页显示空白。开发者可以在 CustomConversationListViewController 的导航栏添加按钮,用来开启一个单聊会话。

- (void)viewDidLoad {
    [super viewDidLoad];
    
    UIBarButtonItem *rightButton = [[UIBarButtonItem alloc] initWithTitle:@"开启单聊" style:UIBarButtonItemStylePlain target:self action:@selector
                                    (rightBarButtonItemPressed:)];
    self.navigationItem.rightBarButtonItem = rightButton;
}

- (void)rightBarButtonItemPressed:(id)sender {
    RCConversationViewController *conversationVC = [[RCConversationViewController alloc] init];
    conversationVC.conversationType = ConversationType_PRIVATE;
    conversationVC.targetId = @"888";
    [self.navigationController pushViewController:conversationVC animated:YES];
}
已复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14

CustomConversationListViewController 中重写 RCConversationListViewControlleronSelectedTableRow 事件并传入 conversationTypetargetId,即可点击进入聊天会话界面

- (void)onSelectedTableRow:(RCConversationModelType)conversationModelType conversationModel:(RCConversationModel *)model atIndexPath:(NSIndexPath *)indexPath {

    RCConversationViewController *conversationVC = [[RCConversationViewController alloc] initWithConversationType:model.conversationType targetId:model.targetId];
    //会话标题
    conversationVC.title = @"想显示的会话标题";
    [self.navigationController pushViewController:conversationVC animated:YES];
}
已复制
1
2
3
4
5
6
7

# 设置用户信息

此处用户信息仅用于演示,开发者需要根据自身业务更换为真实的用户信息。


- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
    [[RCIM sharedRCIM] initWithAppKey:@"获取到的 AppKey"];
    [[RCIM sharedRCIM] connectWithToken:@"开发者的 server 通过请求 server api 获取到的 token 值"
                           dbOpened:^(RCDBErrorCode code) {}
                            success:^(NSString *userId) {}
                              error:^(RCConnectErrorCode status) {}];
  
	UIWindowScene *windowScene = (UIWindowScene *)scene;
    self.window = [[UIWindow alloc] initWithWindowScene:windowScene];
    self.window.frame = [UIScreen mainScreen].bounds;
    CustomConversationListViewController *conversationListViewController = [[CustomConversationListViewController alloc] initWithDisplayConversationTypes:@[@(ConversationType_PRIVATE),@(ConversationType_GROUP),@(ConversationType_SYSTEM)] collectionConversationType:@[@(ConversationType_SYSTEM)]];
    UINavigationController *navigationController = [[UINavigationController alloc] initWithRootViewController:conversationListViewController];
    self.window.rootViewController = navigationController;
    [self.window makeKeyAndVisible];

    //添加用户信息代理
    [RCIM sharedRCIM].userInfoDataSource = self;
  	//设置用户信息在本地持久化存储。SDK 获取过的用户信息将保存在数据库中,即使 App 重新启动也能再次读取。
    [RCIM sharedRCIM].enablePersistentUserInfoCache = YES;
}

// 实现用户信息提供者的代理函数
- (void)getUserInfoWithUserId:(NSString *)userId completion:(void (^)(RCUserInfo *))completion {
    //开发者需要将 userId 对应的用户信息返回,下列仅为示例
  	//实际项目中,开发者有可能需要到 App Server 获取 userId 对应的用户信息,再通过 completion 返回给 SDK。
    if ([userId isEqualToString:@"888"]) {
        RCUserInfo *userInfo = [[RCUserInfo alloc] initWithUserId:@"888" name:@"融融" portrait:@"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1568875876191&di=2933bebe9b22899f59840c33b24a1f98&imgtype=0&src=http%3A%2F%2Fimg.mp.itc.cn%2Fupload%2F20161119%2F7205fcb7ca4149c1920c01524112cbd9_th.jpg"];
        if (completion) {
            completion(userInfo);
        }
    }
}
已复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33

文档是否解决您的问题 ?

如果遇到产品相关问题,您可 提交工单 寻求帮助