呼叫能力 (iOS-SDK)
# 呼叫能力 (iOS-SDK)
智齿客服为企业提供了一整套完善的智能客服解决方案。智齿呼叫 SDK 为其提供所有呼叫相关功能支持,仅需提供使用的账户,就能完成呼叫任务、外呼、呼叫监听、呼叫记录等操作。
智齿呼叫 SDK 具有以下特性:
- 提供登录-使用-退出完整流程。
- 分 2 种登录模块,外部登录同步 token 和常规用户名、密码登录。
- 支持呼叫话机注册、呼叫记录查询、呼叫监听、座席状态切换等基础功能。
相关限制及注意事项:
1、iOS SDK 新版支持 iOS9 以上版本,同时支持 iPhone、iPad,支持竖屏和横屏。
2、目前发布 XCode 版本为 XCode 12.3.1,建议使用新版开发。
3、iOS 需要麦克风权限,否则呼叫功能无法使用。
4、SDK 不可与智齿客服 APP 中的呼叫功能以及智齿 PC 工作台中呼叫功能同时使用。
# 文档介绍
# ● 集成流程示意图
# ● 文件说明
SDK 包含(SobotCall.framework、SobotCommon.framework、SobotCall.bundle和SobotCommon.bundle)、SobotCallDemo、和 Doc 相关说明文档。
文件 | 描述 |
---|---|
SobotCall.framework | 智齿呼叫 SDK 代码库 |
SobotCommon.framework | 智齿代码基础依赖库 |
SobotCommon.bundle | 基础工具包的资源库,包含图片文件、多语言文件、颜色 |
SobotCall.bundle | SDK资源库,包含图片文件、多语言文件、颜色 |
SobotCallApi.h | 该文件提供接入功能 |
SobotCallParameter.h | 基础UI配置参数类 |
SobotCallCacheEntity.h | 基础功能参数类(域名、颜色、语言、显示模式等) |
SobotCallHomeController.h | 呼叫入口界面 |
SobotCallClient.h | 基础功能 |
# 集成方式
# ● 手动集成
下载链接:iOS_CallSDK (opens new window)
解压[iOS_SDK],添加必要文件SobotCall.framework、SobotCommon.framework、SobotCommon.bundle和SobotCall.bundle到你的工程里。
# ● CocoaPods 集成
在podfile中加入:
// 使用最新版本
pod 'SobotCallSDK'
2
3
如果搜索不到最新版本,请运行以下命令更新 CocoaPods 仓库:
pod repo update --verbose
如果无法更新到最新版本,可以删除索引文件,重新尝试
rm ~/Library/Caches/CocoaPods/search_index.json
2
3
4
清除pod缓存:
删除代码中的pod 文件夹,
pod cache clean SobotCallSDK
再重新 pod install
2
3
# UI功能说明
# ● 启动智齿页面
方式1:直接使用我们提供的方法,自动完成登录并跳转页面。 方法:
/// 启动SDK 进入呼叫SDK首页
/// @param account 账号
/// @param loginPwd 密码
/// @param vc 启动VC
/// @param resultBlock 回调结果
+(void)startWithAcount:(NSString *)account password:(NSString *)loginPwd viewController:(UIViewController *)vc result:(SobotResultBlock) resultBlock;
/// 添加启动页面
/// token 非accessToken,账号登录返回的地址,内部自动判断新旧版本
+(void)startWithToken:(NSString *) token viewController:(UIViewController *) vc result:(SobotCallResultBlock) resultBlock;
2
3
4
5
6
7
8
9
10
11
12
13
参数
参数 | 类型 | 必填 | 描述 |
---|---|---|---|
account | NSString | 是 | 客服账户 |
loginPwd | NSString | 是 | 客服账户密码 |
vc | UIViewController | 是 | 执行跳转的vc |
resultBlock | Block | 否 | 执行结果,code=1 为成功 |
示例代码:
[SobotCallApi startWithAcount:loginAccount password:password viewController:self result:^(NSInteger code, id _Nullable obj, NSString * _Nullable msg) {
}];
2
3
4
方式2:直接创建 SobotCallHomeController,自己完成登录并跳转页面。需要先完成登录,然后再执行跳转。 方法:
/// 登录
/// @param account 账号
/// @param loginPwd 密码
/// @param resultBlock 回调结果
+(void)loginUser:(NSString *)account password:(NSString * )loginPwd result:(SobotCallResultBlock) resultBlock;
/// 登录(使用token)
/// @param account 账号
/// @param loginPwd 密码
/// @param token token
/// @param resultBlock 回调结果
+(void)loginUser:(NSString *)account password:(NSString * )loginPwd token:(NSString *) token result:(SobotCallResultBlock) resultBlock;
2
3
4
5
6
7
8
9
10
11
12
13
14
参数
参数 | 类型 | 必填 | 描述 |
---|---|---|---|
account | NSString | 是 | 客服账户 |
loginPwd | NSString | 否 | 客服账户密码,仅 token 为空时使用 |
token | NSString | 否 | 已获取到的公司 token,使用 token 方式时不要设置密码,设置密码会重新登录,刷新token |
vc | UIViewController | 是 | 执行跳转的 vc |
resultBlock | Block | 否 | 执行结果,code=1 为成功 |
事例:
[SobotCallApi loginUser:fieldUserName.text password:fieldPassword.text token:fieldToken.text result:^(NSInteger code, id _Nullable obj, NSString * _Nullable msg) {
if(code == 1){
// 直接创建VC,自行决定使用
SobotCallHomeController *orderHomeVC = [[SobotCallHomeController alloc]init];
}
}];
2
3
4
5
6
7
8
9
方式3:以AppKey和appid的方式登录,需要先完成登录,然后再执行跳转。 (3.0.2 版本新增) 方法:
/// 以AppKey和appid的方式登录
/// @param account 账号
/// @param app_key AppKey
/// @param appid appid
/// @param vc 启动VC
/// @param resultBlock 回调结果
+(void)startWithAcount:(NSString *)account appkey:(NSString *)app_key appid:(NSString *) appid viewController:(UIViewController *)vc result:(SobotCallResultBlock) resultBlock;
2
3
4
5
6
7
8
参数
参数 | 类型 | 必填 | 描述 |
---|---|---|---|
account | NSString | 是 | 客服账户 |
AppKey | NSString | 是 | appkey |
appid | NSString | 是 | appid |
vc | UIViewController | 是 | 执行跳转的 vc |
resultBlock | Block | 否 | 执行结果,code=1 为成功 |
事例:
[SobotCallApi startWithAcount:@"123@123.com" appkey:@"your appkey" appid:@"your appid" viewController:self result:^(NSInteger code, id _Nullable obj, NSString * _Nullable msg) {
}];
2
3
4
5
6
# 初始化
# ● 域名设置(可选)
域名说明:
默认SaaS平台域名为:https://api.sobot.com。
如果您是腾讯云服务,请设置为:https://www.soboten.com。
如果您是本地化部署,请使用自己的部署的服务域名。
示例代码:
SobotCallCacheEntity *config = [[SobotCallCacheEntity alloc] initWithBundleName:@"SobotCall"];
// 通用接口服务地址
config.openApiHost = @"https://api.sobot.com";
// 呼叫接口服务地址
config.callApiHost = @"https://openapi.sobot.com";
// 座席信令服务
config.stompSocketUri = @"wss://openapi.sobot.com/v6.0.0/webmsg/cc-webmsg";
// janus 消息监听服务
config.janusSocketUri = @"wss://rtc.sobot.com.cn/janus";
// janus 代理服务
config.sipProxy = @"sip:192.168.30.68:5060";
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# ● 初始化
初始化参数和调用方式:初始化信息 SobotCallCacheEntity 设置功能相关属性;初始化方法为本地执行,不会有异步请求,设置后立即生效。
主要调用代码如下:
【注意:启动智齿呼叫 SDK 之前,必须调用初始化接口 initWithConfig,否则将无法启动 SDK 】
方法:
/// 初始化配置
/// @param config SobotCallCacheEntity 配置类,域名/国际化/资源
/// @param kitInfo SobotKitConfig 配置类
/// @param resultBlock 初始化回调 (NSInteger code,id _Nullable obj,NSString *_Nullable msg);
+(void)initWithConfig:(SobotCallCacheEntity *) config kitInfo:(SobotCallParameter *)kitInfo result:(SobotCallResultBlock) resultBlock;
2
3
4
5
6
7
8
9
10
11
参数:
参数 | 类型 | 必填 | 描述 |
---|---|---|---|
config | NSObject | 是 | 软件基础配置,指定域名、资源名称、语言等 |
kitInfo | NSObject | 是 | UI相关配置 |
resultBlock | Block | 否 | 初始化状态回调,code=1 成功 |
示例代码:
SobotCallCacheEntity *config = [[SobotCallCacheEntity alloc] initWithBundleName:@"SobotCall"];
// 指定bundle名称
config.bundleName = @"SobotCall";
// 指定国际化文件在bundle中的路径
config.languageTableName = @"SobotLocalizable";
// 指定国际化文件名称
config.languagePathInBundle = @"Localizable";
// 指定颜色在bundle中的文件名称
config.colorTableName = @"SobotColor";
// 指定语言
config.absoluetelanguage = @"zh-Hans";
// 通用接口服务地址
config.openApiHost = @"https://api.sobot.com";
// 呼叫接口服务地址
config.callApiHost = @"https://openapi.sobot.com";
// 座席信令服务
config.stompSocketUri = @"wss://openapi.sobot.com/v6.0.0/webmsg/cc-webmsg";
// janus 消息监听服务
config.janusSocketUri = @"wss://rtc.sobot.com.cn/janus";
// janus 代理服务
config.sipProxy = @"sip:192.168.30.68:5060";
SobotCallParameter *kitInfo = [[SobotCallParameter alloc]init];
kitInfo.showHomeBack = NO;
[SobotCallApi initWithConfig:config kitInfo:kitInfo result:^(NSInteger code, id _Nullable obj, NSString * _Nullable msg) {
}];
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# ● 权限设置
需要加入的权限
<key>NSMicrophoneUsageDescription</key>
<string>语音通话需要访问您的麦克风权限</string>
2
# 开放接口
# 初始化
使用开放接口第一步需要设置初始化配置
示例:
SobotCallCacheEntity *callCacheEntity = [[SobotCallCacheEntity alloc] init];
callCacheEntity.callApiHost = @"https://openapi.soboten.com";
callCacheEntity.openApiHost = @"https://api.sobot.com";
callCacheEntity.stompSocketUri = @"wss://openapi.soboten.com/v6.0.0/webmsg/cc-webmsg";
callCacheEntity.janusSocketUri = @"wss://rtc.sobot.com.cn/janus";
callCacheEntity.sipProxy = @"sip:192.168.30.68:5060";
[SobotCallOpenApi initWithConfig:callCacheEntity result:^(NSInteger code, id _Nullable obj, NSString * _Nullable msg) {
}];
2
3
4
5
6
7
8
9
10
# 请求参数
详见 SobotCallCacheEntity 说明。
# 回调函数
详见 SobotCallResultBlock 说明。
# 登录操作
# ● 登录
1.本接口的返回值会持续增加属性,请使用正确的兼容方式编码,保障返回值属性增加时,调用端的代码不会抛错。
示例:
/// 登录
/// @param account 账号
/// @param loginPwd 密码
/// @param token token
/// @param resultBlock 登录结果回调
/// 账号必填,密码和token 两者必须有一个有值
+(void)loginWithAcount:(NSString *)account
password:(NSString * )loginPwd
token:(NSString *)token
result:(SobotCallResultBlock) resultBlock;
2
3
4
5
6
7
8
9
10
# 请求参数
属性 | 名称 | 类型 | 可空 | 说明 |
---|---|---|---|---|
account | 登录账号 | string | 否 | 呼叫座席账号 |
loginPwd | 密码 | string | 否 | 呼叫座席的密码,有token时无需传密码 ,如果密码存在,会重新获取token |
token | 登录的token | string | 是 | 有token优先使用token登录,可以为空 |
# 回调函数
详见 SobotCallResultBlock 说明。
# ● 签入
- 本接口的返回值会持续增加属性,请使用正确的兼容方式编码,保障返回值属性增加时,调用端的代码不会抛错!
- 系统在本接口中获取最新的座席工号,如更换工号,请再重新签入后,更换的工号才生效。
- 从一个端调用签入接口会导致其他端断开连接(非座席离线);
- 支持座席服务端的登录状态=离线、在线等全部状态签入。但座席服务端工作状态=呼叫中、振铃中、通话中、保持中、整理中时,不允许签入。
示例:
+(void)agentLoginWithExt:(NSString *)ext
agentStatus:(int )agentStatus
callWay:(int)callWay
bindMobile:(NSString*)bindMobile
sipPassword:(NSString *)sipPassword
sipIp:(NSString *)sipIp
thisQueues:(NSArray *)thisQueues
ResultBlock:(SobotCallResultBlock)resultBlock;
2
3
4
5
6
7
8
# 请求参数
属性 | 名称 | 类型 | 可空 | 说明 |
---|---|---|---|---|
ext | 分机号码 | string | 否 | 分机号 |
agentStatus | 登录状态 | string | 否 | 签入成功后的座席登录状态。 1:在线;2:勿扰。 为空时,默认勿扰。 |
callWay | 登录方式 | int | 否 | 2.sip 3.手机登录 (不支持网页的签入方式) |
bindMobile | 绑定电话号码 | int | 是 | 手机号码或固话号码。 接听方式为手机时,绑定电话号码非空,接口指定的绑定电话号码会改变座席设置中绑定的电话号码。 不同座席绑定的电话号码不可相同。 |
thisQueues | 接待技能组组号集合 | NSArray | 是 | 接待技能组 |
# 成功回调函数返回值
属性 | 名称 | 类型 | 说明 |
---|---|---|---|
agentState | 登录状态 | string | 签入成功后的座席登录状态。 1:在线;2:勿扰。 为空时,默认勿扰。 |
phoneType | 接听方式 | string | 接口指定的接听方式签入成功后,会修改座席默认的接听方式。管理员重置座席接听方式权限也会改变座席默认的接听方式。 sip:SIP话机;pstn:手机;webrtc:网页。 为空时,系统取座席默认的接听方式。 |
bindExt | 绑定分机账号 | string | 接口指定的分机账号会改变座席设置中绑定的分机账号。 为空时,系统取座席设置中绑定的分机账号。 |
bindMobile | 绑定电话号码 | string | 手机号码或固话号码。 接口指定的电话号码会改变座席设置中绑定的电话号码。 为空时,系统取座席设置中绑定的电话号码。 |
reasonCode | 置忙原因 | number | 置忙的原因。 2:勿扰;11:小休;12:小休(培训);13:小休(会议);14:小休(用餐);15:小休(活动);16:小休(自定义1);17:小休(自定义2);18:小休(自定义3)。 |
agentLoginQueueInfos | 接待技能组 | List | 是 |
# 技能组信息 QueueAgentCheckin
属性 | 名称 | 类型 | 说明 |
---|---|---|---|
queueID | 技能组编码 | string | 技能组号码 |
queueName | 队列名称 | string | 技能组名称 |
queueWeight | 队列权重 | int | 队列权重 |
checkin | 签入组类型 | int | 0:默认签入组,1:可选签入组 默认是签入组 |
# 回调函数
详见 SobotCallResultBlock 说明。
# ● 签出
- 本接口的返回值会持续增加属性,请使用正确的兼容方式编码,保障返回值属性增加时,调用端的代码不会抛错!
- 座席工作状态为就绪中、置忙中、锁定中才可以。否则,不允许。
示例:
[SobotCallOpenApi logOut:^(NSInteger code, id _Nullable obj, NSString * _Nullable msg) {
}];
2
3
# 回调函数
详见 SobotCallResultBlock 说明。
# ● 置忙
- 本接口的返回值会持续增加属性,请使用正确的兼容方式编码,保障返回值属性增加时,调用端的代码不会抛错!
示例:
[SobotCallOpenApi noReady:2 resultBlock:^(NSInteger code, id _Nullable obj, NSString * _Nullable msg) {
}];
2
3
# 请求参数
属性 | 名称 | 类型 | 可空 | 说明 |
---|---|---|---|---|
reasonCode | 置忙原因 | number | 否 | 置忙后显示的登录状态。 2:勿扰;11:小休;12:小休(培训);13:小休(会议);14:小休(用餐);15:小休(活动);16:小休(自定义1);17:小休(自定义2);18:小休(自定义3)。 |
# 回调函数
详见 SobotCallResultBlock 说明。
# ● 置闲
- 本接口的返回值会持续增加属性,请使用正确的兼容方式编码,保障返回值属性增加时,调用端的代码不会抛错!
示例:
[SobotCallOpenApi ready:^(NSInteger code, id _Nullable obj, NSString * _Nullable msg) {
}];
2
3
4
# 回调函数
详见 SobotCallResultBlock 说明。
# ● 查询座席的签入信息
- 本接口的返回值会持续增加属性,请使用正确的兼容方式编码,保障返回值属性增加时,调用端的代码不会抛错!
- 该接口在登录成功后再调用
示例:
+(void)queryLoginBingInfo:(SobotCallResultBlock) resultBlock;
# 返回值
属性 | 名称 | 类型 | 可空 | 说明 |
---|---|---|---|---|
serviceId | 座席ID | String | 否 | 座席ID |
agentID | 座席工号 | String | 否 | 座席工号 |
agentName | 座席名称 | String | 否 | 座席名称 |
thisDN | 分机号 | String | 否 | 绑定分机账号 |
phone | 电话号码 | String | 否 | 绑定电话号码 |
phoneTypes | 接听方式 | List | 否 | 接听方式 |
receptionQueues | 正在接待的技能组List | List | 否 | 查询座席实时已签入的技能组数据(当时已生效的接待技能组)。 |
# 回调函数
详见 SobotCallResultBlock 说明。
# ● 查询座席可用的接听方式
- 本接口的返回值会持续增加属性,请使用正确的兼容方式编码,保障返回值属性增加时,调用端的代码不会抛错!
- 该接口在登录成功后再调用
示例:
+(void)queryPhoneType:(SobotCallResultBlock) resultBlock;
# 返回值
属性 | 名称 | 类型 | 可空 | 说明 |
---|---|---|---|---|
agentUuid | 座席ID | String | 否 | 座席ID |
agentID | 座席工号 | String | 否 | 座席工号 |
agentName | 座席名称 | String | 否 | 座席名称 |
ext | 分机号 | String | 否 | 绑定分机账号 |
phone | 电话号码 | String | 否 | 绑定电话号码 |
phoneTypes | 接听方式 | List | 否 | 接听方式集合 |
# 回调函数
详见 SobotCallResultBlock 说明。
# ● 查询座席可用的分机号
- 本接口的返回值会持续增加属性,请使用正确的兼容方式编码,保障返回值属性增加时,调用端的代码不会抛错!
- 该接口在登录成功后再调用
示例:
+(void)queryUnusedExts:(SobotCallResultBlock)resultBlock;
# 返回值
属性 | 名称 | 类型 | 可空 | 说明 |
---|---|---|---|---|
data | 分机信息数组 | List | 否 | 分机集合信息 |
Ext 说明
属性 | 名称 | 类型 | 可空 | 说明 |
---|---|---|---|---|
ext | 分机号 | String | 否 | 分机号码 |
bindStatus | 分机绑定状态 | String | 否 | 0-未绑定,1-表示已绑定 |
# 回调函数
详见 SobotCallResultBlock 说明。
# ● 查询座席的登录状态
- 本接口的返回值会持续增加属性,请使用正确的兼容方式编码,保障返回值属性增加时,调用端的代码不会抛错!
- 该接口在登录成功后再调用
示例:
+(void)queryStates:(SobotCallResultBlock)resultBlock;
2
# 回调函数
详见 SobotCallResultBlock 说明。
# ● 查询座席可用的置忙原因
- 本接口的返回值会持续增加属性,请使用正确的兼容方式编码,保障返回值属性增加时,调用端的代码不会抛错!
示例:
+(void)queryAgentBusyStatus:(SobotCallResultBlock)resultBlock;
# 返回值
属性 | 名称 | 类型 | 可空 | 说明 |
---|---|---|---|---|
data | 置忙信息数组 | List | 否 | 置忙原因集合 |
AgentBusyStatus
属性 | 名称 | 类型 | 可空 | 说明 |
---|---|---|---|---|
name | 状态名称 | String | 否 | 状态名称 |
code | 状态码 | String | 否 | 状态码 |
# 回调函数
详见 SobotCallResultBlock 说明。
# ● 查询座席可签入的技能组
- 本接口的返回值会持续增加属性,请使用正确的兼容方式编码,保障返回值属性增加时,调用端的代码不会抛错!
示例:
+(void)queryReceptionQueues:(SobotCallResultBlock)resultBlock;
2
# 返回值
属性 | 名称 | 类型 | 可空 | 说明 |
---|---|---|---|---|
data | 座席当前接待的技能组 | List | 否 | 技能信息集合 |
# 回调函数
详见 SobotCallResultBlock 说明。
# ● 重置离线(退出登录)
- 本接口的返回值会持续增加属性,请使用正确的兼容方式编码,保障返回值属性增加时,调用端的代码不会抛错!
示例:
+(void)logOut:(SobotCallResultBlock)resultBlock;
# 回调函数
详见 SobotCallResultBlock 说明。
# 呼叫操作
# ● 外呼
- 本接口的返回值会持续增加属性,请使用正确的兼容方式编码,保障返回值属性增加时,调用端的代码不会抛错!
示例:
/// 外呼
/// @param otherDN 客户号码
/// @param privacyNumber 客户号码加密
/// @param companyId 企业ID,如果不传,默认为登录时返回的companyId
/// @param ANI 指定客户侧的外显号码
/// @param outboundPlanCode 指定客户侧的外显号码方案编码 (可选 外呼路由编码,根据智齿系统设定的外呼路由编码,匹配一个外显号码呼叫客户)
/// @param resultBlock 结果回调
+(void)makeCallWithotherDN:(NSString *)otherDN
privacyNumber:(NSString*)privacyNumber
companyId:(NSString*)companyId
ani:(NSString *)ANI
userData:(NSDictionary *)userData
outboundPlanCode:(NSString *)outboundPlanCode
ResultBlock:(SobotCallResultBlock)resultBlock
2
3
4
5
6
7
8
9
10
11
12
13
14
# 请求参数
属性 | 名称 | 类型 | 可空 | 说明 |
---|---|---|---|---|
otherDN | 客户号码 | string | 否 | UI显示的客户号码。例如:135XXXXX5678;13512345678; |
privacyNumber | 客户号码加密 | string | 是 | 支持加密号码外呼;例如:XFHAOWHFEFLASJLKWJLD; |
ANI | 指定客户侧的外显号码 | string | 是 | 企业数据权限范围内的有效号码,可不在座席设置数据权限范围内。 非空时,系统使用该号码外呼客户。座席外呼路由中设置的数据都失效。 指定客户侧的外显号码和指定客户侧的外显号码方案编码都为空时,系统使用<外呼路由>中座席设置的规则和号码外呼。 |
outboundPlanCode | 指定客户侧的外显号码方案编码 | string | 是 | 企业数据权限范围内的有效动态外显号码方案,可不在座席设置数据权限范围内。 指定客户侧的外显号码非空时,指定客户侧的外显号码方案编码必须为空。 非空时,系统使用该方案查询号码外呼。座席外呼路由中设置的数据都失效。 指定客户侧的外显号码和指定客户侧的外显号码方案编码都为空时,系统使用<外呼路由>中座席设置的规则和号码外呼。 |
userData | 自定义数据 | object | 是 | 在电话事件中会返回该值。 在通话记录中会存储该值。 需要encodeURIComponent编码 |
# 回调函数
详见 SobotCallResultBlock 说明。
# ● 接听
- 本接口的返回值会持续增加属性,请使用正确的兼容方式编码,保障返回值属性增加时,调用端的代码不会抛错!
示例:
[SobotCallOpenApi answer:^(NSInteger code, id _Nullable obj, NSString * _Nullable msg) {
}];
2
3
# 回调函数
详见 SobotCallResultBlock 说明。
# ● 挂机
- 本接口的返回值会持续增加属性,请使用正确的兼容方式编码,保障返回值属性增加时,调用端的代码不会抛错!
示例:
[SobotCallOpenApi hangup:^(NSInteger code, id _Nullable obj, NSString * _Nullable msg) {
}];
2
3
# 回调函数
详见 SobotCallResultBlock 说明。
# ● 保持
- 本接口的返回值会持续增加属性,请使用正确的兼容方式编码,保障返回值属性增加时,调用端的代码不会抛错!
- 暂时挂起座席和客户的通话,保持后,客户会听到保持音乐,座席侧静音。
- 本操作支持SIP话机;网页;手机;3种接听方式。
示例:
[SobotCallOpenApi holdCall:^(NSInteger code, id _Nullable obj, NSString * _Nullable msg) {
}];
2
3
# 回调函数
详见 SobotCallResultBlock 说明。
# ● 取消保持
- 本接口的返回值会持续增加属性,请使用正确的兼容方式编码,保障返回值属性增加时,调用端的代码不会抛错!
- 恢复挂起的座席和客户的通话,取消保持后,客户和座席恢复正常通话。
示例:
[SobotCallOpenApi retrieveCall:^(NSInteger code, id _Nullable obj, NSString * _Nullable msg) {
}];
2
3
4
# 回调函数
详见 SobotCallResultBlock 说明。
# ● 静音
- 本接口的返回值会持续增加属性,请使用正确的兼容方式编码,保障返回值属性增加时,调用端的代码不会抛错!
- 关闭操作座席的麦克风,使其他人都无法听到当前座席端的声音。例如:座席A咨询座席B,座席A和座席B都可以操作静音关闭自己的麦克风。
- 监听发起者不支持该操作(发起者的麦克风在监听中,始终是关闭状态)。
- 本操作支持SIP话机;网页;手机;3种接听方式。
示例:
/// 静音
/// @param resultBlock 结果回调
[SobotCallOpenApi muteCall:^(NSInteger code, id _Nullable obj, NSString * _Nullable msg) {
}];
2
3
4
5
# 回调函数
详见 SobotCallResultBlock 说明。
# ● 取消静音
- 本接口的返回值会持续增加属性,请使用正确的兼容方式编码,保障返回值属性增加时,调用端的代码不会抛错!
- 恢复座席侧的麦克风,使其他人和座席恢复正常通话。
示例:
/// 取消静音
/// @param resultBlock 结果回调
[SobotCallOpenApi unmute:^(NSInteger code, id _Nullable obj, NSString * _Nullable msg) {
}];
2
3
4
5
# 回调函数
详见 SobotCallResultBlock 说明。
# ● 查询声音播放类型
听筒和扬声器来回切换。
示例:
///
///查询声音播放类型
NSString *type = [SobotCallOpenApi searchPlayCategory];
2
3
4
5
# 返回值
属性 | 名称 | 类型 | 说明 |
---|---|---|---|
AVAudioSessionCategory | 播放类型 | String | 扬声器模式AVAudioSessionCategoryPlayback 听筒模式AVAudioSessionCategoryPlayAndRecord |
# ● 设置声音播放类型
听筒和扬声器来回切换。
示例:
///
///设置声音播放类型
[SobotCallOpenApi changedPlayCategory:^(NSInteger code, id _Nullable obj, NSString * _Nullable msg) {
}];
2
3
4
5
6
# 返回值
属性 | 名称 | 类型 | 说明 |
---|---|---|---|
AVAudioSessionCategory | 播放类型 | String | 扬声器模式AVAudioSessionCategoryPlayback 听筒模式AVAudioSessionCategoryPlayAndRecord |
# 回调函数
详见 SobotCallResultBlock 说明。
# ● 发送满意度
- 本接口的返回值会持续增加属性,请使用正确的兼容方式编码,保障返回值属性增加时,调用端的代码不会抛错!
- 座席发送满意度后,系统断开所有座席侧话路(包括监听;三方等),保留客户侧话路,播放满意度评价;同时挂断所有座席侧话路。
示例:
/// 发送满意度
/// @param resultBlock 结果回调
[SobotCallOpenApi sendSatisfy:^(NSInteger code, id _Nullable obj, NSString * _Nullable msg) {
}];
2
3
4
5
6
# 回调函数
详见 SobotCallResultBlock 说明。
# ● 延长整理时长
- 本接口的返回值会持续增加属性,请使用正确的兼容方式编码,保障返回值属性增加时,调用端的代码不会抛错!
- 座席电话状态为整理中时,可以延长整理时长;30-900秒。
示例:
[SobotCallOpenApi delayACW:30 ResultBlock:^(NSInteger code, id _Nullable obj, NSString * _Nullable msg) {
}];
2
3
4
# 请求参数
属性 | 名称 | 类型 | 可空 | 说明 |
---|---|---|---|---|
delayTime | 延长时间 | number | 否 | 正整数,30-900秒 |
# 回调函数
详见 SobotCallResultBlock 说明。
# ● 结束整理
- 本接口的返回值会持续增加属性,请使用正确的兼容方式编码,保障返回值属性增加时,调用端的代码不会抛错!
- 座席电话状态为整理中时,可以提前结束整理状态。
示例:
/// 结束整理
/// @param resultBlock 结果回调
[SobotCallOpenApi completeACW:^(NSInteger code, id _Nullable obj, NSString * _Nullable msg) {
}];
2
3
4
5
6
# 回调函数
详见 SobotCallResultBlock 说明。
# ● 结束整理并置忙
- 本接口的返回值会持续增加属性,请使用正确的兼容方式编码,保障返回值属性增加时,调用端的代码不会抛错!
- 座席电话状态为整理中时,可以提前结束整理状态并且进入勿扰状态。
示例:
/// 结束整理并置忙
/// @param resultBlock 结果回调
[SobotCallOpenApi completeACWToBusy:^(NSInteger code, id _Nullable obj, NSString * _Nullable msg) {
}];
2
3
4
5
6
# 回调函数返回值
详见 SobotCallResultBlock 说明。
# ● 发送按键
- 本接口的返回值会持续增加属性,请使用正确的兼容方式编码,保障返回值属性增加时,调用端的代码不会抛错!
示例:
/// 发送按键
/// @param dtmfDigits 按键对应值(一次请求发送一个按键值,如,801#,则依次发送8、0、1、#这些按键请求,该参数不可为空)
/// @param resultBlock 结果回调
[SobotCallOpenApi agentSendDtmf:@"#" ResultBlock:^(NSInteger code, id _Nullable obj, NSString * _Nullable msg) {
}];
2
3
4
5
6
7
8
# 请求参数
属性 | 名称 | 类型 | 可空 | 说明 |
---|---|---|---|---|
dtmfDigits | 按键集合 | string | 否 | 最大24位。字符包含1-9、*、#。例如:801#。 |
# 回调函数返回值
详见 SobotCallResultBlock 说明。
# 辅助操作
# ● 查询座席的外呼路由规则
- 本接口的返回值会持续增加属性,请使用正确的兼容方式编码,保障返回值属性增加时,调用端的代码不会抛错!
- 座席签入后,可以查询座席《外呼路由》中设置的外呼路由规则。
示例
/// 查询座席的外呼路由规则
/// @param resultBlock 结果回调。
[SobotCallOpenApi queryRoutes:^(NSInteger code, id _Nullable obj, NSString * _Nullable msg) {
if(code == CALL_CODE_SUCCEEDED){
}
}];
2
3
4
5
6
7
8
9
10
# 回调函数返回值
详见 SobotCallResultBlock 说明。
# 返回值 obj 说明
属性 | 名称 | 类型 | 说明 |
---|---|---|---|
agentUUID | 座席ID | string | 座席ID |
agentID | 座席工号 | string | 座席工号 |
agentName | 座席名称 | string | 座席名称 |
explicitRule | 外显规则数组 | object | 外显规则集合。见下表1 |
explicitSchema | 动态外显方案数组 | object | 动态外显方案集合。见下表2 |
explicitNumbers | 外显号码数组 | object | 外显号码集合。见下表3 |
表1 explicitRule 外显规则数组说明
属性 | 名称 | 类型 | 说明 |
---|---|---|---|
code | 编码 | string | 1:企业号码池随机匹配;2:动态外显号码方案匹配;3:座席号码池指定。 |
name | 名称 | string | 名称。 |
hasSet | 是否默认 | boolean | 集合中只有1条数据为默认数据。 true:默认外显规则;false:非默认外显规则。 |
表2 explicitSchema 动态外显方案数组说明
属性 | 名称 | 类型 | 说明 |
---|---|---|---|
code | 编码 | string | 方案id |
planName | 名称 | string | 名称。 |
hasSet | 是否默认 | boolean | 集合中只有1条数据为默认数据。 true:默认方案;false:非默认方案。 |
表3 explicitNumbers 外显号码数组说明
属性 | 名称 | 类型 | 说明 |
---|---|---|---|
number | 外显号码 | string | 中继号码。 |
nickName | 号码别名 | string | 中继号码的别名。 |
hasSet | 是否默认 | boolean | 集合中只有1条数据为默认数据。 true:默认外显号码;false:非默认外显号码。 |
# ● 修改座席的外呼路由规则
- 本接口的返回值会持续增加属性,请使用正确的兼容方式编码,保障返回值属性增加时,调用端的代码不会抛错!
- 座席电话空闲的时候,可以切换座席最后使用的外显规则。
示例:
/// 修改座席的外呼路由规则
/// @param explicitRule 外显规则 (1:企业号码池随机匹配;2:动态外显号码方案匹配;3:座席号码池指定;单选;)
/// @param explicitCode 动态外显方案编码 外显规则为动态外显号码方案时必传
/// @param explicitNumber 外显号码 不使用外显规则,直接指定企业的某外显号码呼叫客户,外显号码和外显规则至少需要传一个
/// @param resultBlock 结果回调
[SobotCallOpenApi agentSetRouteExplicitRule:@"1" explicitCode:@"" explicitNumber:@"" resultBlock:^(NSInteger code, id _Nullable obj, NSString * _Nullable msg) {
}];
2
3
4
5
6
7
8
9
10
11
# 请求参数
属性 | 名称 | 类型 | 可空 | 说明 |
---|---|---|---|---|
explicitRule | 外显规则 | string | 否 | 需在<外呼路由>中座席的外显规则数据权限范围内。 1:企业号码池随机匹配;2:动态外显号码方案匹配;3:座席号码池指定。 |
explicitCode | 动态外显方案编码 | string | 是 | 需在<外呼路由>中座席的动态外显方案数据权限范围内。 当外显规则=动态外显号码方案匹配时,非空。 |
explicitNumber | 外显号码 | string | 是 | 需在<外呼路由>中座席的个人号码池数据权限范围内。 当外显规则=座席号码池指定时,非空。 |
# 回调函数返回值
详见 SobotCallResultBlock 说明。
# 返回值
属性 | 名称 | 类型 | 说明 |
---|---|---|---|
agentUUID | 座席ID | string | 座席ID |
agentID | 座席工号 | string | 座席工号 |
agentName | 座席名称 | string | 座席名称 |
explicitRule | 外显规则数组 | object | 外显规则集合。见下表1 |
explicitSchema | 动态外显方案数组 | object | 动态外显方案集合。见下表2 |
explicitNumbers | 外显号码数组 | object | 外显号码集合。见下表3 |
表1 explicitRule 外显规则数组说明
属性 | 名称 | 类型 | 说明 |
---|---|---|---|
code | 编码 | string | 1:企业号码池随机匹配;2:动态外显号码方案匹配;3:座席号码池指定。 |
name | 名称 | string | 名称。 |
hasSet | 是否默认 | boolean | 集合中只有1条数据为默认数据。 true:默认外显规则;false:非默认外显规则。 |
表2 explicitSchema 动态外显方案数组说明
属性 | 名称 | 类型 | 说明 |
---|---|---|---|
code | 编码 | string | 方案id |
planName | 名称 | string | 名称。 |
hasSet | 是否默认 | boolean | 集合中只有1条数据为默认数据。 true:默认方案;false:非默认方案。 |
表3 explicitNumbers 外显号码数组说明
属性 | 名称 | 类型 | 说明 |
---|---|---|---|
number | 外显号码 | string | 中继号码。 |
nickName | 号码别名 | string | 中继号码的别名。 |
hasSet | 是否默认 | boolean | 集合中只有1条数据为默认数据。 true:默认外显号码;false:非默认外显号码。 |
# 通用属性说明
# ● 接口统一回调 SobotCallResultBlock
所有接口统一使用本规则返回结果,已返回主线程,可直接刷新 UI。
参数 | 类型 | 必填 | 描述 |
---|---|---|---|
code | int | YES | 0,失败,1成功(本版本仅有2个返回值)。 |
obj | object | 否 | 网络接口json会转换为字典,非接口操作值为空。 |
msg | String | 否 | 网络接口为 json 字符串,非接口操作为操作结果描述,失败时为失败原因。 |
当为成功状态时,请根据如下监听获取座席实时状态和呼叫事件:
监听座席状态
事件说明参考呼叫事件(TS) (opens new window)。
//1.使用block方式实现监听
[[SobotCallClient getSobotCallClient] setCallOpenWebListenerBlock:^(id _Nullable obj, id _Nullable object, id _Nullable msg) {
NSDictionary *dict = (NSDictionary *)msg;
if(!sobotIsNull(dict)){
NSString *messageId = sobotConvertToString(dict[@"messageID"]);
if([@"RequestHangup" isEqual:messageId]){
// 挂断
}
if([@"EventAgentConnectionChanged" isEqual:messageId] || [@"EventAgentLogout" isEqualToString:messageId]){
}
if([@"EventDialing" isEqual:messageId]){
}
if([@"EventAgentReady" isEqual:messageId]){
// 挂断
}
if([@"EventEstablished" isEqual:messageId]){
// 对方接电话了
}
if([@"EventReleased" isEqual:messageId]){
// 挂断
}
if([@"EventMuted" isEqual:messageId]){
// 静音
}
if([@"EventUnmuted" isEqual:messageId]){
// 取消静音
}
if ([@"EventWebSocketSession" isEqual:messageId]) {
}
if([[messageId lowercaseString] containsString:@"error"]){
if([@"EventAgentError" isEqual:messageId]){
}
}
}
}];
//2.使用代理的方式实现监听
//>2.1 设置代理
[SobotCallClient getSobotCallClient].openDelegate = self;
//>2.2 实现代理方法
-(void)sobotCallOpenListenerobject:(id _Nullable)obj{
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
监听呼叫事件
1.使用block方式实现监听
[[SobotCallClient getSobotCallClient] setCallOpenSipListenerBlock:^(id _Nullable obj, id _Nullable object, id _Nullable msg) {
NSString *event = @"";
if(msg){
if([msg[@"result"] isKindOfClass:[NSDictionary class]]){
event = msg[@"result"][@"event"];
}
}
if([@"registered" isEqual:event]){
// 注册成功
}
if([@"hangup" isEqual:event]){
// 挂断
}
if([@"incomingcall" isEqual:event]){
NSDictionary *resultDict = msg[@"result"];
NSString *call_info = sobotConvertToString([msg objectForKey:@"call_info"]);
// 呼入不自动接,等着页面调用answer事件
if([@"offer" isEqual:jsep[@"type"]] && [call_info containsString:@"answer-after=0"]){
// 自动接听
}else{
// 等待接听
}
}
}
if([@"notify" isEqual:event]){
if([@"talk" isEqual:msg[@"result"][@"notify"]]){
}
}
if([@"accepted" isEqual:event]){
}
if([@"trickle" isEqual:msg[@"janus"]]){
}
}
}];
2.使用代理的方式实现监听
//>2.1 设置代理
[SobotCallClient getSobotCallClient].openDelegate = self;
//>2.2 实现代理方法
-(void)sobotCallOpenListenerobject:(id _Nullable)obj{
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# ● SobotCallParameter 类说明
配置立即生效,使用 SobotCallApi.h 中的如下函数配置,初始化和直接配置后配置覆盖前一个设置值;
参数 | 类型 | 必填 | 描述 |
---|---|---|---|
showHomeBack | BOOL | 否 | 首页是否显示返回按钮,默认NO,不显示。 |
设置方法:
/// 更改kitConfig配置
/// @param kitConfig congfig配置
+(void)configKitInfo:(SobotCallParameter *) kitConfig;
/// 初始化配置
/// @param config SobotCallCacheEntity 配置类,域名/国际化/资源
/// @param kitInfo SobotKitConfig 配置类
/// @param resultBlock 初始化回调 (NSInteger code,id _Nullable obj,NSString *_Nullable msg);
+(void)initWithConfig:(SobotCallCacheEntity *) config kitInfo:(SobotCallParameter *)kitInfo result:(SobotCallResultBlock) resultBlock;
2
3
4
5
6
7
8
9
10
11
# ● SobotCallCacheEntity类说明
初始化时必须配置此属性,配置一次即可,无需重复配置。
参数 | 类型 | 必填 | 描述 |
---|---|---|---|
bundleName | NSString | 否 | 资源名称,默认 SobotOrder,默认 SobotOrder。 |
languagePathInBundle | NSString | 否 | bundle中的国际化文件路径 , 固定值Localizable。 |
languageTableName | NSString | 否 | bundle中国际化文件名称,固定值SobotLocal。 |
colorTableName | NSString | 否 | bundle中颜色文件名称,固定值:SobotColor。 |
absoluetelanguage | NSString | 否 | 指定语言,默认跟随系统。 |
defaultlanguage | NSString | 否 | 无法识别时默认语言,默认跟随系统。 |
openApiHost | NSString | 否 | 公共接口域名。 |
callApiHost | NSString | 否 | 呼叫服务域名。 |
stompSocketUri | NSString | 否 | 座席状态监听服务地址。 |
janusSocketUri | NSString | 否 | janus链接服务地址。 |
sipProxy | NSString | 否 | janus代理服务地址。 |
# 源码和Demo
智齿 SDK 功能体验 Demo下载地址 (opens new window)
# 常见问题
1.token 怎么获取?
通过智齿登录接口获取登录 token,注意此处 token 为开发模块获取的token,非新版 v6 版本accessToken,如果无法获取请使用用户名、密码完成登录,体验效果完全一样,请放心使用。
2.无法正常登录?
登录之前请确认是否执行初始化操作,初始化操作为本地赋值;不会有异步请求,主要会设置域名及基础配置信息,确认登录信息正确的情况下,主要验证一下是否为域名不匹配。
3.如果把呼叫主页面嵌入到其它框架使用?
请参考 Demo 项目,其中有使用tabbar把工单中心页面放入到里面管理的事例。
4.如果监听呼叫提醒?
目前呼叫没有消息通知,如果需要监听消息,请查看 SobotCallClient.h 中消息监听相关配置。
# 更新说明
《SDK 版本更新说明》 (opens new window)