呼叫能力 (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)