跳到主要内容

实现首次通话

CallKit 基于 CallLib SDK 基础增加了一套默认呼叫界面,包含了单人、多人音视频呼叫的各种场景和功能。

提示

房间人数上限

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

环境要求​

适用于 iOS 的 CallKit SDK 的最低要求是:

  • iOS 9.0 及以上。
  • Xcode 9.0 或以上版本。

前置条件​

  • 创建融云开发者账号,获取 App Key。注册成功后,融云控制台会默认自动创建您的首个应用,默认生成开发环境下的 App Key,使用国内数据中心。注意:同一个应用的开发环境与生产环境提供不同的 App Key,两个环境之间数据隔离。
  • 开通音视频通话服务。

Demo 项目​

融云提供了一个 iOS 端 Demo 项目,集中演示了通话、会议、直播场景下的功能。

https://github.com/rongcloud/rtc-quickdemo-ios

在运行 QuickDemo 前请确保已完成以下步骤。

  • 已注册融云开发者账户。
  • 已准备好 App Key。
  • 已开通音视频服务免费体验,且已等待 15 分钟。
  • 已获取用于体验的 Token。如果您的后端服务未实现从融云获取 Token 的能力,您可以前往控制台的密钥管理页面,在 管理测试用户 区域输入用户 ID,点击 获取 Token 生成用于体验的 Token。

获取源码​

CallKit 代码开源,您可以查看源码,或者集成源码,根据 App 风格对呼叫 UI 色调搭配,按钮位置等做个性化的修改。

https://github.com/rongcloud/callkit-ios/

依赖关系说明​

  • IMLib(绿色)以 framework 形式存在,属于 RongCloudIM。
  • RTCLib 和 CallLib(黄色)以 framework 形式存在,属于 RongCloudRTC。
  • IMKit 及其插件与 CallKit(白色)可以源码形式存在,只属于 RongCloudOpenSource。

图中白色部分的 SDK 或插件可能有对应 Framework。但在您的应用工程中,白色部分(IMKit、Sticker、IFly、ContacCard、CallKit)必须同为源码或同为 Framework,否则可能会发生冲突。

使用建议​

对于导入源码自定义 UI 的需求,有以下建议:

  1. 不建议直接修改源码内容,防止后续源码升级将修改内容覆盖。
  2. 建议通过继承重写某些类与自身逻辑不一致的方法,来增加新方法以扩展自身的业务逻辑。
  3. 建议使用 SDK 对外暴露的接口,如果调用私有接口可能会出现版本升级引起私有接口变更。

快速上手​

步骤 1 导入 SDK​

融云支持使用 CocoaPods 和本地手动导入两种方式,将 CallKit 相关库导入到您的应用工程中。

在导入 SDK 前,您可以前往 融云官网 SDK 下载页面 确认当前最新版本号。

CocoaPods​

CocoaPods 用户可以导入 Framework 或导入 CallKit 源码。

提示

如您需要同时使用 CallKit、IMKit 及其插件,请务必注意,不可混用 Framework 和源码。详见 SDK 开源代码说明。

导入 Framework​
  1. 在 Podfile 中添加如下内容:

    ruby
    pod 'RongCloudRTC/RongCallKit', '~> x.y.z'

    x.y.z 代表具体版本,各个 SDK 的最新版本号可能不同,在融云下载页或 CocoaPods 仓库能查询到。

  2. 请在终端中运行以下命令:

    ruby
    pod install

    如果出现找不到相关版本的问题,可先执行 pod repo update ,再执行 pod install。

  3. 上一步完成后,会自动导入指定版本的融云 SDK,CocoaPods 会在您的工程根目录下生成一个 .xcworkspace 文件,只需通过 XCode 打开该文件即可加载工程。

导入源码​

从 CallKit SDK 5.1.9 开始,支持在 CocoaPods 中以源码形式进行调试与集成。

  1. 在 Podfile 中,按需添加支持源码集成的库:

    shell
    pod 'RongCloudRTCOpenSource/RongCallKit','x.x.x'    # RongCallKit
  2. 请在终端中运行以下命令:

    ruby
    pod install

    如果出现找不到相关版本的问题,可先执行 pod repo update ,再执行 pod install。

  3. 上一步完成后,会自动导入指定版本的融云 SDK,CocoaPods 会在您的工程根目录下生成一个 .xcworkspace 文件,只需通过 XCode 打开该文件即可加载工程。

  4. 引用库参考:

    Objective C
    #import <RongCallKit.h>

本地手动导入 Framework​

在导入 SDK 前,您需要前往融云官网 SDK 下载页面,将音视频通话(无 UI)SDK 下载到本地。

提示

从 5.2.0 版本至 5.4.4(不含),CallKit/CallLib/RTCLib 必须与其依赖的 IMKit/IMLib SDK 保持版本一致(前三位必须保持一致)。从 5.4.4 开始,CallKit/CallLib/RTCLib 与其依赖的 IMKit/IMLib SDK 版本号前两位保持一致。CallKit/CallLib/RTCLib 5.4.4 不可匹配小于 5.4.4 的 IMKit/IMLib SDK。

  1. 导入 RongCallKit.xcframework,并将 Embed 设置为 Embed & Sign 。
  2. 导入 RongCallLib.xcframework,并将 Embed 设置为 Embed & Sign 。
  3. 导入 RongRTCLib.xcframework,并将 Embed 设置为 Embed & Sign 。
  4. 导入 RongIMLib.xcframework,并将 Embed 设置为 Embed & Sign 。
  5. 导入 RongIMKit.xcframework,并将 Embed 设置为 Embed & Sign 。
  6. 导入 RongIMLibCore.xcframework,并将 Embed 设置为 Embed & Sign 。

步骤 2 工程配置​

  1. 音视频通话需要用到摄像头和麦克风权限,请在工程的 info.plist 中添加如下键值:
    • Privacy - Microphone Usage Description
    • Privacy - Camera Usage Description
  2. 请将工程中 Target -> Signing & Capabilities -> Background Modes 如下内容勾选:
    • Audio, AirPlay, and Picture in Picture
    • Remote notifications
提示

SDK 5.1.1 及之前的版本,音视频通话中需要用到 HTTP 请求,请在工程的 info.plist 中添加如下键值:App Transport Security Settings。在此键值下请再添加 Allow Arbitrary Loads 并将 Value 设置为 YES。

步骤 3 初始化​

音视频 SDK 是基于即时通信 SDK 作为信令通道的,所以要先初始化 IM SDK。如果不换 AppKey,在整个应用生命周期中,初始化一次即可。建议调用位置放在应用启动位置处,或在音视频功能模块的加载位置处。

Objective C
// 初始化 IM SDK
[[RCIM sharedRCIM] initWithAppKey:@"请在开发者平台获取AppKey"];

步骤 4 连接 IM 服务​

音视频用户之间的信令传输依赖于融云的即时通信(IM)服务,因此需要先调用 connectWithToken 与 IM 服务建立好 TCP 长连接。建议在功能模块的加载位置处调用,之后再进行音视频呼叫业务。当模块退出后调用 disconnect 或 logout 断开该连接。

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

步骤 5 呼叫方​

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

发起单人呼叫​

Objective C
- (void)startSingleCall:(NSString *)targetId mediaType:(RCCallMediaType)mediaType;
参数类型必填说明
targetIdNSString是对方的用户ID
mediaTypeRCCallMediaType是媒体类型
  • 示例代码:

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

发起多人呼叫​

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

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];

步骤 6 接听方​

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

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

接入扩展插件​

CallKit 可以接入官方美颜插件或相芯美颜插件。注意,相芯美颜插件要求 CallKit 版本 ≧ 5.4.0。

其他定制化​