跳到主要内容

实现首次通话

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

提示

房间人数上限

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

环境要求

适用于 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。
  • 已开通音视频服务免费体验,且已等待 30 分钟。
  • 已获取用于体验的 Token。如果您的后端服务未实现从融云获取 Token 的能力,您可以使用控制台 IM Server API 调试功能 获取 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 中添加如下内容:

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

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

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

    pod install

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

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

导入源码

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

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

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

    pod install

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

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

  4. 引用库参考:

    #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,在整个应用生命周期中,初始化一次即可。建议调用位置放在应用启动位置处,或在音视频功能模块的加载位置处。

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

步骤 4 连接 IM 服务

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

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

步骤 5 呼叫方

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

发起单人呼叫

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

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

发起多人呼叫

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

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

  • 参数说明:

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

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

选择成员发起通话

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

- (void)startMultiCall:(RCConversationType)conversationType
targetId:(NSString *)targetId
mediaType:(RCCallMediaType)mediaType;
  • 参数说明:

    参数类型必填说明
    conversationTypeRCConversationType会话类型
    targetIdNSString群组ID
    mediaTypeRCCallMediaType媒体类型
  • 示例代码:

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

步骤 6 接听方

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

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

接入扩展插件

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

其他定制化