1. 使用说明
欢迎使用“AICC”的视频客服模块的移动端开发者工具套件(SDK)。我们分别为Android和iOS平台提供SDK,通过SDK,可以在您的APP中快速集成视频客服的各种功能。
2. 创建App接入渠道
3. Android开发文档
3.1. 简介
欢迎使用“AICC”的视频客服移动端开发者工具套件(SDK)。本文针对Android端使用做详细说明,通过SDK,可以在您的APP中快速集成访客端视频聊天的功能。
3.2. 环境要求
平台支持情况:适配Android 7.0及以上 (arm64, armv7, x86, x86-64)
3.3. 快速开始
3.3.1. gradle 配置
-
添加自定义仓库地址
如果您使用的是 Gradle kotlin 脚本, 则在项目根目录的 build.gradle.kts 或 setting.gradle.kts 的 repositories 配置块中添加如下仓库配置:
maven { url=uri("https://www.jitpack.io") }
maven { url = uri("https://mvnrepo.jiagouyun.com/repository/maven-releases") }
如果您使用的是 Gradle Groovy 脚本, 则在项目根目录的 build.gradle 或 setting.gradle 的 repositories 配置块中添加如下仓库配置:
maven { url "https://www.jitpack.io"}
maven { url "https://mvnrepo.jiagouyun.com/repository/maven-releases"}
-
添加 SDK 依赖
在使用到 SDK 的模块中的 build.gradle 或 build.gradle.kts 的 dependencies 配置块添加 SDK 依赖:
implementation("com.github.ti-net-project:VCSClientKit-Android:版本号")
implementation("com.github.ti-net-project:VCSClient-Android:版本号")
-
添加编译配置
在 android 配置块中添加如下配置:
packagingOptions {
jniLibs {
pickFirsts += setOf("lib/x86/libaosl.so", "lib/x86_64/libaosl.so", "lib/armeabi-v7a/libaosl.so", "lib/arm64-v8a/libaosl.so")
}
resources {
excludes += setOf("/META-INF/{AL2.0,LGPL2.1}","/META-INF/gradle/incremental.annotation.processors")
}
}
3.3.2. 初始化
初始化需要在Application中调用,在onCreate方法中进行初始化。
String url = "平台URL"; // 平台 URL
String configId = "插件ID"; // 插件 ID, 在平台的 "系统设置 > 视频客服 > 渠道接入 > APP > 插件信息" 菜单下获取
AppStateVcsCallback.init(this);
VcsClientKit.init(
this,
new VCSKitInitOption(
url,
configId
),
new VCSCallback(){
@Override
public void onFailed(int errorCode, @NotNull String errorMessage) {
super.onFailed(errorCode, errorMessage);
}
@Override
public void onSuccess() {
super.onSuccess();
}
}
);
3.3.3. 登录
注:
1. 登录后才可以向坐席发起呼叫以及接受坐席的回呼
2. 登录接口在未呼叫时可重复调用, 在通话中时无法调用
3. 建议每次外呼前调用, 成功后再调用呼叫坐席接口(videoCall)
// 生成访客 Id
String visitorId = "vcs" + TGetDeviceId.getDeviceId(this.getApplicationContext());
VcsClientKit.getInstance().login(new VCSKitLoginOption(visitorId), new VCSCallback() {
@Override
public void onSuccess() {
ToastUtils.showShortToast(MainActivity.this, "登录成功");
}
@Override
public void onFailed(@NonNull int errorCode, @NonNull String errorMessage) {
}
});
3.3.4. 呼叫坐席
注: SDK 在呼叫坐席时,会自动弹窗申请摄像头、录音权限。
// 访客名称, 目前固定为“访客”, 暂时无法改变, 无论设置什么名称,都会在坐席端显示为访客
String nickname = "访客";
VcsClientKit.getInstance().videoCall(new VCSKitVideoCallOption(nickname), new VCSCallback() {
@Override
public void onSuccess() {
// videoCall 调用成功
}
@Override
public void onFailed(int errorCode, @NonNull String errorMessage) {
// videoCall 调用失败
ToastUtils.showShortToast(ShopFragment.this.getContext(), errorMessage);
}
});
3.3.5. 退出登录
VcsClientKit.getInstance().logout(new VCSCallback() {
@Override
public void onSuccess() {
}
@Override
public void onFailed(int errorCode, String errorMessage) {
}
});
3.3.6. 获取版本号
VcsClientKit.getInstance().getVersion(); // Kit 层版本号
3.3.7. 检查并申请悬浮窗权限
if (!FloatWindowManager.getInstance().checkPermission(this)) {
FloatWindowManager.getInstance().applyPermission(this);
}
3.4. 错误码
编号 | 说明 |
---|---|
10001 |
网络错误 |
10002 |
引擎未初始化 |
10003 |
内部信令发送失败 |
10008 |
接收方为空 |
10009 |
接口返回错误 |
10010 |
参数校验错误 |
10012 |
未知服务器错误 |
10013 |
重复发起呼叫错误 |
10014 |
重复登录错误 |
10015 |
RTM登录失败 |
10016 |
RTM订阅失败 |
10017 |
RTM取消订阅失败 |
10018 |
RTM登出失败 |
4. iOS开发文档
4.1. 简介
欢迎使用“AICC”的视频客服移动端开发者工具套件(SDK)。本文针对iOS端使用做详细说明,通过SDK,可以在您的APP中快速集成访客端视频聊天的功能。
4.3. 快速开始
4.3.1. 引入SDK
根据实际情况,在以下集成方式中任选一种,在你的项目中集成 SDK。
1.通过Cocoapods引入
# 集成视频客服SDK
pod 'VCSClientKit', '1.0.0'
2.本地集成 把下载下来的VCSClientKit.xcframework、VCSClientLib.xcframework、FTMobileSDK.xcframework、AgoraRtmKit.xcframework 拖入到项目中,在 Targets -> Build Phases -> Link Binary With Libraries 中添加。 VCSClient.bundle为资源库,需要添加到项目中。
4.3.2. 初始化
Objective-C语言
VCSKitInitOption *initOption = [[VCSKitInitOption alloc] init];
/// 北京线上环境地址
initOption.rtcEndpoint = @"线上环境";
// 是否打开日志信息
initOption.enableConsoleLog = YES;
/// 插件ID 在平台的 "系统设置 > 视频客服 > 渠道接入 > APP > 插件信息" 菜单下获取
initOption.configId = @"插件ID";
initOption.enableFTMobileSDK = YES;
VCSClientKit *kit = [VCSClientKit shareKit];
/// 屏幕共享 相关参数
VCSScreenShareOption * shareOption = [[VCSScreenShareOption alloc] init];
shareOption.screenShareExtensionBundleId = @"屏幕共享的bundle id";
shareOption.appGroupName = @"App Group Name";
initOption.shareOption = shareOption;
/// 初始化kit
[kit initWithOption:initOption];
Swift语言
let initOption = VCSKitInitOption()
/// 北京线上环境地址
initOption.rtcEndpoint = "线上环境"
/// 是否打开日志信息
initOption.enableConsoleLog = true
/// 插件ID 在平台的 "系统设置 > 视频客服 > 渠道接入 > APP > 插件信息" 菜单下获取
initOption.configId = "插件ID"
/// 是否开启观测云检测
initOption.enableFTMobileSDK = true
/// 初始化kit单例
let kit = VCSClientKit.share()
/// 屏幕共享 相关参数
let shareOption = VCSScreenShareOption()
shareOption.screenShareExtensionBundleId = "屏幕共享的bundle id"
shareOption.appGroupName = "App Group Name"
initOption.shareOption = shareOption
/// 初始化kit
kit.initWith(initOption)
4.3.3. 登录
Objective-C语言
/// 访客ID
NSString *visitorId = @"访客ID";
/// 初始化kit单例
VCSClientKit *kit = [VCSClientKit shareKit];
/// 登录
[kit loginWithVisitorId:visitorId Success:^{
NSLog(@"========登陆成功");
} withError:^(VCSError * _Nonnull error) {
NSLog(@"=========登陆失败===error=%@",error);
}];
Swift 语言
/// 访客ID
let visitorID = "访客ID"
/// 初始化kit单例
let kit = VCSClientKit.share()
/// 登录
kit.login(withVisitorId: visitorID) {
print("登录成功")
} withError: { error in
print("登录失败:\(String(error.errorDescription))")
}
4.3.4. 呼叫坐席
注: > SDK 在首次呼叫坐席时,会自动弹窗申请摄像头、麦克风权限
Objective-C语言
/// 呼叫信息Model实例化
VCSCallModel * model = [[VCSCallModel alloc] init];
/// 访客信息Model实例化
VCSVisitorInfo *visitorInfo = [[VCSVisitorInfo alloc] init];
visitorInfo.nickName = @"visitorName";
visitorInfo.qq = @"qq";
visitorInfo.name = @"name";
visitorInfo.companyName =@"companyName";
visitorInfo.phone =@"phone";
visitorInfo.desc = @"desc";
visitorInfo.email = @"email";
visitorInfo.userDefineColumn = @"{\"WQQ\":\"帅哥\",\"QAZ\":\"LLLLLLLTTTTTTTT\"}";
/// 访客信息赋值
model.visitorInfo = visitorInfo;
/// 业务标识初始化
NSMutableDictionary * serviceIdentification =[NSMutableDictionary new];
/// 具体值(示例,请结合业务需求)
[serviceIdentification setValue:@"ship" forKey:@"businessType"];
[serviceIdentification setValue:@"回访" forKey:@"businessSubtype"];
model.serviceIdentification = serviceIdentification;
/// 添加vip 标识
NSMutableDictionary *vipTags = [NSMutableDictionary dictionaryWithCapacity:0];
NSArray *tags = @[@"vip",@"vip"];
[vipTags hd_setValue:tags forKey:@"tags"];
model.vipTags = vipTags;
model.visitorId = [self getVisitorId];
VCSClientKit * kit = [VCSClientKit shareKit];
[kit videoCall:model Success:^{
NSLog(@"呼叫成功");
} withError:^(VCSError * _Nonnull error) {
NSLog(@"error:%@", error.errorDescription);
if (error.code == VCS_ERR_REPEATCALL) {
NSLog(@"正在视频通话,无法再次发起");
}
}];
Swift 语言
/// 呼叫信息Model实例化
let callModel = VCSCallModel()
/// 访客信息Model实例化
let visitorModel = VCSVisitorInfo()
visitorModel.nickName = "visitorName"
visitorModel.qq = "qq"
visitorModel.name = "name"
visitorModel.companyName = "companyName"
visitorModel.phone = "phone"
visitorModel.desc = "desc"
visitorModel.email = "email"
visitorModel.userDefineColumn = "{\"WQQ\":\"帅哥\",\"QAZ\":\"LLLLLLLTTTTTTTT\"}"
/// 访客信息赋值
callModel.visitorInfo = visitorModel
/// 业务标识初始化
var serviceIdentification: [String: String] = [:]
/// 具体值(示例,请结合业务需求)
serviceIdentification["businessType"] = "ship"
serviceIdentification["businessSubtype"] = "回访"
/// 业务标识
callModel.serviceIdentification = serviceIdentification
let tags: [String] = ["vip", "vip"]
var vipTags: [String : [String]] = [:]
/// vip标识
vipTags.vcs_setValue(tags, forKey: "tags")
/// 标签
callModel.vipTags = vipTags
/// 访客ID
callModel.visitorId = getVisitorId()
/// 发起视频页面
VCSClientKit.share().videoCall(callModel) {
print("呼叫成功")
} withError: { [weak self] error in
guard let self = self else {
return
}
print("error:\(error.description)")
if error.code == VCS_ERR_REPEATCALL {
print("正在视频通话,无法再次发起")
}
}
4.3.5. 退出登录
注: > SDK 在通话中进行退出登录操作,会进行退出拦截操作,需要结束通话才能退出登录。
Objective-C语言
/// 退出登录
[[VCSClientKit shareKit] logout:^{
NSLog(@"退出成功");
} withError:^(VCSError * _Nonnull error) {
NSLog(@"退出失败");
}];
Swift 语言
/// 退出登录
VCSClientKit.share().logout {
print("退出成功")
} withError: { error in
print("退出失败")
}
4.4. 屏幕共享
注: 不使用屏幕共享的可以跳过该部分。
4.4.1. 技术原理
由于 Apple 不支持在App 主进程采集屏幕,因此你需要为屏幕共享流单独创建一个 Extension,并在 Extension 中使用 iOS 原生的 ReplayKit 框架实现录制屏幕,然后将屏幕共享流发送给主进程、实现屏幕共享。
4.4.2. 注意事项
受系统限制,屏幕共享只支持 iOS 12.0 及以上版本。+
该功能对设备性能要求较高,推荐你使用 iPhone X 及以上设备。+
用户在 iOS 设备上开启屏幕共享后,因系统限制,音频路由会自动切换为听筒。
4.4.3. 项目设置
前往你的项目文件夹,打开项目。
点击 File -> New -> Target…,在弹出的窗口中选者 Broadcast Upload Extension,点击Next。

在弹出的窗口中填写 Product Name 等信息,取消勾选 Include UI Extension,点击 Finish。Xcode 会自动创建该 Extension 的文件夹,其中包含 SampleHandler 文件。

在 Target 下选中刚创建的 Extension,点击 General,在 Deployment Info 下将 iOS 的版本设置为 12.0 或之后。

4.5. 错误码
编号 | 说明 |
---|---|
10001 |
网络错误 |
10002 |
引擎未初始化 |
10003 |
内部信令发送失败 |
10008 |
接收方为空 |
10009 |
接口返回错误 |
10010 |
参数校验错误 |
10011 |
服务器超时 |
10012 |
未知服务器错误 |
10013 |
重复发起呼叫错误 |
10014 |
重复登录错误 |
10015 |
RTM登录失败 |
10016 |
RTM订阅失败 |
10017 |
RTM取消订阅失败 |
10018 |
RTM登出失败 |