跳到主要内容

实现音视频通话

本教程旨在帮助开发者快速了解和掌握 CallKit SDK(融云音视频呼叫能力库)的基础集成流程与核心通话功能。CallKit 是在 CallLib 基础上,增加了一套默认呼叫界面的音视频呼叫功能 SDK,包含了单人、多人音视频呼叫的各种场景和功能,您可以快速的集成它来实现音视频呼叫场景。我们还提供了这个模块的开源代码GitHub · Gitee),您可以根据业务需要进行界面修改。

房间人数上限
  • 考虑移动设备的带宽(主要是在多路视频情况下)和 UI 交互效果,建议单次通话或房间内,视频不超过 16 人,纯音频不超过 32 人。超过此上限可能影响通话效果。
  • CallKit 代码中已设置人数上限。默认发起视频呼叫时,最多可选 7 人。发起音频呼叫时,最多可选 20 人。如需调整,建议勿超过建议上限。
  • CallKit 为开源 SDK,可自行修改上限(修改方法:RCCallmaxMultiVideoCallUserNumbermaxMultiAudioCallUserNumber)。

环境要求

  • Xcode 需要使用 Xcode 11 及以上的版本。
  • 苹果设备的系统需要使用 iOS 9.0 及以上的版本。
  • 需要真机设备运行测试相关音视频通话功能。
  • 如果您打算通过 CocoaPods 集成 SDK,需要使用 CocoaPods 1.10.0 及以上的版本。这是因为 CallKit SDK 5.1.1 版本后变更为 XCFramework,而 CocoaPods 是从 1.10.0 版本后才完整支持 XCFramework 的集成方式,具体请参见知识库文档
提示

如需安装 CocoaPods 环境,请参照 安装 CocoaPods

准备工作

  1. 访问融云控制台,注册您的开发者账号。注册成功后,控制台自动在开发环境中为您创建一个应用。

  2. 在控制台的基本信息页,获取您的应用在开发环境的 App Key。您可在基本信息页查看应用的信息,如 App Key、App Secret、所属数据中心(默认为北京)。 alt text 如您想自己创建应用,参考如何创建应用,并获取对应环境 App Key 和 App Secret

    提示

    每个应用均拥有两个不同的 App Key,分别对应开发环境与生产环境,且两个环境之间数据相互隔离。在您的应用正式上线前,建议切换到生产环境的 App Key,以便完成上线前全流程测试和最终发布。

服务开通

您在融云创建的应用默认不会启用音视频服务。在使用融云提供的任何音视频服务前,您需要前往控制台,为应用开通音视频服务。

具体步骤请参阅控制台文档开通音视频服务

提示
  • 服务开通、关闭等设置完成后 15 分钟后生效。
  • 客户端配置文件更新最长 2 小时,您可以在服务生效后卸载重装来立刻获取最新配置。

导入 SDK

融云支持通过 CocoaPods 添加远程依赖和将 CallKit 的相关 XCFramework 本地库导入应用工程两种集成方式。下文以通过 CocoaPods 添加远程依赖为示例。

  1. 如果您的项目中没有 Podfile 文件,您需要打开终端并进入到项目的根目录,在终端中运行 pod init 命令,之后系统会自动创建一个默认的 Podfile 文件,在项目中的 Podfile 文件中添加如下内容:

    ruby
    pod 'RongCloudRTC/RongCallKit', '~> x.y.z'
    提示
    • CallKit 会自动依赖下载对应版本的 IMKit 库,一般不需要手动指定。注意,从 5.2.0 版本至 5.4.4(不含),CallKit 必须与其依赖的 IMKit/IMLib SDK 保持版本一致(前三位必须保持一致)。从 5.4.4 开始,CallKit 与其依赖的 IMKit/IMLib SDK 版本号前两位保持一致。CallKit 5.4.4 不可匹配小于 5.4.4 的 IMKit/IMLib SDK。
    • x.y.z 代表 CallKit 具体的版本号,您可以在融云官网 SDK 下载页面或在终端中通过先执行 pod repo update,再执行 pod search RongCloudRTC 命令在 CocoaPods 仓库查询 CallKit 最新的版本。
  2. 打开终端并进入到 Podfile 文件所在的目录,在终端中运行以下命令:

    shell
    pod install
    提示

    如果终端中出现类似 CocoaPods could not find compatible versions for 等找不到相关版本的报错,可先在终端中执行 pod repo update 命令,再执行 pod install 命令。

  3. 通过 Xcode 打开项目目录下的 xcworkspace 文件加载工程。

初始化 SDK

CallKit 是基于 IM SDK 作为信令通道的,您须调用 init 方法初始化 IM SDK。初始化前,您须在融云控制台中获取 App Key,并设置好 RCInitOption(初始化配置)。

IM SDK 相关接口的调用都需要导入 SDK 的头文件:

Objective C
#import <RongIMKit/RongIMKit.h>

RCInitOption 中封装了 areaCode (数据中心的区域码),naviServer(导航服务地址)、fileServer(文件服务地址)、statisticServer(数据统计服务地址)和 crashMonitorEnable(崩溃监控开关)。详见初始化

如果您使用北京数据中心,则不需设置 RCInitOption,IM SDK 默认连接北京数据中心。

Objective C
NSString *appKey = @"Your_AppKey"; // example: bos9p5rlcm2ba
RCInitOption *initOption = nil;

[[RCIM sharedRCIM] initWithAppKey:appKey option:initOption];

如果您使用海外数据中心,则须传入海外数据中心对应的 AreaCode。

Objective C
NSString *appKey = @"Your_AppKey"; // example: bos9p5rlcm2ba
RCInitOption *initOption = [[RCInitOption alloc] init];
initOption.areaCode = RCAreaCodeSG;// 新加坡数据中心

[[RCIM sharedRCIM] initWithAppKey:appKey option:initOption];
提示
  • 如果您使用的开发版 CallKit SDK 版本号小于 5.4.2,或者稳定版 CallKit SDK 版本号小于等于 5.3.8,则您须调用 RCIM 的 initWithAppKey 方法,并传入 App Key 来进行初始化。详见初始化
  • 初始化 SDK 与连接 IM 需要调用 RCIM 的相关方法,确保 CallKit 相关代理可以正确设置。

连接融云 IM 服务器

用户 Token 是与用户 ID 对应的身份验证令牌,是应用程序的用户在融云的唯一身份标识。音视频用户之间的信令传输依赖于融云的 IM 服务,与融云建立 IM 连接,连接时必须传入 Token。

在实际业务运行过程中,应用客户端需要通过应用服务器调用 IM Server API 申请取得 Token。详见 Server API 文档 注册用户

在本教程中,为了快速体验和测试 SDK,我们将使用控制台「北极星」开发者工具箱,从 API 调试页面调用 获取 Token 接口,获取到 userId 为 1 的用户的 Token。提交后,可在返回正文中取得 Token 字符串。

Objective C
[[RCIM sharedRCIM] connectWithToken:@"从您应用服务器获取的 Token"
dbOpened:^(RCDBErrorCode code) {
if (code != RCDBErrorCode_Success) {
// 数据库打开失败,处理
}
}
success:^(NSString *userId) {
// 连接成功,处理
}
error:^(RCConnectErrorCode status) {
// 连接失败,处理
}];

呼叫方

通常 App 内呼叫和被叫方逻辑会同时存在,所以需要分别集成。

发起单人呼叫

接口原型

Objective C
- (void)startSingleCall:(NSString *)targetId mediaType:(RCCallMediaType)mediaType;

参数说明

参数类型必填说明
targetIdNSString对方的用户 ID
mediaTypeRCCallMediaType媒体类型

示例代码:

Objective C
[[RCCall sharedRCCall] startSingleCall:@"被叫端UserId" mediaType:RCCallMediaVideo];

发起多人呼叫

多人通话依赖群组 ConversationType_GROUP,被呼叫的用户必须在同一个群组里。

接口原型

Objective C
- (void)startMultiCallViewController:(RCConversationType)conversationType
targetId:(NSString *)targetId
mediaType:(RCCallMediaType)mediaType
userIdList:(NSArray *)userIdList;

参数说明:

参数类型必填说明
conversationTypeRCConversationType会话类型 
targetIdNSString群组 ID
mediaTypeRCCallMediaType媒体类型
userIdListNSArray被叫用户 ID 列表

示例代码:

Objective C
[[RCCall sharedRCCall] startMultiCallViewController:ConversationType_GROUP
targetId:@"群组ID"
mediaType:RCCallMediaVideo
userIdList:@[@"被叫用户A", @"被叫用户B", @"被叫用户C"]];

选择成员发起通话

此方法会先弹出选择成员界面,选择完成后再使用上面的方法发起多人通话。如果您需要在群组中调用此接口发起多人会话,需要设置并实现 groupMemberDataSource

接口原型

Objective C
- (void)startMultiCall:(RCConversationType)conversationType
targetId:(NSString *)targetId
mediaType:(RCCallMediaType)mediaType;

参数说明:

参数类型必填说明
conversationTypeRCConversationType会话类型 
targetIdNSString群组 ID
mediaTypeRCCallMediaType媒体类型

示例代码:

Objective C
[[RCCall sharedRCCall] startMultiCall:ConversationType_GROUP
targetId:@"群组ID"
mediaType:RCCallMediaVideo];

接听方

CallKit 中已经默认实现了 RongCallLib 库提供的 RCCallReceiveDelegate(来电监听) 和 RCCallSessionDelegate(通话状态)代理。被叫端收到呼叫,会自动弹出通话界面,点击来电页面的接听按钮即可接听通话。

当 App 在后台或者未启动时会收到来电通知,点击来电通知条 App 打开后,IM 连接成功后会显示来电页面。

用户信息展示

音视频通话界面的用户信息展示依赖 IM 的用户信息的设置,具体参考用户信息设置

定制化