实现首次通话
CallKit 基于 CallLib SDK 基础增加了一套默认呼叫界面,包含了单人、多人音视频呼叫的各种场景和功能。
房间人数上限
- 考虑移动设备的带宽(主要是在多路视频情况下)和 UI 交互效果,建议单次通话或房间内,视频不超过 16 人,纯音频不超过 32 人。超过此上限可能影响通话效果。
- CallKit 代码中已设置人数上限。默认发起视频呼叫时,最多可选 7 人。发起音频呼叫时,最多可选 20 人。如需调整,建议勿超过建议上限。
- 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。
- 已开通音视频服务免费体验,且已等待 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 的需求,有以下建议:
- 不建议直接修改源码内容,防止后续源码升级将修改内容覆盖。
- 建议通过继承重写某些类与自身逻辑不一致的方法,来增加新方法以扩展自身的业务逻辑。
- 建议使用 SDK 对外暴露的接口,如果调用私有接口可能会出现版本升级引起私有接口变更。
快速上手
步骤 1 导入 SDK
融云支持使用 CocoaPods 和本地手动导入两种方式,将 CallKit 相关库导入到您的应用工程中。
在导入 SDK 前,您可以前往 融云官网 SDK 下载页面 确认当前最新版本号。
CocoaPods
CocoaPods 用户可以导入 Framework 或导入 CallKit 源码。
如您需要同时使用 CallKit、IMKit 及其插件,请务必注意,不可混用 Framework 和源码。详见 SDK 开源代码说明。
导入 Framework
-
在 Podfile 中添加如下内容:
pod 'RongCloudRTC/RongCallKit', '~> x.y.z'
x.y.z
代表具体版本,各个 SDK 的最新版本号可能不同,在融云下载页或 CocoaPods 仓库能查询到。 -
请在终端中运行以下命令:
pod install
如果出现找不到相关版本的问题,可先执行
pod repo update
,再执行pod install
。 -
上一步完成后,会自动导入指定版本的融云 SDK,CocoaPods 会在您的工程根目录下生成一个
.xcworkspace
文件,只需通过 XCode 打开该文件即可加载工程。
导入源码
从 CallKit SDK 5.1.9 开始,支持在 CocoaPods 中以源码形式进行调试与集成。
-
在 Podfile 中,按需添加支持源码集成的库:
pod 'RongCloudRTCOpenSource/RongCallKit','x.x.x' # RongCallKit
-
请在终端中运行以下命令:
pod install
如果出现找不到相关版本的问题,可先执行
pod repo update
,再执行pod install
。 -
上一步完成后,会自动导入指定版本的融云 SDK,CocoaPods 会在您的工程根目录下生成一个
.xcworkspace
文件,只需通过 XCode 打开该文件即可加载工程。 -
引用库参考:
#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。
- 导入
RongCallKit.xcframework
,并将Embed
设置为Embed & Sign
。 - 导入
RongCallLib.xcframework
,并将Embed
设置为Embed & Sign
。 - 导入
RongRTCLib.xcframework
,并将Embed
设置为Embed & Sign
。 - 导入
RongIMLib.xcframework
,并将Embed
设置为Embed & Sign
。 - 导入
RongIMKit.xcframework
,并将Embed
设置为Embed & Sign
。 - 导入
RongIMLibCore.xcframework
,并将Embed
设置为Embed & Sign
。
步骤 2 工程配置
- 音视频通话需要用到摄像头和麦克风权限,请在工程的 info.plist 中添加如下键值:
- Privacy - Microphone Usage Description
- Privacy - Camera Usage Description
- 请将工程中 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 长连接。建议在功能模块的加载位置处调用,之后再进行音视频呼叫业务。当模块退出后调用 disconnect
或 logout
断开该连接。
[[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;
参数 | 类型 | 必填 | 说明 |
---|---|---|---|
targetId | NSString | 是 | 对方的用 户ID |
mediaType | RCCallMediaType | 是 | 媒体类型 |
-
示例代码:
[[RCCall sharedRCCall] startSingleCall:@"被叫端UserId" mediaType:RCCallMediaVideo];
发起多人呼叫
多人通话依赖群组 ConversationType_GROUP
或讨论组 ConversationType_DISCUSSION
,被呼叫的用户必须在同一个群组里。
- (void)startMultiCallViewController:(RCConversationType)conversationType
targetId:(NSString *)targetId
mediaType:(RCCallMediaType)mediaType
userIdList:(NSArray *)userIdList;
-
参数说明:
参数 类型 必填 说明 conversationType RCConversationType 是 会话类型 targetId NSString 是 群组ID mediaType RCCallMediaType 是 媒体类型 userIdList NSArray 是 被叫用户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;
-
参数说明:
参数 类型 必填 说明 conversationType RCConversationType 是 会话类型 targetId NSString 是 群组ID mediaType RCCallMediaType 是 媒体类型 -
示例代码:
[[RCCall sharedRCCall] startMultiCall:ConversationType_GROUP
targetId:@"群组ID"
mediaType:RCCallMediaVideo];
步骤 6 接听方
CallKit 中已经默认实现了 RongCallLib 库提供 RCCallReceiveDelegate(来电监听) 和 RCCallSessionDelegate(通话状态)代理。被叫端收到呼叫,会自动弹出通话界面,点击来电页面的接听按钮即可接听通话。
当 App
在后台或者未启动时会收到来电通知,点击来电通知条 App
打开后会显示来电页面。
接入扩展插件
CallKit 可以接入官方美颜插件或相芯美颜插件。注意,相芯美颜插件要求 CallKit 版本 ≧ 5.4.0。
其他定制化
- 如何获取 RCCallSession:RongCallKit 非源码如何获取 RCCallSession