1. 使用说明

欢迎使用“AICC”的视频客服模块的移动端开发者工具套件(SDK)。我们分别为Android和iOS平台提供SDK,通过SDK,可以在您的APP中快速集成视频客服的各种功能。

2. 创建App接入渠道

2.1. App接入渠道创建页

登录后在左侧边栏中找到 系统配置→视频客服→渠道接入→App

图片

2.2. 新增App接入渠道

点击左上角新增按钮,并根据提示新增,配置相关信息并保存即可。

图片
图片

2.3. 新增视频路由

左侧内边栏中找到视频路由

图片

2.3.1. 时间条件

点击时间条件,可以配置具体路由的时间条件

图片

2.3.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 配置

  1. 添加自定义仓库地址

如果您使用的是 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"}
  1. 添加 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:版本号")
  1. 添加编译配置

在 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.2. 环境要求

平台支持情况:适配iOS 12.0以上

开发工具:Xcode 16+

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.3.6. 获取版本号

Objective-C语言

[VCSClientKit getVersion];

Swift 语言

VCSClientKit.getVersion()

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 文件。

Choose opstions

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

Target Configuration

4.5. 错误码

编号 说明

10001

网络错误

10002

引擎未初始化

10003

内部信令发送失败

10008

接收方为空

10009

接口返回错误

10010

参数校验错误

10011

服务器超时

10012

未知服务器错误

10013

重复发起呼叫错误

10014

重复登录错误

10015

RTM登录失败

10016

RTM订阅失败

10017

RTM取消订阅失败

10018

RTM登出失败