文档捉虫大赛:人工智能与机器学习专题> HOT
本文将介绍如何用最短的时间完成 TUICallKit 组件的接入,跟随本文档,您将在一个小时的时间内完成如下几个关键步骤,并最终得到一个包含完备 UI 界面的视频通话功能。

环境准备

iOS 9.0 ( API level 16 ) 及更高。

步骤一:开通音视频通话服务

在使用 TUICallKit 发起通话前,您需要开通 TUICallKit 专属的音视频通话服务,详细步骤如下:
1. 登录 腾讯云视立方控制台,单击 创建项目 按钮后,您可以根据自己的业务情况,选择合适的接入场景和集成方式,这里我们推荐“含 UI 快速集成”,即TUICallKit。


2. 在选定接入场景和集成方式以后,您就需要开通一下 音视频通话 SDK 使用的两项 腾讯云基础的 PaaS 能力,即 即时通信 IM实时音视频 TRTC,开通后,单击 创建项目并下一步 按钮。


3. 在项目创建完成以后,您需要为该项目匹配一个 IM 应用,因为音视频通话 SDK 依赖了IM SDK 提供的基础能力,这里创建或者管理已有的 IM 应用均可,在关联成功后,就可以领取 7天的免费体验版,用于后续的开发调试工作,当然如果您之前已经体验过,也可以直接在该页面单击 购买正式版本


4. 单击 前往集成 按钮,选择 项目配置,查看详细的配置页面,找到 SDKAppID 和密钥并记录下来,它们会在后续的 步骤四:登录 TUI 组件 中被用到,至此音视频通话 SDK服务开通完成。



步骤二:导入组件

从1.6版本开始,TUICallKit SDK同时支持 Objective 和 Swift,使用 CocoaPods 导入组件,具体步骤如下:
1. 在您的 Podfile 文件中添加以下依赖。
Objective-C
Swift
pod 'TUICallKit'
pod 'TUICallKit_Swift'
2. 执行以下命令,安装组件。
pod install
如果无法安装 TUICallKit 最新版本,执行以下命令更新本地的 CocoaPods 仓库列表。
pod repo update

步骤三:完成工程配置

使用音视频功能,需要授权麦克风和摄像头的使用权限。在 App 的 Info.plist 中添加以下两项,分别对应麦克风和摄像头在系统弹出授权对话框时的提示信息。
<key>NSCameraUsageDescription</key>
<string>CallingApp需要访问您的相机权限,开启后录制的视频才会有画面</string>
<key>NSMicrophoneUsageDescription</key>
<string>CallingApp需要访问您的麦克风权限,开启后录制的视频才会有声音</string>




步骤四:登录 TUI 组件

在您的项目中添加如下代码,它的作用是通过调用 TUICore 中的相关接口完成 TUI 组件的登录。这个步骤异常关键,因为只有在登录成功后才能正常使用 TUICallKit 的各项功能,故请您耐心检查相关参数是否配置正确:
Objective-C
Swift
#import <TUICore/TUILogin.h>

// 组件登录
[TUILogin login:1400000001 // 请替换为步骤一取到的 SDKAppID
userID:@"denny" // 请替换为您的 UserID
userSig:@"xxxxxxxxxxx" // 您可以在控制台中计算一个 UserSig 并填在这个位置
succ:^{
NSLog(@"login success");
} fail:^(int code, NSString *msg) {
NSLog(@"login failed, code: %d, error: %@", code, msg);
}
import TUICore

// 组件登录
TUILogin.login(1400000001, // 请替换为步骤一取到的 SDKAppID
userID: "denny", // 请替换为您的 UserID
userSig: "xxxxxxxxxxx") { // 您可以在控制台中计算一个 UserSig 并填在这个位置
print("login success")
} fail: { (code, message) in
print("login failed, code: \\(code), error: \\(message ?? "nil")")
}

参数说明: 这里详细介绍一下 login 函数中所需要用到的几个关键参数:
sdkAppId:在步骤一中的最后一步中您已经获取到,这里不再赘述。
userId:当前用户的 ID,字符串类型,只允许包含英文字母(a-z 和 A-Z)、数字(0-9)、连词符(-)和下划线(_)。
userSig:使用步骤三中获取的 SecretKey 对 SDKAppID、UserID 等信息进行加密,就可以得到 UserSig,它是一个鉴权用的票据,用于腾讯云识别当前用户是否能够使用 TRTC 的服务。您可以通过控制台中的 辅助工具 生成一个临时可用的 UserSig。
更多信息请参见 如何计算及使用 UserSig
注意:
这个步骤也是目前我们收到的开发者反馈最多的步骤,常见问题如下:
sdkAppId 设置错误,国内站的 SDKAppID 一般是以140开头的10位整数。
userSig 被错配成了加密密钥(Secretkey),userSig 是用 SecretKey 把 sdkAppId、userId 以及过期时间等信息加密得来的,而不是直接把 Secretkey 配置成 userSig。
userId 被设置成“1”、“123”、“111”等简单字符串,由于 TRTC 不支持同一个 UserID 多端登录,所以在多人协作开发时,形如 “1”、“123”、“111” 这样的 userId 很容易被您的同事占用,导致登录失败,因此我们建议您在调试的时候设置一些辨识度高的 userId。
Github 中的示例代码使用了 genTestUserSig 函数在本地计算 userSig 是为了更快地让您跑通当前的接入流程,但该方案会将您的 SecretKey 暴露在 App 的代码当中,这并不利于您后续升级和保护您的 SecretKey,所以我们强烈建议您将 userSig 的计算逻辑放在服务端进行,并由 App 在每次使用 TUICallKit 组件时向您的服务器请求实时计算出的 userSig。

步骤五:拨打通话

1对1视频通话

通过调用 TUICallKit 的 call 函数并指定通话类型和被叫方的 userId,就可以发起语音或者视频通话。
Objective-C
Swift
#import <TUICallKit/TUICallKit.h>

// 发起1对1视频通话(假设 userId 为 mike)
[[TUICallKit createInstance] call:@"mike" callMediaType:TUICallMediaTypeVideo];
import TUICallKit

// 发起1对1视频通话(假设 userId 为 mike)
TUICallKit.createInstance().call(userId: "mike", callMediaType: .video)


参数
类型
含义
userId
String
目标用户的 UserID:"mike"
callMediaType
通话的媒体类型,示例:TUICallMediaTypeVideo

群内视频通话

通过调用 TUICallKit 的 groupCall 函数并指定通话类型和被叫方的 UserID 列表,就可以发起群内的语音或者视频通话。
Objective-C
Swift
#import <TUICallKit/TUICallKit.h>

[[TUICallKit createInstance] groupCall:@"12345678" userIdList:@[@"denny", @"mike", @"tommy"] callMediaType:TUICallMediaTypeVideo];
import TUICallKit

TUICallKit.createInstance().groupCall(groupId: "12345678", userIdList: ["denny", "mike", "tommy"], callMediaType: .video)
参数
类型
含义
groupId
String
群组 ID,示例:@"12345678"
userIdList
Array
目标用户的userId 列表,示例:@[@"denny", @"mike", @"tommy"]
callMediaType
通话的媒体类型,示例:TUICallMediaTypeVideo
说明
群组的创建详见: IM 群组管理 ,或者您也可以直接使用 IM TUIKit,一站式集成聊天、通话等场景。
TUICallKit 目前还不支持发起非群组的多人视频通话,如果您有此类需求,欢迎反馈: TUIKit 需求收集表

步骤六:接听通话

步骤四 完成后,收到来电请求后,TUICallKit 组件会自动启动相应的接听界面。

步骤七:更多特性

一、设置昵称&头像

如果您需要自定义昵称或头像,可以使用如下接口进行更新:
Objective-C
Swift
[[TUICallKit createInstance] setSelfInfo:@"昵称" avatar:@"头像url" succ:^{

} fail:^(int code, NSString *errMsg) {

}];
TUICallKit.createInstance().setSelfInfo(nickname: "昵称", avatar: "头像url", succ: {

}) { code, desc in

}

注意
因为用户隐私限制,非好友之间的通话,被叫的昵称和头像更新可能会有延迟,一次通话成功后就会顺利更新。

二、离线唤醒

完成以上步骤,就可以实现音视频通话的拨打和接通,但如果您的业务场景需要在 App 的进程被杀死后或者APP 退到后台后,还可以正常接收到音视频通话请求,就需要增加离线唤醒功能,详情见 离线唤醒(iOS)

三、悬浮窗功能

如果您的业务需要开启悬浮窗功能,您可以在 TUICallKit 组件初始化时调用以下接口开启该功能:
Objective-C
Swift
[[TUICallKit createInstance] enableFloatWindow:YES];
TUICallKit.createInstance().enableFloatWindow(true)


四. 通话状态监听

如果您的业务需要 监听通话的状态,例如通话开始、结束,以及通话过程中的网络质量等等,可以监听以下事件:
Objective-C
Swift
#import <TUICallEngine/TUICallEngine.h>

[[TUICallEngine createInstance] addObserver:self];

- (void)onCallBegin:(TUIRoomId *)roomId callMediaType:(TUICallMediaType)callMediaType callRole:(TUICallRole)callRole {

}
- (void)onCallEnd:(TUIRoomId *)roomId callMediaType:(TUICallMediaType)callMediaType callRole:(TUICallRole)callRole totalTime:(float)totalTime {

}
- (void)onUserNetworkQualityChanged:(NSArray<TUINetworkQualityInfo *> *)networkQualityList {

}
import TUICallEngine

TUICallEngine.createInstance().addObserver(self)

public func onCallBegin(roomId: TUIRoomId, callMediaType: TUICallMediaType, callRole: TUICallRole) {

}
public func onCallEnd(roomId: TUIRoomId, callMediaType: TUICallMediaType, callRole: TUICallRole, totalTime: Float) {

}
public func onUserNetworkQualityChanged(networkQualityList: [TUINetworkQualityInfo]) {

}


五、自定义铃音

如果您需要自定义来电铃音,可以通过如下接口进行设置:常见问题
Objective-C
Swift
[[TUICallKit createInstance] setCallingBell:filePath];
TUICallKit.createInstance().setCallingBell(filePath: filePath)


六、自定义通话超时时间

如果您需要自定义通话的超时时间,可以在调用callgroupCalljoinInGroupCall方法的时候修改TUICallParams参数进行设置:
Objective-C
Swift
TUICallParams *callParams = [TUICallParams new];
callParams.offlinePushInfo = [TUIOfflinePushInfo new];
/// 自定义超时时间
callParams.timeout = 30;
callParams.userData = @"user data";

[[TUICallKit createInstance] call:@"mike" callMediaType:TUICallMediaTypeVideo params:callParams succ:nil fail:nil];

let callParams = TUICallParams()
let offlinePushInfo = TUIOfflinePushInfo()
callParams.offlinePushInfo = offlinePushInfo
callParams.timeout = 30
callParams.userData = "user data"
TUICallKit.createInstance().call(userId: "mike", callMediaType: .video, params: callParams) {

}



常见问题

错误提示“The package you purchased does not support this ability”?

如遇以上错误提示,是由于您当前应用的音视频通话能力包过期或未开通,请参见 步骤一:开通音视频通话服务,领取或者开通音视频通话能力,进而继续使用 TUICallKit 组件。

如何购买套餐?

请参考购买链接 音视频通话 SDK 价格总览,如有其他问题,请点击页面右侧,进行售前套餐咨询,或者加入 QQ 群:592465424,进行咨询和反馈。

交流与反馈

如果您在使用过程中,有什么建议或者意见,可以在这里反馈:TUICallKit 产品反馈问卷,感谢您的反馈。
如果您是开发者,也欢迎您加入我们的 TUICallKit 技术交流 QQ 群:605115878,进行技术交流和产品沟通。