跳到主要内容

实现音视频通话

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

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

环境要求​

  • 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,您可以前往控制台的密钥管理页面,在 管理测试用户 区域输入用户 ID 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 的用户信息的设置,具体参考用户信息设置。

定制化​

  • 接入扩展插件:CallKit 可以接入官方美颜插件或相芯美颜插件。注意,相芯美颜插件要求 CallKit 版本 ≧ 5.4.0。详见 CallLib 文档美颜插件。
  • 如何获取 RCCallSession:RongCallKit 非源码如何获取 RCCallSession