# iOS sdk集成文档

# 相关限制及注意事项

1、iOS SDK新版支持 iOS8 以上版本,同时支持 iPhone、iPad,支持竖屏和横屏。

2、目前发布xcode版本为XCode 11.3.1,建议使用新版开发

3、iOS目前仅仅支持超链接标签,其他html标签和属性均不识别

# 1.1 集成流程示意图

图片

# 1.2.文件说明

SDK包含(SobotKit.framework和SobotKit.bundle)、SobotDemo、和Doc相关说明文档。

文件名 说明 备注
SobotKit.framework 智齿SDK核心代码库
SobotKit.bundle 图片资源文件 表情资源文件 语言文件
ZCLibInitInfo.h 实体类:基础参数类(自定义用户配置信息)
ZCKitInfo.h 实体类:基础参数(UI自定义)
ZCSobotApi.h 连接客户端到智齿客服,该文件提供接入功能(原ZCSobot.h)
SobotKit.h 该文件引用所有SDK需要的文件
ZCUIBaseController UI界面父类,所有其它页面都继承此控制器
ZCChatController 主要UI界面,如果需要自己实现跳转,可直接引用实现
SobotLocalizable.strings 国际化语言文件,根据系统语言自动匹配
ZCLibClient.h 全局配置类,主要包含非UI相关的操作配置

# 2 集成方式选择

# 2.1 手动集成

2.7.14 版:

普通版: 下载链接:iOS_SDK_2.7.14

电商版: 下载链接:iOS_SDK_2.7.14_电商版

2.7.14 普通版 文档链接

2.7.14 电商版 文档链接

2.8.5:

普通版:

下载链接:iOS_SDK_2.8.5

电商版:

下载链接:iOS_SDK_2.8.5_电商版

解压[iOS_SDK],添加必要文件SobotKit.framework和SobotKit.bundle到你的工程里。智齿iOS_SDK 的实现,依赖了一些系统的框架,在开发应用时需要在工程里加入这些框架。开发者首先点击工程右边的工程名,然后在工程名右边依次选择TARGETS -> BuiLd Phases -> Link Binary With Libraries,展开 LinkBinary With Libraries后点击展开后下面的 + 来添加下面的依赖项:

  • AVFoundation.framework
  • AssetsLibrary.framework
  • AudioToolbox.framework
  • SystemConfiguration.framework
  • MobileCoreServices.framework
  • libz.1.2.5.tbd( dylib)
  • webkit.framwork

# 2.2 CocoPods集成

在podfile中加入:

// 普通版:
pod 'SobotKit'
// 电商版:
pod 'Sobotplatform'

如果搜索不到最新版本,请运行以下命令更新CocoPods仓库

pod repo update --verbose
如果无法更新到最新版本,可以删除索引文件,重新尝试
rm ~/Library/Caches/CocoaPods/search_index.json

清除pod缓存:

删除代码中的pod 文件夹,
pod cache clean SobotKit
再重新 pod install

# 3 基础集成说明

# 3.1 域名设置

域名说明:

  • 默认SaaS平台域名为:https://api.sobot.com

    如果您是腾讯云服务,请设置为:https://ten.sobot.com

    • 如果您是本地化部署,请使用自己的部署的服务域名

示例代码:

【注意:2.8.5之前版本设置域名一定要在所有接口请求之前设置,即在初始化之前就必须设置完】

// 2.8.5版本设置方式
// 初始化是设置域名,如果不设置,默认SaaS域名
[ZCSobotApi initSobotSDK:@"your appkey" host:@"" result:^(id  _Nonnull object) {
    
}];



//2.8.4及以前版本使用如下方式设置
//if([ZCLibClient getZCLibClient].libInitInfo == nil){
//    [ZCLibClient getZCLibClient].libInitInfo = [ZCLibInitInfo new];
//}
//[ZCLibClient getZCLibClient].libInitInfo.api_host = @"域名";

# 3.2 获取appkey

登录 智齿科技管理平台 获取,如图

图片

# 3.3 初始化

# 3.3.1 普通版:

初始化参数和调用方式:初始化信息和UI自定义分为2个模型,使用ZCLibInitInfo设置功能相关属性,ZCKitInfo设置相关UI属性,一起传递给初始化方法,详情见Demo调用代码;

主要调用代码如下:

【注意:启动智齿SDK之前,必须调用初始化接口initSobotSDK,否则将无法启动SDK】

接口:

// 2.8.5版本设置方式
// 初始化是设置域名,如果不设置,默认SaaS域名
[ZCSobotApi initSobotSDK:@"your appkey" host:@"" result:(void (^)(id object))resultBlock;

/**
 初始化智齿客服 2.7.2开始使用,默认使用SaaS域名
 @param appkey 智齿app_key(如果是电商版本,请填写自己公司的app_key)
 @param resultBlock 初始化结果回调
 */
-(void)initSobotSDK:(NSString *) app_key result:(void (^)(id object))resultBlock;


/**
 *  初始化智齿客服 (2.7.1之前使用),没有初始化结果
 **/
-(void)initSobotSDK:(NSString *) app_key;

参数:

参数名 类型 描述
app_key NSString app_key为必传,在支持后台->设置->APP,中查看
resultBlock NSString 初始化状态回调

示例代码:

#import <SobotKit/SobotKit.h>
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {   
      // Override point for customization after application launch.
    NSLog(@"%@",[ZCSobot getVersion]);
    // 错误日志收集(可选)
    // [ZCLibClient setZCLibUncaughtExceptionHandler];
    // 可选参数设置
    if([ZCLibClient getZCLibClient].libInitInfo == nil){
        [ZCLibClient getZCLibClient].libInitInfo = [ZCLibInitInfo new];
    }
    
    // 初始化,必须执行,并且必须在进入SDK之前调用
    [[ZCLibClient getZCLibClient] initSobotSDK:@"your app_key" result:^(id object) {
        NSLog(@"初始化完成%@",object);
    }];
    return YES;
}

# 3.3.2 电商版

初始化参数和调用方式:初始化信息和UI自定义分为2个模型,使用ZCLibInitInfo设置功能相关属性,ZCKitInfo设置相关UI属性,一起传递给初始化方法,详情见Demo调用代码;

主要调用代码如下:

【注意:启动智齿SDK之前,必须调用初始化接口initSobotSDK,否则将无法启动SDK,多次执行不会重复调用接口】

接口:

示例代码:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {   
      // Override point for customization after application launch.
    NSLog(@"%@",[ZCSobot getVersion]);
    // 错误日志收集(可选)
    // [ZCLibClient setZCLibUncaughtExceptionHandler];
    // 可选参数设置
    if([ZCLibClient getZCLibClient].libInitInfo == nil){
        [ZCLibClient getZCLibClient].libInitInfo = [ZCLibInitInfo new];
    }    
    [ZCLibClient getZCLibClient].libInitInfo.platform_key = @"私钥"
    //customer_code 商户对接id (仅电商版适用,如果没有app_key则必须提供)
    //[ZCLibClient getZCLibClient].libInitInfo.customer_code = @"商户id"
    // 添加  平台标识 (电商版必填)
    [ZCLibClient getZCLibClient].platformUnionCode = @"您注册的平台ID";
    
    // 初始化 
    //如果需要,请设置域名,一定要在初始化之前设置,否则初始化接口会失败
    [ZCSobotApi initSobotSDK:@"your app_key" host:@"" result:^(id object) {
    }];
    return YES;
}

# 3.3.3 权限设置

需要加入的权限

<key>NSCameraUsageDescription</key>
  <string>发送图片需要访问相机</string>
<key>NSLocalizedDescription</key>
  <string>使用推送服务</string>
<key>NSMicrophoneUsageDescription</key>
  <string>发送语音需要访问麦克风</string>
<key>NSPhotoLibraryUsageDescription</key>
  <string>发送图片需要访问相册</string>

# 3.4 启动智齿页面

# 3.4.1 启动客服页面

普通版本和电商版本启动方式一样

接口

+(void)startZCChatVC:(ZCKitInfo *) info
                with:(UIViewController *) byController
              target:(id<ZCChatControllerDelegate>) delegate
           pageBlock:(void (^)(id object,ZCPageBlockType type))pageClick
    messageLinkClick:(BOOL (^)(NSString *link)) messagelinkBlock;
    
 
// messageLinkClick 也可以单独使用方法设置,messagelinkBlock不为空的时候后面会覆盖之前设置
+(void)setMessageLinkClick:(BOOL (^)(NSString * _Nonnull))messagelinkBlock
    
    

参数

参数名 类型 描述
info ZCKitInfo 初始化参数自定义设置
byController UIViewController 执行跳转的vc
delegate ZCChatControllerDelegate 聊天页面的代理,可以实现留言跳转到自定义页面
pageClick void (^)(id object,ZCPageBlockType type) 点击返回时的回调
messagelinkBlock BOOL (^)(NSString *link) 点击消息连接回调,返回yes代表自己处理,返回false代表不处理

示例代码:

//设置必传参数,ZCLibInitInfo中的参数,都可以重新设置
ZCLibInitInfo *initInfo = [ZCLibClient getZCLibClient].libInitInfo;
// 设置用户id,标识用户的唯一依据,(一定不要写如123456、0、000000等固定值,同一个id的聊天记录会一样),如果不设置,默认会根据手机证书生成一个唯一标
initInfo.partnerid = @"";
// 重新赋值
[ZCLibClient getZCLibClient].libInitInfo = initInfo;

//配置UI
ZCKitInfo *uiInfo=[ZCKitInfo new];
// 如设置导航条颜色
uiInfo.customBannerColor = [UIColor redColor];
//[注意:初始化方法从2.7.0开始messageLinkClick带有Bool返回值,true自己处理,false表示不处理]
// target  如果传入的参数不为nil 需要实现 -(void)openLeaveMsgClick:(NSString*)tipMsg;代理方法 留言跳转到用户自定义的留言页
[ZCSobot startZCChatVC:uiInfo with:self target:nil pageBlock:^(id object, ZCPageBlockType type) {
                // 点击返回
                if(type==ZCPageBlockGoBack){
//                    NSLog(@"点击了关闭按钮");
                }
                
                // 页面UI初始化完成,可以获取UIView,自定义UI
                if(type==ZCPageBlockLoadFinish){
//                    NSLog(@"页面加载完成");
                }
    } messageLinkClick:^(NSString *link) {
        NSLog(@"%@",link);
//        当收到link = sobot://sendlocation 调用智齿接口发送位置信息
//        当收到link = sobot://openlocation?latitude=xx&longitude=xxx&address=xxx 可根据自己情况处理相关业务
        if( [link hasPrefix:@"sobot://sendlocation"]){
            //发送坐标点
            NSString *fullPath = GetDocumentsFilePath(fname);
            [imageData writeToFile:fullPath atomically:YES];
            // 发送位置信息
            [ZCSobot sendLocation:@{
                                    @"lat":@"40.001693",
                                    @"lng":@"116.353276",
                                    @"localLabel":@"北京市海淀区学清路38号金码大厦A座23层金码大酒店",
                                    @"localName":@"云景四季餐厅",
                                    @"file":fullPath}];
            return YES;
        }else if([link hasPrefix:@"sobot://openlocation"]){
            // 解析经度、纬度、地址:latitude=xx&longitude=xxx&address=xxx
            // 跳转到地图的位置
            NSLog(link);
            // 测试打开地图 高德网页版            
            NSString * urlString = @"";
            urlString = [[NSString stringWithFormat:@"http://uri.amap.com/marker?position=%f,%f&name=%@&coordinate=gaode&src=%@&callnative=0",@116.353276,@40.001693,@"北京市海淀区学清路38号金码大厦A座23层金码大酒店",@"智齿SDK"] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
            [[UIApplication sharedApplication]openURL:[NSURL URLWithString:urlString]];
           return YES;
        }
        return NO;

}];

# 3.4.2 启动商家列表(电商版)

【注:启动商家列表(仅电商版本支持)】

接口

// 2.8.5版本使用
+ (void)openZCChatListView:(ZCKitInfo *)info with:(UIViewController *)byController onItemClick:(void (^)(ZCUIChatListController *object,ZCPlatformInfo *info))itemClickBlock;


// 2.8.4以前版本使用
+(void)startZCChatListView:(ZCKitInfo *)info with:(UIViewController *)byController onItemClick:(void (^)(ZCUIChatListController *object,ZCPlatformInfo *info))itemClickBlock;

参数

参数名 类型 描述
info ZCKitInfo 设置UI 相关自定义参数
byController UIViewController 执行跳转的vc
delegate ZCChatControllerDelegate 聊天页面的代理,可以实现留言跳转到自定义页面
pageClick void (^)(id object,ZCPageBlockType type) 点击返回时的回调
itemClickBlock void (^)(ZCUIChatListController *object,ZCPlatformInfo *info) 自定义跳转,可以为null(注意:如果不为空内部不在做跳转处理)

示例代码:

// 新方法
[ZCSobotApi openZCChatListView:info with:byController onItemClick:itemClickBlock];
    


// 直接启动商家列表页面,2.8.4以前方式,建议使用新方法   
[ZCSobot startZCChatListView:uiInfo with:self onItemClick:nil];

// 启动商家列表,但是点击具体某一个商家可能需要重新配置参数,自己处理跳转情况,2.8.4以前方式,建议使用新方法
[ZCSobot startZCChatListView:uiInfo with:self onItemClick:^(ZCUIChatListController *object, ZCPlatformInfo *info) {
   // 商家某一条点击事件触发,自行启动智齿聊天页面,可以修改必传参数,ZCLibInitInfo中的参数,都可以重新设置
   [ZCSobot startZCChatVC:uiInfo with:object target:nil pageBlock:^(id object, ZCPageBlockType type) {

        } messageLinkClick:^BOOL(NSString *link) {

            return NO;

        }];
}];

# 3.4.3 启动客户服务中心

     ZCKitInfo *kitInfo = [ZCKitInfo new];
     
// 打开帮助中心页面
+ (void)openZCServiceCenter:(ZCKitInfo *) info
                         with:(UIViewController *) byController
                  onItemClick:(void (^)(ZCUIBaseController *object))itemClickBlock;
                  
	// 2.8.4以前版本方法
    [ZCSobot openZCServiceCentreVC:kitInfo with:self onItemClick:^(ZCUIBaseController *object, ZCOpenType type) {
        
    }];

效果如图: 图片

# 4 功能说明

# 4.1 机器人客服

# 4.1.1 对接指定机器人

在后台获取机器人编号:

图片

在 SDK 代码中配置:

ZCLibInitInfo *initInfo = [ZCLibClient getZCLibClient].libInitInfo;
libInitInfo.robotid =  @"机器人ID";

注意:如果不设置,取默认

# 4.1.2 自定义接入模式

根据自身业务的需要,可进行以下初始化参数配置,控制接入模式:

ZCKitInfo *uiInfo=[ZCKitInfo new];
// 是否开启语音功能 默认开启
  kitInfo.isOpenRecord = @"YES";
// 是否开启机器人语音,(付费,否则语音无法识别)
  kitInfo.isOpenRobotVoice = @"YES";
// 是否显示转人工按钮
  kitInfo.isShowTansfer = @"YES";
// 机器人未知回复次数
  kitInfo.unWordsCount = @"1";
// 是否开启智能转人工 (如输入“转人工”,直接转接人工),
需要隐藏转人工按钮,请参见isShowTansfer和unWordsCount属性
  kitInfo.isOpenActiveUser = @"YES";
// 智能转人工关键字,关键字作为key{@"转人工",@"1",@"R":@"1"}
  kitInfo.activeKeywords = @{@"转人工":@"",@"R":@"",@"r":@""};
//自定义接待模式 
注意:接待模式本地设置后本地优先,
PC端设置接待模式不再起效,建议使用PC端的设置
PC端的设置
0:跟随系统设置(默认) 
1:只有机器人,
2:仅人工 
3:智能客服-机器人优先 
4:智能客服-人工客
  libInitInfo.service_mode = 4;

# 4.1.3 自定义转人工事件

自定义转人工事件方法:

-(void)turnServiceWithGroupId:(NSString *)groupId  Obj:(id)obj Msg:(NSString*)msg KitInfo:(ZCKitInfo*)uiInfo ZCTurnType:(NSInteger)turnType Keyword:(NSString*)keyword KeywordId:(NSString*)keywordId

参数说明:

groupId 传入技能组id

obj   转人工参数

msg   转人工信息

uiInfo   配置商品信息和自动发送参数

turnType  转人工事件类型(按钮触发,关键字触发等)

keyword 关键字

keywordId 关键字id

【注意:如果实现该方法,SDK中转人工事件将交由外部控制处理,您可以跳转到自己设计的技能组页面,或者切换商品信息等,SDK中不会再执行转人工操作,需要自己调用转人工加接口turnServiceWithGroupId:实现具体的转人工操作】

自定义转人工回调事件:

拦截SDK 转人工事件 用于跳转到自己的app页面动态处理转人工 配置技能组id 商品信息等参数

@property (nonatomic,strong)  TurnServiceBlock    turnServiceBlock;

示例代码:

[ZCLibClient getZCLibClient].turnServiceBlock = ^(id obj,NSString *msg,NSInteger turnType, NSString *keyword ,NSString *keywordId) {
            // 自定义商品信息
            //ZCProductInfo *productInfo = [ZCProductInfo new];
            //productInfo.thumbUrl = @"商品图片URL";
            //productInfo.title = @"商品标题";
            //productInfo.desc = @"摘要";
            //productInfo.label = @"标签";
            //productInfo.link = @"http://www.sobot.com";
            //uiInfo.productInfo = productInfo;
            //uiInfo.isSendInfoCard = YES;// 转人工工成功后是否自动发送该商品卡片信息
        [[ZCLibClient getZCLibClient] turnServiceWithGroupId:@"技能组id" Obj:obj Msg:msg KitInfo:uiInfo ZCTurnType:turnType Keyword:keyword KeywordId:keywordId];
    };

# 4.1.4 设置转人工溢出

sdk中可以设置转人工指定技能组溢出

示例代码:

/**
 *  转人工 指定技能组 溢出
 *
 参数说明

    actionType 执行动作类型:
        to_group 指定技能组;
        to_service 指定客服。
    deciId 指定技能组或客服id
    optionId 溢出标记
        1:溢出;指定客服时
        2:不溢出;指定客服时
        3:溢出;指定技能组时
        4:不溢出;指定技能组时
    spillId 溢出条件
        1:客服不在线;指定客服时
        2:客服忙碌;指定客服时
        3:智能判断;指定客服时
        4:技能组无客服在线;指定客服组时
        5:技能组所有客服忙碌;指定客服组时
        6:技能组不上班;指定客服组时
        7:智能判断;指定客服组时
 
 [{"actionType":"to_group","optionId":"3","deciId":"162bb6bb038d4a9ea018241a30694064","spillId":"7"},{"actionType":"to_group","optionId":"4","deciId":"a457f4dfe92842f8a11d1616c1c58dc1"}]
  actionType:执行动作类型:
  to_group:转接指定技能组
  optionId:是否溢出  指定技能组时:3:溢出,4:不溢出。
  deciId:指定的技能组。
  spillId:溢出条件  指定客服组时:4:技能组无客服在线,5:技能组所有客服忙碌,6:技能组不上班,7:智能判断
  数组中最多设置4组,依次溢出
 */
 
 ZCLibInitInfo *initInfo = [ZCLibClient getZCLibClient].libInitInfo;
    initInfo.customGroupType = @[@{@"actionType":@"to_group",@"optionId":@"3",@"deciId":@"a890849f552b4b69b4a027db4e9a1880",@"spillId":@"4"},@{@"actionType":@"to_group",@"optionId":@"3",@"deciId":@"5600aa6786f34629a7484819b8132c3a",@"spillId":@"4"}];

# 4.2 人工客服

# 4.2.1 对接指定技能组

在后台获取技能组编号:

图片

在 SDK 代码中配置技能组ID:

ZCLibInitInfo *initInfo = [ZCLibClient getZCLibClient].libInitInfo;
initInfo.groupid =  @"技能组ID";

注意:此字段可选,如果传入技能组ID那么SDK内部转人工之后不在弹技能组的选择框,直接跳转到传入ID所对应的技能组中

# 4.2.2 对接指定客服

在后台获取指定客服ID:

图片

图片

在 SDK 代码中设置:

ZCLibInitInfo *initInfo = [ZCLibClient getZCLibClient].libInitInfo;
libInitInfo.choose_adminid =  @"客服ID";
libInitInfo.tran_flag =  @"0";

注意: 1 choose_adminid :指定对接的客服,如果不设置,取默认

2 tran_flag :设置指定客服之后是否必须转入指定客服

0 :可转入其他客服,

1: 必须转入指定客服,

注意:如果设置为1 ,当指定的客服不在线,不能再转接到其他客服

# 4.2.3 设置用户自定义资料和自定义字段

开发者可以直接传入这些用户信息,供客服查看。

在工作台自行配置所需要显示的字段,配置方法如下图:

图片

// 设置用户自定义字段
- (void)customUserInformation:(ZCLibInitInfo*)libInitInfo{
  libInitInfo.customerFields = @{@"customField22":@"我是自定义的分校",
                              @"userSex":@"保密",
                              @"weixin":@"微信号",
                              @"weibo":@"微博账号",
                              @"birthday":@"2017-06-08"};
}

# 4.2.4 设置转接成功后自动发消息

// 自动发送信息
ZCLibInitInfo *initInfo = [ZCLibClient getZCLibClient].libInitInfo;
initInfo.good_msg_type = 1; // 0 不发 1 给机器人发送 2 给人工发送  3 机器人和人工都发送
initInfo.content = @"123";

# 4.2.5 设置指定客户排队优先接入

sdk可以设置当前用户排队优先,当此用户进入排队状态时,将会被优先接待。

// 同PC端 设置-在线客服分配-排队优先设置-指定客户优先   开启传1 默认不设置
@property(nonatomic,assign) int queue_first;

# 4.2.6 设置服务总结自定义字段

图片

 initInfo.summaryParams = @{@"customField15615315349481":@"字段value1",@"customField15615315349482":@"字段value2"};

# 4.2.7 设置多轮会话接口参数

在使用多轮会话功能时,每一个接口我们都会传入 uid 和 mulitParams 两个固定的自定义参数,uid 是用户的唯一标识,mulitParams是自定义字段json字符串、如果用户对接了这两个字段,我们会将这两个字段回传给第三方接口、如果没有我们会传入空字段。

initInfo.summary_params = @{@"customField15619769556831":@"显示xxyyyzzz1032"};

# 4.2.8 商品卡片

商品的咨询信息并支持直接发送消息卡片仅人工模式下支持

// 商品的自定义类 ZCProductInfo  如果选择添加商品信息,请添加以下信息,其中标题"title"和页面地址url"link"是必填字段,如果没有添加页面中是不会显示的。
ZCProductInfo *productInfo = [ZCProductInfo new];
//thumbUrl 缩略图地址
productInfo.thumbUrl = @"缩略图的Url";
//  title 标题 (必填)
productInfo.title = @"标题";
//  desc 摘要
productInfo.desc = @"摘要";
//  label 标签
productInfo.label = @"标签";
//  页面地址url(必填) 
productInfo.link = @"发送商品链接";
libInitInfo.productInfo = productInfo;
//手动调用直接发送商品卡片
ZCProductInfo *productInfo = [ZCProductInfo new];
productInfo.thumbUrl = @"缩略图地址";
productInfo.title = @"标题";
productInfo.desc = @"摘要";
productInfo.label = @"标签";
productInfo.link = @"页面链接";
[ZCSobotApi sendProductInfo:productInfo resultBlock:nil];

效果图: 图片

# 4.2.9 订单卡片

sdk中可以发送自定义订单信息,仅人工模式下支持,如有此需求,可以使用如下方法进行设置:

配置按钮:

ZCKitInfo *kitInfo=[ZCKitInfo new];
NSMutableArray *arr = [[NSMutableArray alloc] init];
ZCLibCusMenu *menu1 = [[ZCLibCusMenu alloc] init];
menu1.title = [NSString stringWithFormat:@"订单"];
menu1.url = [NSString stringWithFormat:@"sobot://sendOrderMsg"];;
menu1.imgName = @"zcicon_sendpictures";
[arr addObject:menu1];
kitInfo.cusMoreArray = arr;

实现发送事件:

    [ZCSobotApi setMessageLinkClick:^BOOL(NSString *linkUrl) {
        if ([linkUrl hasPrefix:@"sobot://sendOrderMsg"]){
                ZCOrderGoodsModel *model = [ZCOrderGoodsModel new];
                model.orderStatus = 1;
                model.createTime = [NSString stringWithFormat:@"%.0f",[[NSDate date] timeIntervalSince1970]*1000*1000];
                model.goodsCount = @"3";
                model.orderUrl  = @"https://www.sobot.com";
                model.orderCode = @"1000234242342345";
                model.goods =@[@{@"name":@"商品名称",@"pictureUrl":@"http://pic25.nipic.com/20121112/9252150_150552938000_2.jpg"},@{@"name":@"商品名称",@"pictureUrl":@"http://pic31.nipic.com/20130801/11604791_100539834000_2.jpg"}];
                
                
                model.totalFee = @"4890";
                [ZCSobotApi sendOrderGoodsInfo:model resultBlock:nil];
                
                return NO;
            }
        
        return YES;
    }];

ZCOrderGoodsModel 类说明:

/**
发送订单消息字段:
 订单状态: orderStatus
 订单编号: orderCode
 订单创建时间: createTime
 商品图片链接: goodsPicturesUrls
 订单链接: orderUrl  ,
 商品描述: goodsDesc
 商品件数: goodsCount
 总金额: totalFee,单位为分,显示时会默认格式化为元,例如,传入4890,显示效果为48.90元
*/
/*
待付款: 1,
待发货: 2,
运输中: 3,
派送中: 4,
已完成: 5,
待评价: 6,
已取消: 7,
其它: 不在编码中的
 */
@property (nonatomic,assign) int orderStatus;

效果图: 图片

# 4.2.10 查看商户客服是否正在和用户聊天 (仅电商版可用)

/**
 *
 *   获取对应商户客服是否正在和用户聊天(仅电商版使用)
 *   appkey:商户id   uid: ZCPlatformInfo 类中的uid 
 **/
+(BOOL)getPlatformIsArtificialWithAppkey:(NSString *)appkey Uid:(NSString*)uid;

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{
 ZCPlatformInfo *info = [_listArray objectAtIndex:indexPath.row];
[ZCSobot getPlatformIsArtificialWithAppkey:info.appkey Uid:info.uid];
}

# 4.2.11 设置vip等级和用户标签

/**
 *
 *  指定客户是否为vip,0:普通 1:vip
 *  同PC端 设置-在线客服分配-排队优先设置-VIP客户排队优先   开启传1 默认不设置
 *  开启后 指定客户发起咨询时,如果出现排队,系统将优先接入。
 **/
@property (nonatomic,copy) NSString *isVip;


/**
 *
 *  指定客户的vip等级,传入等级
 *  同PC端 设置-自定义字段-VIP等级(注意设置编码,不是显示值)
 **/
@property (nonatomic,copy) NSString *vip_level;


/**
 *用户标签,多个字段用逗号分隔
 **/
@property (nonatomic,copy) NSString *user_label;

在 ZCKitInfo 中传入相关字段
eg:
ZCKitInfo *kitInfo=[ZCKitInfo new]; 
kitInfo.vip_level = @"";
kitInfo.user_label = @"";

# 4.2.11 获取最新留言回复

/// 获取最新回复
/// @param partnerid  用户id
/// @param ResultBlock code=1返回成功,
/// dict :data:items:[{(ticketId(工单id),ticketTitle(工单标题),replyContent(回复内容),replyTime(回复时间),customerId(客户id),serviceNick(客服昵称)}] 
+ (void)getLastLeaveReplyMessage:(NSString *) partnerid resultBlock:(void (^)(NSDictionary *dict,NSMutableArray *arr,int code))ResultBlock;

示例代码
 [ZCSobotApi getLastLeaveReplyMessage:[ZCLibClient getZCLibClient].libInitInfo.partnerid resultBlock:^(NSDictionary * _Nonnull dict, NSMutableArray * _Nonnull arr, int code) {
                            if(arr!=nil && arr.count > 0){
                                ZCRecordListModel *model = [arr firstObject];
                                
                                // 通知参数
                                NSString *identifier = [NSString stringWithFormat:@"leavereply.www.sobot.com%f",[[NSDate date] timeIntervalSinceNow]];
                                NSDictionary *userInfo = @{@"msgfrom":@"sobot",@"pushType":identifier,
                                             @"ticketId":model.ticketId
                                };
                                
                                
                                NSTimeInterval time = [model.replyTime doubleValue]/1000; // 传入的时间戳str如果是精确到毫秒的记得要/1000
                                NSDate *detailDate = [NSDate dateWithTimeIntervalSince1970:time];
                                NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; // 实例化一个NSDateFormatter对象
                                // 设定时间格式,这里可以设置成自己需要的格式
                                [dateFormatter setDateFormat:@"MM-dd HH:mm"];
                                NSString *currentDateStr = [dateFormatter stringFromDate:detailDate];
                                
                                NSString *replyContent = model.replyContent;
                                replyContent = [replyContent stringByReplacingOccurrencesOfString:@"<p>" withString:@""];
                                replyContent = [replyContent stringByReplacingOccurrencesOfString:@"</p>" withString:@""];
                                replyContent = [replyContent stringByReplacingOccurrencesOfString:@"<br/>" withString:@""];
                                NSString *replyStr = [NSString stringWithFormat:@"%@\n %@ \n %@",model.ticketTitle,currentDateStr,replyContent];
                                
                                
                                
                                [ZCSobotApi postLocalNotification:replyStr dict:userInfo];
                            }
                        }];

# 4.3 留言工单相关

# 4.3.1 用户信息自定义配置

留言中的邮箱、电话、附件这三个参数的校验和显示逻辑可在pc端console页面配置。

图片

# 4.3.2 跳转到留言页面

可以直接跳转到留言页面:

                        ZCKitInfo *kitInfo = [[ZCKitInfo alloc] init];
                        kitInfo.leaveContentPlaceholder = @"请输入内容";
                        kitInfo.leaveMsgGuideContent = @"我是自定义引导语";
                        NSMutableArray *customField = [[NSMutableArray alloc] init];
                        [customField addObject:@{@"id" : @"510fb45d6e9d4a9c99a7c24861d584d7", @"value" : @"ca55f29ed5dd4879bdf3ab213fec3381"}];
                        [customField addObject:@{@"id" : @"6ee93dd945ac47fcac1a80bf03fd23fd", @"value" : @"6ee93dd945ac47fcac1a80bf03fd23fd"}];
                        [customField addObject:@{@"id" : @"abd0229cd5a64798b74516b3f09bbd7e", @"value" : @"abd0229cd5a64798b74516b3f09bbd7e"}];
                        
                        kitInfo.leaveCusFieldArray = [customField copy];
                        kitInfo.leaveMsgGroupId = @"540a910a760f4387918b0fa7302a0eca";
                        [ZCSobotApi openLeanve:0 kitinfo:kitInfo with:self onItemClick:^(NSString *msg, int code) {
                            
                        }];

其中参数:

/**
 自定义留言内容预置文案,如果需要国际化,可自行在bundle文件中,以文案为key,翻译即可
 例如:"请输入内容"="Please enter content";
 */
@property (nonatomic,strong) NSString *leaveContentPlaceholder;

/**
 自定义留言引导语,如果需要国际化,可自行在bundle文件中,以文案为key,翻译即可
 例如:"无法解答你的问题,你可以留言"="Please leave";
 */
@property (nonatomic,strong) NSString *leaveMsgGuideContent;

/**
 *  直接进入留言自定义字段
 *  数组,可以以传递多个,临时方案,后期将废弃此字段
 *  id: 自定义字段的id
 *  value: 想传递的数据
 *  @{@"id":@"",@"value":@"我是数据"}
 *
 **/
@property (nonatomic,strong) NSMutableArray * leaveCusFieldArray;


/**
 留言技能组 id
 获取:设置 —>工单技能组设置
*/
@property (nonatomic,strong) NSString * leaveMsgGroupId;

# 4.3.3 留言页面事件拦截

sdk中留言可跳转到自定义页面,如有此需求,可以使用如下方法进行设置:

在启动VC 服从ZCChatControllerDelegate协议 
  在启动方法中 target(代理)传入启动VC 
[ZCSobotApi openZCChat:uiInfo with:self target:vc pageBlock:^(ZCChatController *object, ZCPageBlockType type) {
 } messageLinkClick:^(NSString *link) {
}];
实现代理方法:
-(void)openLeaveMsgClick:(NSString*)tipMsg{
// 点击留言的代理事件
    NSLog(@"tipMsg ==%@",tipMsg);
}

# 4.3.4 工作台设置留言界面

在工作台可以设置留言界面

图片

# 4.3.4 工单回复按钮

可通过参数配置是否显示留言按钮:

/**
 *  留言完成后,是否 显示 回复按钮
 *  默认为 yes  , 可以回复
 */
@property (nonatomic,assign) BOOL leaveCompleteCanReply;

# 4.4 评价

# 4.4.1 设置评价界面

在工作台可以设置 满意度评价界面

图片

# 4.4.2 评价的相关配置

/**
 *
 *   导航栏右上角 是否显示 评价按钮  默认不显示
 *
 **/
@property (nonatomic,assign) BOOL isShowEvaluation;
/**
 *
 *   针对关闭按钮,单独设置是否显示评价界面,默认不显示
 *
 **/
@property (nonatomic,assign) BOOL isShowCloseSatisfaction;
/**
 *  评价完人工是否关闭会话(人工满意度评价后释放会话)
 *  默认为NO 未开启
 *
 */
@property (nonatomic,assign) BOOL      isCloseAfterEvaluation;
/**
 *  返回时是否开启满意度评价
 *  默认为NO 未开启
 *
 */
@property (nonatomic,assign) BOOL      isOpenEvaluation;

# 4.4.3 返回时要求用户评价,关闭时要求用户评价

//返回或关闭时是否开启满意度评价 默认为NO 未开启
kitInfo.isOpenEvaluation = @"YES";
//评价完人工是否关闭会话(人工满意度评价后释放会话) 默认为NO 未开启
kitInfo.isCloseAfterEvaluation = @"YES";

# 4.5 消息相关

# 4.5.1 消息推送

注:如果你需要SDK推送的功能请参考以下消息通知、注册推送的相关代码,如果您的项目不需要请略过。

1、在生成appkey的时候,上传推送证书(.p12格式),导出证书一定要有密码;

2、推送只有与人工会话才会有效,机器人是直接回答没有推送;本地IM正常通信时会直接走支持IM通道,不会发送apns推送;

相关配置和代码

推送ZCLibClient.h关键属性说明

/**
推送的token
每次启动应用都需要重新设置
*/
@property (nonatomic,strong) NSData *token;
/**
测试模式,
根据此设置调用的推送证书,默认NO
NO ,调用生产环境
YES,测试环境
*/
@property (nonatomic,assign) BOOL isDebugMode;
/**
自动提醒消息
说明:如果开启自动提醒消息,当没有在智齿聊天页面的时候,都会主动把消息作为本地通知展示
*/
@property (nonatomic,assign) BOOL autoNotification;
/**
获取未读消息数
@return 未读消息数(进入智齿聊天页面会清空)
*/
-(int) getUnReadMessage;

注册推送

在AppDelegate.m 文件中注册推送。

导入头文件

#import <SobotKit/SobotKit.h>
#import <UserNotifications/UserNotifications.h>
#define SYSTEM_VERSION_GRATERTHAN_OR_EQUALTO(v)  ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] != NSOrderedAscending)

服从协议

<UIApplicationDelegate,UNUserNotificationCenterDelegate>

注册

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    
    [[UIApplication sharedApplication] setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone];
    [[UIApplication sharedApplication] setStatusBarHidden:NO withAnimation:UIStatusBarAnimationNone];
    
    if (SYSTEM_VERSION_GRATERTHAN_OR_EQUALTO(@"10")) {
        UNUserNotificationCenter *center = [UNUserNotificationCenter currentNotificationCenter];
        center.delegate = self;
        [center requestAuthorizationWithOptions:(UNAuthorizationOptionSound | UNAuthorizationOptionAlert |UNAuthorizationOptionBadge) completionHandler:^(BOOL granted, NSError * _Nullable error) {
            if (!error) {
                [[UIApplication sharedApplication] registerForRemoteNotifications];
            }
        }];
    }else{
         [self registerPush:application];
    }
    [[ZCLibClient getZCLibClient].libInitInfo setApp_key:@"your appKey"];
    // 设置推送是否是测试环境,测试环境将使用开发证书
    [[ZCLibClient getZCLibClient] setIsDebugMode:YES];
    // 错误日志收集
    [ZCLibClient setZCLibUncaughtExceptionHandler];
    return YES;
}
 
-(void)registerPush:(UIApplication *)application{
    // ios8后,需要添加这个注册,才能得到授权
    if ([[UIApplication sharedApplication] respondsToSelector:@selector(registerUserNotificationSettings:)]) {
        //IOS8
        //创建UIUserNotificationSettings,并设置消息的显示类类型
        UIUserNotificationSettings *notiSettings = [UIUserNotificationSettings settingsForTypes:(UIUserNotificationTypeBadge | UIUserNotificationTypeAlert | UIRemoteNotificationTypeSound) categories:nil];
        
        [application registerUserNotificationSettings:notiSettings];
        
    } else{ // ios7
        [application registerForRemoteNotificationTypes:(UIRemoteNotificationTypeBadge|UIRemoteNotificationTypeSound|UIRemoteNotificationTypeAlert)];
    }
}

- (void)application:(UIApplication *)application didRegisterForRemoteNotificationsWithDeviceToken:(NSData *)pToken{
    NSLog(@"---Token--%@", pToken);
    // 注册token
    [[ZCLibClient getZCLibClient] setToken:pToken];

}

APNS消息推送及提醒

// 是否自动提醒
[[ZCLibClient getZCLibClient] setAutoNotification:YES];
 
// 设置推送环境 
[[ZCLibClient getZCLibClient] setIsDebugMode:NO];

# 4.5.2 离线消息

离线消息设置

// 设置切换到后台自动断开长连接,不会影响APP后台挂起时长
// 进入前台会自动重连,断开期间消息会发送apns推送
[ZCLibClient getZCLibClient].autoCloseConnect = YES;



//  @note 检查当前消息通道是否建立,没有就重新建立, 如果调用 closeIMConnection 后,可调用此方法重新建立链接
[[ZCLibClient getZCLibClient] checkIMConnected];  
/* 检查当前监听是否被移除,如果移除就重新注册(重新激活
 网络监听 ZCNotification_NetworkChange
 UIApplicationDidBecomeActiveNotification
 UIApplicationDidEnterBackgroundNotifica
),经常和checkIMConnected一起使用
*/
[[ZCLibClient getZCLibClient] checkIMObserverWithRegister];
/**
 移除IM所有监听,可能会影响应用在后台存活时长,如果调用此方法后需要checkIMObserverWithCreate重新激活
 网络监听 ZCNotification_NetworkChange
 UIApplicationDidBecomeActiveNotification
 UIApplicationDidEnterBackgroundNotification
 */
[[ZCLibClient getZCLibClient] removeIMAllObserver];

/**
 @note 关闭当前消息通道,使其不再接受消息,如果配置推送了,消息会走apns送达
 */  
 [[ZCLibClient getZCLibClient] closeIMConnection];
 
 
 

     
// ReceivedMessageBlock 未读消息数, obj 当前消息  unRead 未读消息数
 [ZCLibClient getZCLibClient].receivedBlock = ^(id obj,int unRead,NSDictionary *object){
//        NSLog(@"当前消息数:%d \n %@",unRead,obj);
    };
    
// 关闭通道,清理内存,退出智齿客户(如果当前是人工咨询状态客户会离线,如果是机器人状态会直接中断当前会话,下次进入是新会话)
// 说明:调用此方法后将不能接收到离线消息,除非再次进入智齿SDK重新激活
// isClosePush:YES ,是关闭push;NO离线用户,但是可以收到push推送
+(void) closeAndoutZCServer:(BOOL) isClosePush; 
//事例
[ZCLibClient  closeAndoutZCServer:YES];

# 4.5.3 未读消息数操作

//直接获取未读消息数
[[ZCLibClient getZCLibClient] getUnReadMessage];
//清空未读消息数
 [[ZCLibClient getZCLibClient] clearUnReadNumber:@"userId"];

# 4.5.4 发送位置消息

发送位置信息,此方法,只能是收到初始化的链接监听到url=sobot://sendlocation时发起定位调用,否则可能发送失败,详细说明见ZCKitInfo.h中的canSendLocation属性说明

ZCKitInfo *uiInfo=[ZCKitInfo new];
// 设置开启发送
uiInfo.canSendLocation = YES;
// 配置发送按钮,注意menu1.url = sobot://sendlocation在启动页面的messageLinkClick中监听
NSMutableArray *arr = [[NSMutableArray alloc] init];
    for (int i = 0; i<1; i++) {
        ZCLibCusMenu *menu1 = [[ZCLibCusMenu alloc] init];
        menu1.title = [NSString stringWithFormat:@"位置"];
        menu1.url = [NSString stringWithFormat:@"sobot://sendlocation"];;
        menu1.imgName = @"zcicon_sendlocation";
        [arr addObject:menu1];
        ZCLibCusMenu *menu2 = [[ZCLibCusMenu alloc] init];
        menu2.title = [NSString stringWithFormat:@"商品"];
        menu2.url = [NSString stringWithFormat:@"sobot://sendProductInfo"];;
        menu2.imgName = @"zcicon_sendpictures";
        [arr addObject:menu2];
    }
uiInfo.cusMoreArray = arr;



// 发送位置方法,fullPath为图片本地完整路径
[ZCSobot sendLocation:@{
                        @"lat":@"40.001693",
                        @"lng":@"116.353276",
                        @"localLabel":@"北京市海淀区学清路38号金码大厦A座23层金码大酒店",
                        @"localName":@"云景四季餐厅",
                        @"file":fullPath}];

# 4.5.5 链接拦截

可以通过初始化之前的代码:

    [[ZCUICore getUICore] setLinkClickBlock:^BOOL(NSString *linkUrl) {
        
        return NO;
    }];

拦截用户点击消息中的链接

# 4.5.6 消息监听

可以通过初始化之前的代码:

    
// 当前用户会话状态
typedef NS_ENUM(NSInteger,ZCServerConnectStatus) {
    ZCServerConnectOffline    = 0, // 当前会话已经结束
    ZCServerConnectRobot      = 1, // 机器人
    ZCServerConnectArtificial = 2, // 人工接入成功
    ZCServerConnectWaiting    = 3  // 仅人工的排队
};
[[ZCLibClient getZCLibClient] setServerConnectBlock:^(id message, ZCServerConnectStatus status, NSDictionary *object) {
       
        
    }];

监听当前聊天状态变化

# 4.6 自定义UI设置

  1. 在导航栏区域,我们支持自定义导航栏区域的颜色及其字体颜色;
  2. 在会话页面区域,我们支持自定义会话区域的背景颜色、会话气泡颜色、会话字体颜色、提示气泡颜色、提示字体颜色、时间文字颜色;
  3. 在底部区域,我们支持自定义底部bottom背景颜色及输入框线条背景颜色;
  4. 其它部分,我们支持自定义相册导航栏的背景颜色及文字颜色、评价弹框中的文字颜色及按钮颜色、录音控件中的文字、商品详情展示中文字颜色(标题、详情、标签、发送)

具体代码实现请 查看代码中的 ZCKitInfo.h 文件 ,参考 ZCKitInfo 类说明

// 比如:设置对话页面背景为红色
ZCKitInfo *uiInfo=[ZCKitInfo new];
uiInfo.backgroundColor = [UIColor redColor];
    [ZCSobot startZCChatVC:uiInfo with:self target:nil pageBlock:^(id object, ZCPageBlockType type) {
        
    } messageLinkClick:^BOOL(NSString *link) {
        return NO;
    }];

【说明:代码未涉及到的自定义UI,可以直接替换SobotKit.bundle中的图片以达到你想要的效果,目前SDK仅支持超链接A、斜体I,加粗:strong、b,  换行br这几种html标签,可随意组合,对于除上述之外的html标签无法很好处理,会直接过滤掉其他的标签】

# 4.6.1 自定义顶部标题

ZCLibInitInfo *initInfo = [ZCLibClient getZCLibClient].libInitInfo;
// 0.默认,自动判断显示机器人头像和人工头像
// 1.始终企业名称和企业logo
// 2.显示自定义标题和图片,需要设置,custom_title、custom_title_url
// 3.仅显示机器人或人工名称,不显示头像
// 4.自动判断,显示机器人、人工的头像和名称
initInfo.title_type = @"0";

// 仅当title_type=@"2"时以下配置有效
initInfo.custom_title = @"我是自定义标题,title_type=2是生效";

initInfo.custom_title_url = @"我是自定义标题,title_type=2是生效";

# 4.7 其他配置

# 4.7.1 自定义自动应答语

sdk中的自动应答语可以在pc工作台进行动态设置,

如果pc工作台的设置满足不了您的需求,那么您可以使用以下接口在代码中进行本地配置

注意:本地设置本地优先,PC端不在起效

- (void)customTipWord:(ZCLibInitInfo*)libInitInfo{
    // 用户超时下线提示语
    libInitInfo.user_out_word = @"用户超时下线提示语";
    // 用户超时提示语
    libInitInfo.user_tip_word = @"用户超时提示语";
    // 人工客服提示语
    libInitInfo.admin_tip_word = @"人工客服提示语";
    // 机器人欢迎语
    libInitInfo.robot_hello_word = @"机器人欢迎语";
    // 暂无客服在线说辞
    libInitInfo.admin_offline_title = @"暂无客服在线说辞";
    // 人工客服欢迎语
    libInitInfo.admin_hello_word  = @"人工客服欢迎语";
}

# 4.7.2 自定义聊天记录显示时间范围

如想设置用户只能看到xx天内的聊天记录,那么可以调用以下方法进行设置:

/**
 历史记录时间范围,单位分钟(例:100-表示从现在起前100分钟的会话)
 */

@property(nonatomic,assign) int scope_time;

# 4.7.3 “+”号面板菜单扩展

  1. 固定按钮配置;
	ZCKitInfo *uiInfo=[ZCKitInfo new];
    uiInfo.canSendLocation = NO;
    uiInfo.hideMenuSatisfaction = YES;
//    uiInfo.hideMenuLeave = YES;
//    uiInfo.hideMenuPicture = YES;
//    uiInfo.hideMenuCamera = YES;
//    uiInfo.hideMenuFile = YES;

  1. 添加自定义按钮

客服聊天界面中点击“+”按钮后所出现的菜单面板,可以根据需求自行添加菜单,代码如下:

    ZCKitInfo *uiInfo=[ZCKitInfo new];
    NSMutableArray *arr = [[NSMutableArray alloc] init];
    for (int i = 0; i<1; i++) {
        ZCLibCusMenu *menu1 = [[ZCLibCusMenu alloc] init];
        menu1.title = [NSString stringWithFormat:@"订单"];
        menu1.url = [NSString stringWithFormat:@"sobot://sendOrderMsg"];
        menu1.imgName = @"zcicon_sendpictures";
        [arr addObject:menu1];
        
        ZCLibCusMenu *menu2 = [[ZCLibCusMenu alloc] init];
        menu2.title = [NSString stringWithFormat:@"商品"];
        menu2.url = [NSString stringWithFormat:@"sobot://sendProductInfo"];
        menu2.imgName = @"zcicon_sendpictures";
        
        [arr addObject:menu2];
    }
    
    
    uiInfo.cusMoreArray = arr;
    
    uiInfo.cusRobotMoreArray = arr;

其中:

/**
 * 自定义输入框下方更多(+号图标)按钮下面内容(不会替换原有内容,会在原有基础上追加)
 * 修改人工模式的按钮
 * 填充内容为:ZCLibCusMenu.h
 *  title:按钮名称
 *  url:点击链接(点击后会调用初始化linkBock)
 *  imgName:本地图片名称,如xxx@2x.png,icon=xxx
 */
@property (nonatomic,strong) NSMutableArray * cusMoreArray;

/**
 * 自定义输入框下方更多(+号图标)按钮下面内容(不会替换原有内容,会在原有基础上追加)
 * 修改机器人模式的按钮
 * 填充内容为:ZCLibCusMenu.h
 *  title:按钮名称
 *  url:点击链接(点击后会调用初始化linkBock)
 *  imgName:本地图片名称,如xxx@2x.png,icon=xxx
 */
@property (nonatomic,strong) NSMutableArray * cusRobotMoreArray;

# 4.7.4 调起拨号界面接口

/**
 *  设置电话号码
 *  当导航栏右上角 显示 拨号按钮时  (和isShowTelIcon 一起设置有效)
 *
 **/
@property (nonatomic,copy) NSString * customTel;
/**
 *
 *   导航栏右上角 是否显示 拨号按钮 默认不显示    注意:和isShowEvaluation 互斥 只能设置一个有效
 *
 **/
@property (nonatomic,assign) BOOL isShowTelIcon;

# 4.7.5 智齿日志显示开关

/**
 *  显示日志信息
 *
 *  @param isShowDebug 默认不显示
 */
+(void) setShowDebug:(BOOL) isShowDebug;

# 4.7.5 iOS多语言支持

目前SDK支持英文和中文两种语言,语言会根据当前手机语言自行切换适配,如果当前手机语言不识别,默认使用中文。

语言文件的统一放在SobotKit.bundle文件中,如果需要新增语言包,把支持的语言文件放入对应的语言目录下即可,例如;英文路径:SobotKit.bundle⁩/⁨en_lproj/SobotLocalizable.strings,中文的路径⁨ ⁨SobotKit.bundle⁩/⁨zh-Hans_lproj/SobotLocalizable.strings;

[说明:语言文件夹名称为当前语言名称的后面加上_lproj,例如zh-Hans_lproj,en_lproj]

//获取语言路径方法:
NSString * languages = [[[NSUserDefaults standardUserDefaults] objectForKey:@"AppleLanguages"] objectAtIndex:0];
    languages = languages.length >3 ?  [languages substringToIndex:languages.length-3] : languages;
    NSString * bundlePath = [[NSBundle mainBundle] pathForResource:@"SobotKit" ofType:@"bundle"];
    NSString * langpath = [bundlePath stringByAppendingPathComponent:[NSString stringWithFormat:@"%@_lproj",languages]];
    NSBundle *resourceBundle = [NSBundle bundleWithPath:langpath];
    // 没有获取到默认英文
    if(!resourceBundle){
        langpath = [bundlePath stringByAppendingPathComponent:@"en_lproj"];
        resourceBundle = [NSBundle bundleWithPath:langpath];
    }
    [resourceBundle localizedStringForKey:key value:@"" table:@"SobotLocalizable"];

# 4.7.6 设置暗黑模式

从2.8.5版本开始支持暗黑模式,默认根据手机系统设置自动适配;也可强制指定使用,配置如下:

	ZCKitInfo *uiInfo=[ZCKitInfo new];
	// 默认为0,跟随系统设置, 1强制使用暗黑风格
    uiInfo.themeStyle = 1;
   
   // 默认为YES,当为暗黑模式时候自定义颜色属性将失效
   // 如果要保持暗黑模式时自定义颜色生效,设置为NO
    uiInfo.useDefaultDarkTheme = YES;

# 5 代码配置类说明

# 5.1 ZCKitInfo类说明(UI相关配置)

# UI逻辑相关:

属性名称 数据类型 说明 备注
isOpenEvaluation BOOL 点击返回时是否开启满意度评价 默认为NO 未开启
isCloseAfterEvaluation BOOL 点击返回时开启满意度评价后,评价完人工是否关闭会话 默认为NO,未开启
isShowTansfer BOOL 机器人优先模式,是否直接显示转人工按钮(值为NO时,会在人工无法回答时和unWordsCount参数配合显示转人工按钮) 默认为YES显示转人工按钮
unWordsCount NSString 机器人优先模式,通过记录机器人未知说辞的次数设置是否直接显示转人工按钮 默认不设置
isShowTelIcon BOOL 导航栏右上角 是否显示 拨号按钮 默认不显示    注意:和isShowEvaluation 互斥 只能设置一个有效
isShowEvaluation BOOL 导航栏右上角 是否显示 评价按钮 默认不显示
customTel NSString 当导航栏右上角 显示 拨号按钮时  (和isShowTelIcon 一起设置有效)
isOpenRecord BOOL 是否开启语音功能(人工接待时) 默认YES,开启
isShowNickName BOOL 留言页面是否显示昵称输入框 默认NO不显示
isAddNickName BOOL 非必须输入,留言时是否必须输入昵称 默认为NO
isSetPhotoLibraryBgImage BOOL 是否设置相册背景图片(不设置会跟着导航颜色配置)
isOpenRobotVoice BOOL 是否开启机器人语音(需要开通,未开通时机器人无法识别语音)
navcBarHidden BOOL SDK 页面中使用自定义的导航栏,不在使用系统的导航栏(隐藏)
canSendLocation BOOL 人工状态,是否可以发送位置  【 注意:  由于每个App定位插件选择不同,智齿没有实现选择位置功能,所以需要自行传递位置到SDK以及打开显示,步骤如下:  1、实现messageLinkClick事件(在ZCSobot startZCChatVC函数中)  2、当收到link = sobot://sendlocation 调用智齿接口发送位置信息  3、当收到link = sobot://openlocation?latitude=xx&longitude=xxx&address=xxx 可根据自己情况处理相关业务
isSendInfoCard BOOL 商品卡片信息是否自动发送(转人工成功时,自动发送商品卡片信息)  默认不自动发送
productInfo ZCProductInfo 产品信息 ,配合 isSendInfoCard 使用
isShowCloseSatisfaction BOOL 关闭按钮时是否显示评价界面,默认不显示
isShowReturnTips BOOL 返回时是否开启提示,提示文案默认为:是否退出?,如需修改,请修改国际化配置文件
ishidesBottomBarWhenPushed BOOL push后隐藏 BottomBar 默认是 yes
isShowPortrait BOOL 仅支持竖屏 默认为 NO
isCloseInquiryForm BOOL 是否关闭询前表单(默认为NO,使用系统默认配置)
isShowClose BOOL 导航栏左上角 是否显示 关闭按钮 默认不显示,关闭按钮,点击后无法监听后台消息
isUseImagesxcassets BOOL 是否使用 .xcassets 里的图片 默认为NO 未开启
isOpenActiveUser BOOL 是否开启智能转人工,(如输入“转人工”,直接转接人工),需要隐藏转人工按钮,请参见isShowTansfer和unWordsCount属性
activeKeywords BOOL 智能转人工关键字,关键字作为key{@"转人工",@"1",@"R"😡"1"}
autoSendOrderMessage BOOL 人工后,是否主动发送一条信息
orderGoodsInfo ZCOrderGoodsModel 需要发送的订单信息 ,配合 autoSendOrderMessage 使用
leaveCompleteCanReply BOOL 留言完成后,是否 显示 回复按钮 默认为 yes  , 可以回复
hideMenuSatisfaction BOOL 聊天页面底部加号中功能:隐藏评价 默认NO(不隐藏)
hideMenuLeave BOOL 聊天页面底部加号中功能隐藏留言 默认NO(不隐藏)
hideMenuPicture BOOL 聊天页面底部加号中功能:隐藏图片 默认NO(不隐藏)
hideMenuCamera BOOL 聊天页面底部加号中功能:隐藏拍摄 默认NO(不隐藏)
hideMenuFile BOOL 聊天页面底部加号中功能:隐藏文件 默认NO(不隐藏)
themeStyle BOOL 是否设置为暗黑模式,1暗黑,0跟随系统设置 默认为0
useDefaultDarkTheme BOOL 如果设置了自定义颜色,是否使用默认暗黑模式,如果设置为NO,当为暗黑模式时候自定义颜色属性将失效 默认为YES

# 字体相关:

属性名称 数据类型 说明 备注
titleFont UIFont 顶部标题的font
listDetailFont UIFont 各种按钮,网络提醒 font
listTimeFont UIFont 消息提醒(转人工、客服接待等) font
chatFont UIFont 聊天气泡中文字 font
voiceButtonFont UIFont 录音按钮的文字 font
goodsTitleFont UIFont 商品详情cell 中title的文字 font
goodsDetFont UIFont 商品详情cell中摘要的文字 font
notificationTopViewLabelFont UIFont 通告的文字 字号 大小

# 背景颜色相关:

属性名称 数据类型 说明 备注
goodSendBtnColor UIColor 商品详情cell中btn的背景色
backgroundColor UIColor 对话页面背景色
customBannerColor UIColor 自定义风格颜色:导航
imagePickerColor UIColor 相册导航栏的颜色
imagePickerTitleColor UIColor 相册导航栏的标题颜色
leftChatColor UIColor 左边聊天气泡的颜色
rightChatColor UIColor 右边聊天气泡的颜色
leftChatSelectedColor UIColor 左边气泡复制选中的颜色
rightChatSelectedColor UIColor 右边气泡复制选中的颜色
backgroundBottomColor UIColor 底部bottom的背景颜色
commentCommitButtonColor UIColor 评价(立即结束、取消)按钮文字颜色
BgTipAirBubblesColor UIColor 提示气泡的背景颜色
goodSendBtnColor UIColor 商品发送按钮的背景色
satisfactionSelectedBgColor UIColor 评价页“已解决”和“未解决”背景色
satisfactionTextSelectedColor UIColor 评价页“已解决”和“未解决”文字颜色
topViewBgColor UIColor 自定义导航栏背景色
trunServerBtnColor UIColor 机器人的问答中 提示转人工按钮的文字颜色
bottomLineColor UIColor 底部bottom框边框线颜色(输入框、录音按钮、分割线)
commentCommitButtonBgColor UIColor 评价提交按钮背景颜色和边框(默认跟随主题色customBannerColor)
commentCommitButtonBgHighColor UIColor 评价提交按钮点击后背景色,默认0x089899, 0.95
notificationTopViewBgColor UIColor 通告栏的背景色

# 文字颜色相关:

属性名称 数据类型 说明 备注
submitEvaluationColor UIColor 提交评价按钮的文字颜色
topViewTextColor UIColor 顶部文字颜色
leftChatTextColor UIColor 左边气泡文字颜色
rightChatTextColor UIColor 右边气泡文字颜色
timeTextColor UIColor 时间文字的颜色
tipLayerTextColor UIColor 提示文字的颜色
chatLeftLinkColor UIColor 左边气泡中链接颜色
chatRightLinkColor UIColor 右边气泡中链接颜色
goodsTitleTextColor UIColor 商品cell中title的文字颜色
goodsTipTextColor UIColor 商品cell中标签的文字颜色
goodsDetTextColor UIColor 商品cell中摘要的文字颜色
goodsSendTextColor UIColor 商品详情cell中发送的文字颜色
scoreExplainTextColor UIColor 满意度星级说明的文字颜色
chatTextViewColor UIColor 输入框文本颜色
notificationTopViewLabelColor UIColor 通告栏的文字颜色

# 图片相关:

属性名称 数据类型 说明 备注
moreBtnNolImg NSString 自定义导航栏更多按钮默认状态图片
moreBtnSelImg NSString 自定义导航栏更多按钮选中状态图片
turnBtnSelImg NSString 转人工按钮选中状态图片
turnBtnNolImg NSString 转人工按钮默认状态图片
topBackSelImg NSString 返回按钮选中状态图片
topBackNolImg NSString 返回按钮默认状态图片

# 其他:

属性名称 数据类型 说明 备注
topBackTitle NSString 聊天页面 左上角 返回按钮的文字 (默认 “返回”)
cusMoreArray NSMutableArray 自定义输入框下方更多(+号图标)按钮下面内容(不会替换原有内容,会在原有基础上追加)  填充内容为:ZCLibCusMenu.h  title:按钮名称  url:点击链接(点击后会调用初始化linkBock)  imgName:本地图片名称,如xxx@2x.png,icon=xxx
cusMenuArray NSMutableArray 自定义快捷入口  填充内容为: ZCLibCusMenu.h   url: 快捷入口链接(点击后会调用初始化linkBock)   title: 按钮标题   lableId: 自定义快捷入口的ID
cusRobotMoreArray NSMutableArray 自定义输入框下方更多(+号图标)按钮下面内容(不会替换原有内容,会在原有基础上追加) 填充内容为:ZCLibCusMenu.h

# 5.2 ZCLibInitInfo类说明

# id 相关:

属性名称 数据类型 说明 备注
api_host NSString 接口域名,默认SaaS平台域名为:https://api.sobot.com 如果您是腾讯云服务,请设置为:https://ten.sobot.com 如果您是本地化部署,请使用你们自己的部署的服务域名
app_key NSString 必须设置,不设置初始化不成功。 必填
choose_adminid NSString 指定客服ID
tran_flag int 定指客服 转接类型 0 可转入其他客服 1 必须转入指定客服
partnerid NSString 用户唯一标识 对接用户可靠身份,不能写死,不建议为null,如果为空会以设备区别
robotid NSString 对接机器人ID
platform_userid NSString 平台通道参数,初始化成功后会自动赋值
platform_key NSString 私钥

电商版:

设置电商转人工溢出策略,以下属性与transferaction冲突,如果设置transferaction,将覆盖flow_type、flow_companyid、flow_groupid的配置。

属性名称 数据类型 说明 备注
customer_code NSString 商户对接id (仅电商版适用,如果没有app_key,请提供此编码)
flow_type int 跨公司转接人工(仅电商版本可用) 默认0不开启 1-全部溢出,2-忙碌时溢出,3-不在线时溢出
flow_companyid NSString 转接到的公司ID
flow_groupid NSString 转接到的公司技能组

# 客服工作台显示:

属性名称 数据类型 说明 备注
user_nick NSString 昵称
user_name NSString 真实姓名
user_tels NSString 用户电话
user_emails NSString 用户邮箱
qq NSString qq
remark NSString 备注
face NSString 用户自定义头像
visit_title NSString 接入来源页面标题
visit_url NSString 接入的来源URL
params NSDictionary 用户资料
customer_fields NSDictionary 固定KEY的自定义字段 所有的KEY均在工作台设置后生效(设置->自定义字段->用户信息字段) eg:@{@"customField22"😡"我是自定义的分校",@"userSex"😡"保密", @"weixin"😡"微信号", @"weibo"😡"微博账号",  @"birthday"😡"2017-06-08"};
group_name NSString 技能组名称
groupid NSString 技能组编号
isVip NSString 指定客户是否为vip,0:普通 1:vip 同PC端 设置-在线客服分配-排队优先设置-VIP客户排队优先   开启传1 默认不设置  开启后 指定客户发起咨询时,如果出现排队,系统将优先接入。
vipLevel NSString 指定客户的vip等级,传入等级 同PC端 设置-自定义字段-客户字段

# 说辞相关:

属性名称 数据类型 说明 备注
admin_hello_word NSString 自定义客服欢迎语,默认为空 (如果传入,优先使用该字段)
robot_hello_word NSString 自定义机器人欢迎语,默认为空 (如果传入,优先使用该字段)
user_tip_word NSString 自定义用户超时提示语,默认为空 (如果传入,优先使用该字段)
admin_offline_title NSString 自定义客服不在线的说辞,默认为空 (如果传入,优先使用该字段)
admin_tip_word NSString 自定义客服超时提示语,默认为空 (如果传入,优先使用该字段)
user_out_word NSString 自定义用户超时下线提示语,默认为空 (如果传入,优先使用该字段)

# 会话页面相关:

属性名称 数据类型 说明 备注
service_mode int 自定义接入模式 1只有机器人,2.仅人工 3.智能客服-机器人优先 4智能客服-人工客服优先
title_type NSString 聊天页顶部标题 的自定义方式 0.默认  1.企业名称  2.自定义字段,3.仅显示文字、4显示头像和文字
custom_title NSString 聊天页顶部标题 自定义字段
custom_title_url NSString 自定义图像路径
scope_time int 历史记录时间范围,单位分钟(例:100-表示从现在起前100分钟的会话)
notifition_icon_url NSString 通告的icon 的URL

# 其他:

属性名称 数据类型 说明 备注
transferaction NSArray 转人工 指定技能组 溢出 actionType:执行动作类型:to_group:转接指定技能组  optionId:是否溢出  指定技能组时:3:溢出,4:不溢出。  deciId:指定的技能组。  spillId:溢出条件  指定客服组时:4:技能组无客服在线,5:技能组所有客服忙碌,6:技能组不上班,7:智能判断 eg:[{"actionType":"to_group","optionId":"3","deciId":"162bb6bb038d4a9ea018241a30694064","spillId":"7"}, {"actionType":"to_group","optionId":"4","deciId":"a457f4dfe92842f8a11d1616c1c58dc1"}]
summary_params NSDictionary 转人工自定义字段 key: eg:@{@"customField15619769556831"😡"显示xxyyyzzz1032"};
multi_params NSDictionary 多轮会话 自定义字段
is_enable_hot_guide BOOL 是否允许请求热点引导问题接口
margs NSDictionary 热点引导问题的扩展字段
support BOOL 机器人问答是否支持分词联想
good_msg_type int 自定发送商品订单信息类型 0 不发 1 给机器人发送 2 给人工发送  3 机器人和人工都发送
content NSString 自动发送商品订单信息内容
queue_first int 指定客户优先

# 6 常见问题

智齿 iOS_SDK UI源码 Git下载地址:

https://github.com/ZCSDK/sobotKit_UI_iOS

常见问题解答:

点击链接 进入智能机器人输入您的问题