UdeskSDK 5.2.19

UdeskSDK 5.2.19

测试已测试
Lang语言 Obj-CObjective C
许可证 MIT
发布最新发布2024年5月

xuchenxushichenbrookchenlizhangshuangyizhangshuangyi姚光辉维护。



UdeskSDK 5.2.19

  • 作者
  • zhangshuangyi

UdeskSDK-iOS

公告

接入 sdk 编译时出错请升级至最新版本的 Xcode

“master” 分支对应的 SDK 版本是 5.0+

“4.x_back” 分支对应的 SDK 版本是 4.3.4

如发现任何问题,建议先更新到最新版本的 SDK,或下载 demo 进行验证

SDK 下载地址

https://github.com/udesk/UdeskSDK-iOS

master 代码使用 Xcode13、iPhone12 iOS15 进行编译。

目录

一、集成SDK

文件介绍

Demo中的文件 说明
UdeskSDK Udesk在线咨询SDK
UdeskCall Udesk视频会话SDK(依赖在线咨询SDK)
注意:UdeskSDK并不依赖UdeskCall,如果不需要此功能则不要导入该SDK。

兼容性

类别 兼容范围
系统 支持iOS 8.0及以上系统
架构 armv7、arm64、i386、x86_64
开发环境 建议使用最新版本Xcode进行开发
Cocoapods 1.5.3版本

SDK大小说明

  1. 由于Bitcode开启会导致二进制文件体积增大,这部分会在AppStore发布时进行进一步编译优化,并不会引起最终文件的体积变化,故此处计算的是关闭Bitcode下的二进制增量。
  2. .a中是多个架构做了合并,使用lipo可以看到细节。所以.a库文件本身很大,且打包出来的ipa也相对较大。但用户实际下载到手机中会被AppStore优化,只下载用户设备需要的架构,所以实际在手机上占用的空间很小。Architectures in the fat file: libUdesk.a are: armv7 i386 x86_64 arm64
  3. DemoApp在iPhoneX 12.1中实际占用大小小于10M

导入UdeskSDK到工程

1.1 手动导入

Udesk SDK的实现,依赖了一些系统框架,在开发应用时,需要在工程里加入这些框架。开发者首先点击工程右边的工程名,然后在工程名右边依次选择TARGETS -> BuiLd Phases -> Link Binary With Libraries,展开LinkBinary With Libraries后点击展开后下面的+来添加下面的依赖项

libz.tbd
libxml2.tbd
libresolv.tbd
libsqlite3.tbd
WebKit.framework
MapKit.framework
AssetsLibrary.framework
ImageIO.framework
Accelerate.framework
MediaPlayer.framework
Photos.framework
CoreText.framework

把下载的文件夹中的UdeskSDK文件夹拖到你的工程里,并进行以下配置

  • 点击你的工程targets -> Build Settings
  • 搜索Other Linker Flags加入-lxml2 -ObjC
  • 搜索header search paths加入/usr/include/libxml2

1.2 CocoaPods导入

在Podfile中加入:

pod 'UdeskSDK'

执行命令:

#更新本地Cocoapods仓库
$ pod repo update
#更新Podfile里的第三方库
$ pod update

在控制器中引入:

//Objective-C
#import "Udesk.h"
//swift
import UdeskSDK

权限问题

SDK使用了iOS的相册、相机、麦克风、地理位置、保存图片功能,请在info.plist里加入相对应的权限。

如果不加,会crash!!!

其他问题

SDK不适用于大多数游戏项目(编译时直接显示错误),建议游戏项目使用我们的网页插件,文档链接在这里

将UdeskCall导入到工程中

将下载的文件夹中的UdeskCall文件夹拖拽到您的工程文件中,并遵循以下配置操作

  • pod 'AgoraRtcEngine_iOS', '~> 2.0.2'

  • 导入系统框架

libicucore.tbd
CFNetwork.framework
Security.framework

注意:UdeskCall最低支持iOS 8.0,不支持bitcode,请在info.plist文件中配置后台运行模式

二、快速使用

Udesk提供了一套开源的聊天界面,帮助开发者快速创建对话窗口和帮助中心,并提供自定义接口,以满足定制化需求。

2.1 初始化公司和客户信息

//初始化公司(appKey、appID、domain都是必传字段)
UdeskOrganization *organization = [[UdeskOrganization alloc] initWithDomain:"domain" appKey:"appKey" appId:"appId"];

UdeskCustomer *customer = [UdeskCustomer new];
customer.sdkToken = @"sdkToken";
customer.nickName = @"测试名字";
customer.email = @"[email protected]";
customer.cellphone = @"18888888888";
customer.customerDescription = @"我是测试";
customer.robotModelKey = @"TestKey";
customer.qq = @"573979861";
customer.channel = @"Test";

//客户自定义字段示例(非必填)
UdeskCustomerCustomField *textField = [UdeskCustomerCustomField new];
textField.fieldKey = @"TextField_390";
textField.fieldValue = @"测试";
        
UdeskCustomerCustomField *selectField = [UdeskCustomerCustomField new];
selectField.fieldKey = @"SelectField_455";
selectField.fieldValue = @[@0];
        
customer.customField = @[textField,selectField];

//初始化sdk
[UdeskManager initWithOrganization:organization customer:customer];
参数名称 说明
domain 您的公司注册Udesk,Udesk分配的域名
appKey、appId Udesk分配的APP key和ID
sdkToken 用户唯一标识,用于识别身份,由您生成并传入给我们。请使用字母 / 数字等常见字符集。就如同身份证一样,一个身份证号对应一个人,不允许多人共享一个身份证号,或者一个人拥有多个身份证号;此外,如果设置了客户的邮箱和手机号码,也要确保不同客户的手机号和邮箱不同,如果出现相同的,则不会创建新的客户
customerToken 可选主键:唯一客户外部标识,用于处理唯一标识冲突(请不要随意传入值)
nickName 用户昵称
email 用户邮箱,必须严格按照邮箱规则填写。如果不填写,则不输入!不可以使用固定值!不可以随意填写!
cellphone 用户手机号,必须严格按照手机号码规则填写。如果不填写,则不输入!不可以使用固定值!不可以随意填写!
customerDescription 用户描述
robotModelKey 机器人常见问题模板ID
qq 用户QQ号
channel 自定义渠道
customField 用户自定义字段
  • 以上字段domain、appkey、appId、sdkToken是必填参数,其他参数根据实际需求选择
  • domain格式为 xxx.udesk.cn,无需添加https://
  • appKey和appId可以在管理后台 -> 管理中心 -> 渠道管理 -> 移动 SDK中创建新App来获取
  • robotModelKey可以在管理后台 -> 知识库 -> Udesk KM -> 常见问题中获取模板ID。
  • fieldKey 由Udesk生成,可以在 “管理后台” -> “管理中心” -> “管理” -> “客户字段” 中获得
  • fieldValue有两种类型,1.文字字段:字符串类型;2.选择字段:数组类型(数组元素为选项的下标)

2.2 进入聊天页面

//使用push
UdeskSDKManager *sdkManager = [[UdeskSDKManager alloc] initWithSDKStyle:[UdeskSDKStyle customStyle] sdkConfig:[UdeskSDKConfig customConfig]];
[sdkManager pushUdeskInViewController:self completion:nil];

//使用present
[sdkManager presentUdeskInViewController:self completion:nil];

2.3 进入帮助中心

//使用push
UdeskSDKManager *sdkManager = [[UdeskSDKManager alloc] initWithSDKStyle:[UdeskSDKStyle customStyle] sdkConfig:[UdeskSDKConfig customConfig]];
[sdkManager showFAQInViewController:self transiteAnimation:UDTransiteAnimationTypePush completion:nil];

//使用present
[sdkManager showFAQInViewController:self transiteAnimation:UDTransiteAnimationTypePresent completion:nil];
  • [UdeskSDKStyle customStyle] 是 SDK默认的UI风格,用户可自定义风格,具体可点击查看
  • [UdeskSDKConfig customConfig] 是 SDK的配置选项,具体可点击查看

三、自定义配置

3.1 自定义UI

//此处只是示例,更多UI参数请参看 UdeskSDKStyle.h
UdeskSDKStyle *sdkStyle = [UdeskSDKStyle customStyle];
sdkStyle.navigationColor = [UIColor yellowColor];
sdkStyle.titleColor = [UIColor orangeColor];

UdeskSDKManager *sdkManager = [[UdeskSDKManager alloc] initWithSDKStyle:sdkStyle];
[sdkManager pushUdeskInViewController:self completion:nil];

3.2 指定客服ID

注意:如果在代码中指定了客服或者客服组,需要在后台SDK配置中关闭导航菜单以防止两者冲突。
UdeskSDKConfig *sdkConfig = [UdeskSDKConfig customConfig];
sdkConfig.agentId = @"agentId";

UdeskSDKManager *sdkManager = [[UdeskSDKManager alloc] initWithSDKStyle:[UdeskSDKStyle customStyle] sdkConfig:sdkConfig];
[sdkManager pushUdeskInViewController:self completion:nil];

3.3 指定客服组ID

UdeskSDKConfig *sdkConfig = [UdeskSDKConfig customConfig];
sdkConfig.groupId = @"groupId";

UdeskSDKManager *sdkManager = [[UdeskSDKManager alloc] initWithSDKStyle:[UdeskSDKStyle customStyle] sdkConfig:sdkConfig];
[sdkManager pushUdeskInViewController:self completion:nil];

3.4 设置SDK语言

UdeskSDKConfig *sdkConfig = [UdeskSDKConfig customConfig];
/*

 注意:
 1. 使用时请提前创建对应语言的语言包, 分为App端和和服务端.
 2. App端创建对应名称的lproj包, 用于一些本地语言的切换, 当前已经包含中文(zh-Hans.proj)和英文(en.lproj). 默认使用简体中文. 如果未创建, 则使用对应的key值
 3. 服务端创建对应的语言包, Api返回数据时根据配置来选择对应语言. 帮助文档:http://udesk.udesk.cn/hc/articles/46387. 如果未创建, 默认使用中文.
 4. 可配置服务端默认语言包, 如果未设置, 则使用此默认

 ar:阿拉伯语;
 en-us:英语; // 注意:App端对应en.lproj !!!!!!!!!
 es:西班牙语;
 fr:法语;
 ja:日语;
 ko:朝鲜语/韩语;
 th:泰语;
 id:印度尼西亚语;
 zh-TW:繁体中文;
 pt:葡萄牙语;
 ru:俄语;
 zh-cn:中文简体; // 注意:App端对应zh-Hans.proj !!!!!!!!!
 */
sdkConfig.language = @"en-us";

UdeskSDKManager *sdkManager = [[UdeskSDKManager alloc] initWithSDKStyle:[UdeskSDKStyle customStyle] sdkConfig:sdkConfig];
[sdkManager pushUdeskInViewController:self completion:nil];

3.5 设置放弃排队类型

注意:放弃排队类型默认值是“mark”,标记放弃

UdeskSDKConfig *sdkConfig = [UdeskSDKConfig customConfig];
  
//立即放弃: 请求后直接从排列中清除,记为排队放弃
sdkConfig.quitQueueMode = @"force_quit";
//标记放弃: 标记后,等到客服拉取时,如果客户不在线,从排列中清除,记为排队放弃
//sdkConfig.quitQueueMode = @"mark";
//取消标记: 在标记后,用户再回来可以取消标记,请求 agent 接口会做一次取消操作
//sdkConfig.quitQueueMode = @"cannel_mark";

UdeskSDKManager *sdkManager = [[UdeskSDKManager alloc] initWithSDKStyle:[UdeskSDKStyle customStyle] sdkConfig:sdkConfig];
[sdkManager pushUdeskInViewController:self completion:nil];

3.6 强制横/竖屏

注意:iPad需要把“Requires full screen”选项勾选上

UdeskSDKConfig *sdkConfig = [UdeskSDKConfig customConfig];
//强制竖屏
sdkConfig.orientationMask = UIInterfaceOrientationMaskPortrait;
//强制横屏
//sdkConfig.orientationMask = UIInterfaceOrientationMaskLandscape;

UdeskSDKManager *sdkManager = [[UdeskSDKManager alloc] initWithSDKStyle:[UdeskSDKStyle customStyle] sdkConfig:sdkConfig];
//强制横/竖屏,只能使用presentUdeskInViewController方法
[sdkManager presentUdeskInViewController:self completion:nil];

3.7 设置自定义按钮

如果设置了自定义按钮在界面上未显示,请检查:

  1. 是否只设置了机器人按钮而没有设置人工客服按钮
  2. 是否只设置了“InMoreView”而没有设置“InInputTop”
  3. 是否是留言状态,留言状态中不会显示自定义按钮
//按钮位于输入框上方
UdeskCustomButtonConfig *customButton1 = [[UdeskCustomButtonConfig alloc] initWithTitle:@"自定义按钮" image:nil type:UdeskCustomButtonConfigTypeInInputTop clickBlock:^(UdeskCustomButtonConfig *customButton, UdeskChatViewController *viewController) {
	//do something
    //UdeskChatViewController 有可以发送消息的方法。
}];
//设置为机器人自定义按钮(机器人页面的自定义按钮和人工的是分开的,并且机器人自定义按钮只允许发送文字)
customButton1.scenesType = UdeskCustomButtonConfigScenesRobot;

//按钮位于更多
UdeskCustomButtonConfig *customButton2 = [[UdeskCustomButtonConfig alloc] initWithTitle:@"自定义按钮" image:[UIImage imageNamed:@"image.png"] type:UdeskCustomButtonConfigTypeInMoreView clickBlock:^(UdeskCustomButtonConfig *customButton, UdeskChatViewController *viewController) {
	//do something
}];

UdeskSDKConfig *sdkConfig = [UdeskSDKConfig customConfig];
//显示自定义按钮(默认隐藏,此参数只控制输入框上方的自定义按钮,不控制更多里的自定义按钮)
sdkConfig.showCustomButtons = YES;
//是否在输入框上方的工具栏显示满意度评价(这个参数会和后台管理员配置是否开启满意度调查结合判断,同为true才显示。该参数默认为false)
sdkConfig.showTopCustomButtonSurvey = YES;
sdkConfig.customButtons = @[customButton1,customButton2];

UdeskSDKManager *sdkManager = [[UdeskSDKManager alloc] initWithSDKStyle:[UdeskSDKStyle customStyle] sdkConfig:sdkConfig];
[sdkManager pushUdeskInViewController:self completion:nil];

3.8 自动发送消息

UdeskSDKConfig *sdkConfig = [UdeskSDKConfig customConfig];
//UdeskGoodsModel具体参数请查看该文件
UdeskGoodsModel *goodsModel = [[UdeskGoodsModel alloc] init];
goodsModel.name = @"name";
//只支持文本、图片、商品消息
sdkConfig.preSendMessages = @[@"testPreMessage",[UIImage imageNamed:@"image"],goodsModel];

UdeskSDKManager *sdkManager = [[UdeskSDKManager alloc] initWithSDKStyle:[UdeskSDKStyle customStyle] sdkConfig:sdkConfig];
[sdkManager pushUdeskInViewController:self completion:nil];

3.9 自定义表情

UdeskEmojiPanelModel *model = [UdeskEmojiPanelModel new];
//必填
model.emojiIcon = [UIImage imageNamed:@"likeSticker"];
model.stickerPaths = @[
                       [[NSBundle mainBundle] pathForResource:@"angry"ofType:@"png"],
                       [[NSBundle mainBundle] pathForResource:@"cry"ofType:@"png"],
                       [[NSBundle mainBundle] pathForResource:@"dead"ofType:@"png"],
                       [[NSBundle mainBundle] pathForResource:@"embarrass"ofType:@"png"],
                       [[NSBundle mainBundle] pathForResource:@"happy"ofType:@"png"],
                       [[NSBundle mainBundle] pathForResource:@"joy"ofType:@"png"],
                       [[NSBundle mainBundle] pathForResource:@"love"ofType:@"png"],
                       [[NSBundle mainBundle] pathForResource:@"sad"ofType:@"png"],
                       [[NSBundle mainBundle] pathForResource:@"shy"ofType:@"png"],
                       [[NSBundle mainBundle] pathForResource:@"sleepy"ofType:@"png"],
                       [[NSBundle mainBundle] pathForResource:@"surprise"ofType:@"png"],
                       [[NSBundle mainBundle] pathForResource:@"wink"ofType:@"png"],
                       ];
//非必填
model.stickerTitles = @[@"愤怒",@"哭泣",@"糟糕",@"冷汗",@"大笑",@"可爱",@"",@"流汗",@"害羞",@"睡觉",@"惊讶",@"调皮"];

UdeskSDKConfig *sdkConfig = [UdeskSDKConfig customConfig];
sdkConfig.customEmojis = @[model];

UdeskSDKManager *sdkManager = [[UdeskSDKManager alloc] initWithSDKStyle:[UdeskSDKStyle customStyle] sdkConfig:sdkConfig];
[sdkManager pushUdeskInViewController:self completion:nil];

3.10 小视频功能

UdeskSDKConfig *sdkConfig = [UdeskSDKConfig customConfig];
//小视频功能默认开启
sdkConfig.smartVideoEnabled = YES;
//小视频分辨率
sdkConfig.videoResolution = UDSmatrVideoResolution1280x720;
//小视频录制时长
sdkConfig.smartVideoDuration = 30;

UdeskSDKManager *sdkManager = [[UdeskSDKManager alloc] initWithSDKStyle:[UdeskSDKStyle customStyle] sdkConfig:sdkConfig];
[sdkManager pushUdeskInViewController:self completion:nil];

3.11 添加咨询对象

NSDictionary *dict = @{
                        @"productImageUrl":@"http://test.url.com/image.jpg",
                        @"productTitle":@"测试测试测试测你测试试测你!",
                        @"productDetail":@"¥88888.0",
                        @"productURL":@"http://www.baidu.com"
                       };
UdeskSDKConfig *sdkConfig = [UdeskSDKConfig customConfig];
sdkConfig.productDictionary = dict;

UdeskSDKManager *sdkManager = [[UdeskSDKManager alloc] initWithSDKStyle:[UdeskSDKStyle customStyle] sdkConfig:sdkConfig];
[sdkManager pushUdeskInViewController:self completion:nil];

3.12 商品消息

UdeskSDKConfig *config = [UdeskSDKConfig customConfig];
config.showCustomButtons = YES;

UdeskCustomButtonConfig *customButton = [[UdeskCustomButtonConfig alloc] initWithTitle:@"自定义按钮" image:nil type:UdeskCustomButtonConfigTypeInInputTop clickBlock:^(UdeskCustomButtonConfig *customButton, UdeskChatViewController *viewController) {
	//发送商品消息(示例点击按钮直接发送商品消息,用户可根据自身需求进行修改)
    [viewController sendGoodsMessageWithModel:[self getGoodsModel] completion:nil];
}];

config.customButtons = @[customButton];
    
UdeskSDKActionConfig *action = [UdeskSDKActionConfig new];
action.goodsMessageClickBlock = ^(UdeskChatViewController *viewController, NSString *goodsURL, NSString *goodsId) {
    //示例直接跳转浏览器,用户可根据自身需求进行修改
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:goodsURL]];
};
    
UdeskSDKStyle *style = [UdeskSDKStyle customStyle];
style.customerGoodsNameTextColor = [UIColor orangeColor];
//标题最大显示行,默认全部显示
style.goodsNameNumberOfLines = 2;

//初始化sdk
UdeskSDKManager *chatViewManager = [[UdeskSDKManager alloc] initWithSDKStyle:style sdkConfig:config sdkActionConfig:action];
[chatViewManager pushUdeskInViewController:self completion:nil];

- (UdeskGoodsModel *)getGoodsModel {
    
    UdeskGoodsModel *goodsModel = [[UdeskGoodsModel alloc] init];
    goodsModel.name = @"Apple iPhone X (A1903) 64GB 深空灰色 移动联通4G手机";
    goodsModel.url = @"https://item.jd.com/6748052.html";
    goodsModel.imgUrl = @"http://img12.360buyimg.com/n1/s450x450_jfs/t10675/253/1344769770/66891/92d54ca4/59df2e7fN86c99a27.jpg";
    goodsModel.customParameters = @{
      													    @"type":@"测试啦",
                                    @"order":@"123"
                                    };
    
    UdeskGoodsParamModel *paramModel1 = [UdeskGoodsParamModel new];
    paramModel1.text = @"¥6999.00";
    paramModel1.color = @"#FF0000";
    paramModel1.fold = @(1);
    paramModel1.udBreak = @(1);
    paramModel1.size = @(14);
    
    UdeskGoodsParamModel *paramModel2 = [UdeskGoodsParamModel new];
    paramModel2.text = @"满1999元立减30元";
    paramModel2.color = @"#c2fcc3";
    paramModel2.fold = @(1);
    paramModel2.size = @(12);
    
    UdeskGoodsParamModel *paramModel3 = [UdeskGoodsParamModel new];
    paramModel3.text = @"还有优惠券";
    paramModel3.color = @"#ffffff";
    paramModel3.fold = @(1);
    paramModel3.size = @(20);
    
    goodsModel.params = @[paramModel1,paramModel2,paramModel3];

    return goodsModel;
}

UdeskGoodsModel 字段说明:

参数名称 是否必选 说明
goodsId 可选 商品消息ID(可传可不传,主要用于在点击商品消息时回调配给开发者)
name 必选 商品名称标题
imgUrl 必选 商品图片不传会造成UI错乱
url 可选 订单跳转链接
customParameters 可选 自定义参数,会在点击商品消息时返回

UdeskGoodsParamModel 字段说明:

参数名称 是否必选 说明
text 可选 文本
color 可选 颜色
fold 可选 加粗 (1加粗-0不加粗) 默认不加粗
udBreak 可选 换行(该段文本结束后换行,1换行-0不换行),最后一条商品描述尽量不要换行
size 可选 字体大小(单位px)

3.13 图片选择器

UdeskSDKConfig *sdkConfig = [UdeskSDKConfig customConfig];
//是否开启图片选择器(默认开启),关闭则使用系统相册
sdkConfig.imagePickerEnabled = YES;
//最大选择图片数量(开启状态)
sdkConfig.maxImagesCount = 1;
//是否支持选择视频(开启状态)
sdkConfig.allowPickingVideo = NO;
//压缩质量 0.1-1(开启状态)
sdkConfig.quality = 0.5f;
    
//初始化sdk
UdeskSDKManager *sdkManager = [[UdeskSDKManager alloc] initWithSDKStyle:[UdeskSDKStyle customStyle] sdkConfig:sdkConfig];
[sdkManager pushUdeskInViewController:self completion:nil];

3.14 打开发送定位功能

UdeskSDKConfig *sdkConfig = [UdeskSDKConfig customConfig];
sdkConfig.showLocationEntry = YES;
    
//初始化sdk
UdeskSDKManager *sdkManager = [[UdeskSDKManager alloc] initWithSDKStyle:[UdeskSDKStyle customStyle] sdkConfig:sdkConfig];
[sdkManager pushUdeskInViewController:self completion:nil];
自iOS8开始,开发者在使用定位功能之前,需要在info.plist中添加以下两种可选之一(两者都添加时默认使用NSLocationWhenInUseUsageDescription):
NSLocationWhenInUseUsageDescription,允许在前台使用时获取GPS的说明
NSLocationAlwaysUsageDescription,允许永久使用GPS的说明

3.15 未读消息

SDK提供了未读消息监听的宏UD_RECEIVED_NEW_MESSAGES_NOTIFICATION

当用户在线且不在SDK页面时客服发送消息,SDK会发送通知。

注意:此方法仅处理用户在线情况,用户不在线情况需要连接离线推送功能。

[[NSNotificationCenter defaultCenter] addObserverForName:UD_RECEIVED_NEW_MESSAGES_NOTIFICATION object:nil queue:[NSOperationQueue mainQueue] usingBlock:^(NSNotification * _Nonnull note) {
        
  //获取sdk发送的未读消息通知内容
   if ([note.object isKindOfClass:[UdeskMessage class]]) {
       UdeskMessage *message = (UdeskMessage *)note.object;
       NSLog(@"未读消息内容:%@",message.content);
   }
        
  //延迟获取sdk存在db的未读消息
   dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5f * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
      NSLog(@"未读消息数:%ld",[UdeskManager getLocalUnreadeMessagesCount]);
      NSLog(@"未读消息:%@",[UdeskManager getLocalUnreadeMessages]);
   });
}];

3.16 SDK事件回调

UdeskSDKActionConfig *actionConfig = [UdeskSDKActionConfig new];

//完全离开sdk页面回调
actionConfig.leaveUdeskSDKBlock = ^{
    //do something
};
//离开人工IM页面回调
actionConfig.leaveChatViewControllerBlock = ^{
    //do something
};
//登录成功回调
actionConfig.loginSuccessBlock = ^{
    //do something
};
//点击超链接回调
actionConfig.linkClickBlock = ^(UIViewController *viewController, NSURL *URL) {
    //do something
};
//点击结构化消息回调
actionConfig.structMessageClickBlock = ^{
    //do something
};
//点击离线留言按钮回调(实现该回调则放弃sdk原生离线留言功能)
actionConfig.leaveMessageClickBlock = ^(UIViewController *viewController) {
    //do something
};
//点击地理位置按钮回调(实现该回调则放弃sdk原生地理位置功能)
actionConfig.locationButtonClickBlock = ^(UdeskChatViewController *viewController) {
    //do something
};
//点击地理位置消息回调(实现该回调则放弃sdk原生地理位置功能)
actionConfig.locationMessageClickBlock = ^(UdeskChatViewController *viewController, UdeskLocationModel *locationModel) {
    //do something
};
//登陆成功回调
actionConfig.loginSuccessBlock = ^{
    //do something
};
//点击文本链接回调(实现该回调则放弃sdk原生功能)
actionConfig.linkClickBlock = ^(UIViewController *viewController, NSURL *URL) {
    //do something
};
//商品消息回调
actionConfig.goodsMessageClickBlock = ^(UdeskChatViewController *viewController, UdeskGoodsModel *goodsModel) {
    //do something
};
//咨询对象发送按钮回调(实现该回调则放弃sdk原生功能)
actionConfig.productMessageSendLinkClickBlock = ^(UdeskChatViewController *viewController, NSDictionary *productMessage) {
    //do something
};

UdeskSDKManager *sdkManager = [[UdeskSDKManager alloc] initWithSDKStyle:[UdeskSDKStyle customStyle] sdkConfig:[UdeskSDKConfig customConfig] sdkActionConfig:actionConfig];
[sdkManager pushUdeskInViewController:self completion:nil];

3.17 机器人语音

SDK已支持百度语音识别,由于百度语音SDK文件体积太大,所以只能由客户自行导入工程中。UdeskSDK会根据是否已导入百度语音识别SDK来自动显示机器人语音识别按钮。

其他自定义配置请查看代码文件 “UdeskSDKConfig”

其他UI配置请查看代码文件 “UdeskSDKStyle”

四、消息推送

目前仅支持一种推送方案,即Udesk服务端将消息发送至开发者的服务端,开发者再将消息推送到 App。

未来Udesk iOS SDK 将会支持直接将消息推送至 App,即开发者可将 App 的推送证书上传至 Udesk,Udesk 将消息推送至苹果 APNS 服务器。

设置接收推送的服务器地址

推送消息将被发送到开发者的服务器。

设置推送服务器地址,请使用Udesk管理员账号登录 Udesk,在「设置」-> 「移动SDK」中设置。

udesk

上传设备的 deviceToken

当App进入后台后,Udesk推送给开发者服务端的消息数据中,将包含 deviceToken 字段。

请将以下代码添加到 AppDelegate.m 中系统回调 didRegisterForRemoteNotificationsWithDeviceToken 中:

注意:如果您使用的是第三方推送服务,则需传入第三方推送服务生成的 token。例如:极光推送生成的 registrationID。

[UdeskManager registerDeviceToken:deviceToken];

通知Udesk服务端向开发者的服务端发送消息

目前,Udesk的推送是通过给开发者提供的 URL 发送推送消息来实现的。

当 App 进入后台时,应通知 Udesk 服务端,让其将后续的消息推送到开发者提供的服务器地址。

开发者需要在 AppDelegate.m 的系统回调 applicationDidEnterBackground 中调用开启推送服务接口,如下代码:

- (void)applicationDidEnterBackground:(UIApplication *)application {

  __block UIBackgroundTaskIdentifier background_task;
  //注册一个后台任务,告诉系统我们需要向系统借一些事件
  background_task = [application beginBackgroundTaskWithExpirationHandler:^ {
  
  //不管有没有完成,结束background_task任务
  [application endBackgroundTask: background_task];
  background_task = UIBackgroundTaskInvalid;
  }];

  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
      //根据需求 开启/关闭 通知
      [UdeskManager startUdeskPush];
  });
}

关闭Udesk推送

当 App 进入前台时,应通知 Udesk 服务端,让其将后续的消息发送给 SDK,而不再推送到开发者提供的服务端。

开发者需要在 AppDelegate.m 的系统回调 applicationWillEnterForeground 中调用关闭推送并拉取消息接口,如下代码:

- (void)applicationWillEnterForeground:(UIApplication *)application {

    //上线操作,拉取离线消息
    [UdeskManager endUdeskPush];
}

离线推送接口要求

基本要求

  • 请求时使用的 content-type 为 application/x-www-form-urlencoded

参数

当有消息或事件发生时,将会向推送接口传送以下数据

参数名 类型 说明
message_id string 消息id
platform string 平台,'ios' 或 'android'
device_token string 设备标识
app_id string SDK app id
content string 消息内容,仅 type 为 'message' 时有效
sent_at datetime 消息推送时间,格式 iso8601
from_id integer 发送者id(客服)
from_name string 发送者名称
to_id integer 接收者id(客户)
to_token string 接收者 sdk_token(唯一标识)
type string 消息类型,'event' 为事件,'message'为消息
event string 事件类型,'redirect' 客服转接,'close'对话关闭,'survey'发送满意度调查

参数示例

{
    "message_id": "di121jdlasf82jfdasfklj39dfda",
    "platform": "ios",
    "device_token": "4312kjklfds2",
    "app_id": "dafjidalledaf",
    "content": "Hello world!",
    "sent_at": "2016-11-21T10:40:38+08:00",
    "from_id": 231,
    "from_name": "Tom",
    "to_id": 12,
    "to_token": "dae121dccepm1",
    "type": "message",
  	"event": "close"
}

注意:如果你不使用推送

请在app切换到后台调用以下接口
- (void)applicationDidEnterBackground:(UIApplication *)application {
  
  	//设置离线,客服发送离线消息
	[UdeskManager setupCustomerOffline]
}
请在在切换到前台调用以下接口
- (void)applicationWillEnterForeground:(UIApplication *)application {

    //上线操作,拉取离线消息
    [UdeskManager setupCustomerOnline];
}

五、API说明

5.1 断开与Udesk服务器连接

切换用户时,调用该接口以断开先前的客户连接。

[UdeskManager logoutUdesk];

5.2 设置客户上线

连接Udesk服务器后客户默认在线。在将客户设置为离线时,通过调用此接口可以使客户重新上线。

[UdeskManager setupCustomerOnline];

5.3 设置客户离线

设置客户为离线状态。

[UdeskManager setupCustomerOffline];

5.4 删除客户本地聊天数据

[UdeskManager removeAllMessagesFromDatabase];

5.5 获取未读消息数量

开发人员可以在需要显示未读消息数时调用此接口。当用户进入聊天界面后,未读消息计数将重置。

[UdeskManager getLocalUnreadeMessagesCount];

5.6 获取未读消息

开发人员可以在需要显示未读消息时调用此接口,当用户进入聊天界面后,未读消息将被清除。

[UdeskManager getLocalUnreadeMessages];

5.7 将所有未读消息设置为已读

可以将客户的未读消息重置。

[UdeskManager markAllMessagesAsRead];

5.8 监听收到未读消息的广播

开发人员可以在合适的位置监听接收到消息的广播,用于提醒用户有新消息。广播名为 UD_RECEIVED_NEW_MESSAGES_NOTIFICATION,定义在 中。

5.9 SDK支持发送位置信息

注意:从iOS8开始,在使用定位功能之前,开发人员需要在前台的info.plist文件中添加(以下二选一,两个都添加时默认使用NSLocationWhenInUseUsageDescription):

NSLocationWhenInUseUsageDescription,允许在前台使用时获取GPS的描述

NSLocationAlwaysUsageDescription,允许永久使用GPS的描述

SDK默认不支持发送位置信息,如果需要SDK发送位置信息

原生(SDK内部自行实现定位、发送、搜索、查看,使用的是苹果自带的原生地图控件)

参考3.15

API(通过API回调的方式接入地理位置,需要开发者自行实现相应功能,SDKDemo中提供了一个百度地图的示例,仅供参考。 )

UdeskSDKActionConfig *actionConfig = [UdeskSDKActionConfig new];

//点击地理位置按钮回调(实现该回调则放弃sdk原生地理位置功能)
actionConfig.locationButtonClickBlock = ^(UdeskChatViewController *viewController) {
    //打开地理位置VC
   UdeskCustomLocationViewController *custom = [[UdeskCustomLocationViewController alloc] initWithHasSend:NO];
   UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:custom];
   [viewController presentViewController:nav animated:YES completion:nil];
   //地理位置VC 发送回调
   custom.sendLocationBlock = ^(UdeskLocationModel *model) {
       [viewController sendLoactionMessageWithModel:model completion:nil];
   };
};
//点击地理位置消息回调(实现该回调则放弃sdk原生地理位置功能)
actionConfig.locationMessageClickBlock = ^(UdeskChatViewController *viewController, UdeskLocationModel *locationModel) {
    //打开地理位置VC
    UdeskCustomLocationViewController *custom = [[UdeskCustomLocationViewController alloc] initWithHasSend:YES];
  	//把需要查看的model传入
    custom.locationModel = locationModel;
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:custom];
    [viewController presentViewController:nav animated:YES completion:nil];
};

UdeskSDKConfig *sdkConfig = [UdeskSDKConfig customConfig];
sdkConfig.showLocationEntry = YES;
    
UdeskSDKManager *sdkManager = [[UdeskSDKManager alloc] initWithSDKStyle:[UdeskSDKStyle customStyle] sdkConfig:sdkConfig sdkActionConfig:actionConfig];
[sdkManager pushUdeskInViewController:self completion:nil];

5.10 发送订单消息

你可以在需要的地方进行调用,前提是已创建SDK用户,发送后可在后台查看订单。

UdeskOrder *order = [[UdeskOrder alloc] init];
order.number = @"1111";
order.name = @"商品订单";
order.url = @"http://www.qq.com";
order.price = 166.66;
order.orderAt = [dateFormatter stringFromDate:[NSDate date]];
order.payAt = [dateFormatter stringFromDate:[NSDate date]];
order.status = @"wait_pay";
order.remark = @"测试订单";
    
[UdeskManager sendOrder:order];

5.11 发送轨迹消息

你可以在需要的地方进行调用,前提是已创建SDK用户,发送后可在IM客服工作台、对话记录中查看。

UdeskTrack *track = [[UdeskTrack alloc] init];
track.type = @"product";
track.name = @"商品名称";
track.url = @"http://www.baidu.com";
track.imageUrl = @"https://qn-im.udesk.cn/image_1559120464_721.png";

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
track.date = [dateFormatter stringFromDate:[NSDate date]];

UdeskTrackParams *params1 = [[UdeskTrackParams alloc] init];
params1.text = @"商品参数1";
params1.color = @"#FF0000";
params1.udBreak = @(1);
params1.size = @"20";
params1.fold = @(1);

UdeskTrackParams *params2 = [[UdeskTrackParams alloc] init];
params2.text = @"商品参数2";
params2.color = @"#FF0111";
params2.udBreak = @(0);
params2.size = @"10";
params2.fold = @(0);

track.params = @[params1,params2];

[UdeskManager sendTrack:track];

六、常见问题

键盘弹起后输入框和键盘之间有偏移

请检查是否使用了第三方开源库IQKeyboardManager,此开源库会与输入框的判断逻辑冲突。

  • 在UdeskChatViewController的viewWillAppear方法中加入[[IQKeyboardManager sharedManager] setEnable:NO];,作用是在当前页面禁用IQKeyboardManager。
  • 在UdeskChatViewController的viewWillDisappear方法中加入[[IQKeyboardManager sharedManager] setEnable:YES];,作用是在离开当前页面之前重新启用IQKeyboardManager。

指定客服组或客服分配出现与指定客服组客服不一致的情况

首先要确认客服没有关闭会话。

我们产品的逻辑:假设客户A选择了客服组B下的客服B1进行会话。之后客户A退出会话界面,进入另外界面,然后通过客服组C下的客服C1分配会话:这时后台会判断,如果和B1的会话还存在,则会直接分配给B1,而不会分配给客服C1。只有当B1的会话关闭了,才会分配给客服C1。

出现在不同客户分配的会话在一个会话中

出现这种情况,是因为客服传递的sdkToken值相同。sdkToken就像身份证一样,是用户的唯一标识。建议客户检查接入时传入的sdktoken值。

如果设置了email或cellphone,出现相同也会在一个客服的会话中。

出现类似异常+[UDXMLElement elementWithName:xmlns:]: unrecognized selector sent to class 0x10112abb8

出现这种情况,请先检查手动导入时Xcode工程里的配置是否完善(参考2.2和2.3)。

如果确认配置没有问题,请查看Other Linker Flags里是否写了-force_load,如果有写这个配置,请在这个配置下面加入我们sdk .a文件的地址。

进入SDK页面直接崩溃,堆栈信息显示UD的网络请求

出现这种情况请检查是否使用了顶象SDK,升级到他们最新版本即可。

APP使用百度地图,进入SDK会话页面直接崩溃,崩溃信息显示 "xmlFreeDoc"

出现这种情况,请检查使用的百度地图SDK版本是否为3.4.2或6.0.0。请升级百度地图SDK到最新版本。

APP使用友盟分享无法正常跳转

请升级友盟SDK到最新版本。

客服消息发送一直在旋转

SDK在退到后台后不会立即离线,这会导致客服发送的消息无法发送,只有在SDK离线后才会发送离线消息。

可以在APP退到后台时主动调用我们的离线方法

[UdeskManager setupCustomerOffline];

当APP返回前台时主动调用我们的上线方法

[UdeskManager setupCustomerOnline];

APP旋转屏幕 SDK UI没有适配问题

SDK目前尚不支持旋转的UI适配,以下是解决方法

UdeskSDKManager *chatViewManager = [[UdeskSDKManager alloc] initWithSDKStyle:[UdeskSDKStyle customStyle]];
//强制竖屏
chatViewManager.orientationMask = UIInterfaceOrientationMaskPortrait;
//强制横屏
//chatViewManager.orientationMask = UIInterfaceOrientationMaskLandscape;
[chatViewManager presentUdeskInViewController:self completion:nil];

H5页面无法上传附件,点击直接返回上一页

1.使用presentViewController进入留言页

2.重写dismissViewControllerAnimated方法

- (void)dismissViewControllerAnimated:(BOOL)flag completion:(void (^)(void))completion {
    if ( self.presentedViewController)
    {
        [super dismissViewControllerAnimated:flag completion:completion];
    }
}

3.在需要dismiss的时候调用:

[super dismissViewControllerAnimated:flag completion:completion];

工作台顾客信息显示应用的名称不正确

如果工作台的客户信息来源显示为“未知”,则可能是您的App的info.plist中没有设置CFBundleDisplayName属性,导致SDK无法获取App的名称。

七、更新记录

更新记录:

SDK v5.2.12版本更新功能:

1、兼容文件消息文件名特殊符号 2、修复图片和视频中文名偶尔读取失败


SDK v5.2.11版本更新功能:

1、机器人转人工 2、横屏聊天信息溢出屏幕外修复


SDK v5.2.10版本更新功能:

1、修复富文本嵌入图片打开 2、修复视频消息无发送状态 3、修复app被杀死时放弃排队


SDK v5.2.9版本更新功能:

1、兼容armv7架构


SDK v5.2.8版本更新功能:

1、iOS 16崩溃修复

2、富文本日期内容跳转问题修复

3、NSMutableData分类问题修复

4、部分过期api升级


SDK v5.2.7版本更新功能:

1、新增历史消息和最新消息分割

2、模拟器键盘死锁问题修复

3、富文本分组展开页面滚动问题修复

4、个别机型客服组选择页面数据重复问题修复

5、历史聊天记录部分丢失问题修复

6、系统权限授权申请优化


SDK v5.2.5版本更新功能:

1.xmpp重连优化


SDK v5.2.4版本更新功能:

1、适配iOS15


SDK v5.2.3版本更新功能:

1、新机型识别

2、商品消息优化

3、适配iOS15


SDK v5.1.9版本更新功能:

1、SDK支持历史对话优化

2、xcode 14.5编译问题


SDK v5.1.8版本更新功能:1、支持推荐引导语

2、修改以往历史消息记录转人工按钮逻辑


SDK v5.1.7版本更新功能

1、修复了链接转码问题

2、支持配置相册颜色

3、已知问题修改


SDK v5.1.6版本更新功能

1、支持机器人消息跳转

2、支持评价事件消息

3、适配iOS14

4、已知问题修改


SDK v5.1.5版本更新功能

1、修复了使用pod导入分支方式编译报错问题

2、已知问题修改


SDK v5.1.4版本更新功能

1、机器人富文本消息显示问题修复

2、排队留言会话问题修复

3、已知问题修改


SDK v5.1.3版本更新功能

1、机器人推荐消息富文本显示问题修复

2、自动消息增加商品类型

3、机器人消息增加建议问题类型

4、已知问题修改


SDK v5.1.2版本更新功能

1、对话留言优化

2、修复了iOS13 deviceToken的问题

3、已知问题修改


SDK v5.1.1版本更新功能

1、对话中客服离线体验优化

2、已知问题修改


SDK v5.1.0版本更新功能

1、支持模板消息

2、支持发送订单、轨迹消息

3、已知问题修改


SDK v5.0.0版本更新功能

1、支持原生机器人

2、支持三方会话

2、UI交互改版


SDK v4.3.1版本更新功能

1、修改上传文件策略

2、修改了在黑暗模式下的显示问题


SDK v4.3.0版本更新功能

1、修复了YYWebImage冲突问题

2、修复了客服状态问题

3、修复了获取多语言应用名称问题

4、限制了满意度评价备注字数

5、修复了已知问题


SDK v4.1.9版本更新功能

1、修复了YYWebImage冲突问题


SDK v4.1.8版本更新功能

1、修复了泰文消息显示不全的问题


SDK v4.1.7版本更新功能

1、适配iOS13

2、修复了已知问题


SDK v4.1.6版本更新功能

1、修复了图片选择器错乱问题

2、空消息优化

3、修复了已知问题


SDK v4.1.5版本更新功能

1、修复了无消息对话过滤在某些场景下失效的问题

2、修复了使用sdk指定客服/客服组在某些场景下失效的问题


SDK v4.1.4版本更新功能

1、多语言支持

2、稳定性优化


SDK v4.1.3版本更新功能

1、消息优化


SDK v4.1.2版本更新功能

1、客服连接逻辑优化

2、视频消息下载优化

3、稳定性优化


SDK v4.1.1版本更新功能

1、修复了在无消息对话过滤界面发送表情显示code问题

2、修复了偶发出现配置英文还提示中文弹窗的问题


SDK v4.1.0版本更新功能

1、机器人支持自动转人工事件

2、适配iPhone Xs、XR、Xs Max

3、支持全局客户唯一性customer_token

4、支持自定义渠道

5、机器人名称支持管理员后台配置

6、优化无消息对话过滤

7、离线消息优化显示消息时间为发送时间

8、默认表情替换、兼容新旧表情

9、支持排队发送消息

10、修复了不同手机视频消息无法播放问题

11、修复了客服快送发送消息导致sdk端消息排序错乱问题

12、修复了选择多张图片发送导致图片发送不准确问题

13、已知问题修复


SDK v4.0.6版本更新功能

1、适配iOS12


SDK v4.0.5版本更新功能

1、更新客户信息支持回调

2、满意度调查UI适配iPhone X

3、网络检查组件“UdeskReachability”崩溃修复


SDK v4.0.4版本更新功能

1、消息优化

2、评价结果错误问题修改

3、满意度评价第三方输入法遮挡提交按钮问题修改

4、SDK相机权限提示优化

5、SDK满意度标签选中后,键盘弹出收起时,标签选中标识消失


SDK v4.0.3版本更新功能

1、排队直接进入留言问题修改

2、满意度评价备注必填问题修改


SDK v4.0.2版本更新功能

1、连接优化

2、修复无法直接留言问题

3、修复直接留言文案显示又消失问题

4. 修复无消息对话过滤无法收到自动消息问题


SDK v4.0.1版本更新功能

1. 支持商品消息

2. 已知问题修改


SDK v4.0.0版本更新功能

1. 支持新版满意度调查

2. 支持自定义按钮

3. 支持无消息对话过滤

4. 支持强制横竖屏

5. 支持后台配置留言引导文案

6. 支持小视频拍摄

7. 选择图片优化

8. 支持自定义表情包

9. 支持配置机器人推荐问题

10. 支持配置转人工按钮在机器人会话x条后显示

11. 支持自动发送消息


SDK v3.9.2版本更新功能

1. 修复了接收富文本消息有几率崩溃问题


SDK v3.9.1版本更新功能

1. 工单页面、地理位置页面适配iPhone X

2. 工单页面、地理位置页面白线问题处理

3. 修复分配客服组问题

4. 修复引入的第三方框架枚举冲突


SDK v3.9版本更新功能

1. 消息到达率优化

2. SDK支持视频会话


SDK v3.8.7版本更新功能

1. 增加消息文本网址点击回调接口

2. 修复调用.searchController导致的crash问题

3. 修复进入留言表单用户默认数据不会自动带入问题


SDK v3.8.6版本更新功能

1. 机器人页面适配iPhone X

2. 放弃排队优化

3. 解决输入文字换行出现的UI问题

4. 修改拍摄图片过大导致花屏的问题


SDK v3.8.5版本更新功能

1. 满意度调查不弹窗bug修改


SDK v3.8.4版本更新功能

1. 增加获取后端配置失败重试机制

2. 适配iPhone X

3. 增加设置系统相册取消按钮颜色参数


SDK v3.8.3版本更新功能

1. SDK在非工作时间直接留言失败问题修改

2. 视频重发问题修改


SDK v3.8.2版本更新功能

1. iOS11导航栏按钮偏移问题修改


SDK v3.8.1版本更新功能

1. 修复sdk_token特殊字符导致消息无法保存问题


SDK v3.8版本更新功能

1. SDK支持地理位置发送(支持原生和API形式)

2. 欢迎语支持电话网址识别

3. 解决pod导入中英文切换问题

4. 解决APP切换网络SDK不会相应传给客服修改问题


SDK v3.7.1版本更新功能

1. 欢迎语空白bug修改

2. 时间显示bug修改

3. 指定分配客服、客服组bug修改

4. 使用导入pod 和YYWebimage冲突修改

5. 输入框功能按钮可配置

6. 根据iOS版本切换使用WKWebview或者UIWebview


SDK v3.7版本更新功能

1. 支持离线直接留言

2. SDK支持返回满意度调查和支持开关设置

3. SDK支持接收和发送GIF

4. SDK支持接收和发送视频

5. SDK支持客服消息撤回


SDK v3.6.4版本更新功能

1. 客服关闭会话之后用户发送消息重连机制

2. 关闭留言弹窗文案bug修改


SDK v3.6.3版本更新功能

1. 优化自定义字段调用方式

2. 欢迎语bug修改


SDK v3.6.2版本更新功能

1. 增加im页面返回回调API

2. 录音优化


SDK v3.6.1版本更新功能

1. 满意度调查多次弹窗bug修改

2. 客服繁忙到上线sdk弹窗自动隐藏


SDK v3.6版本更新功能

1. 支持结构化消息展示

2. 支持管理员端黑名单留言提示语自定义


SDK v3.5.8版本更新功能

1. 支持留言添加附件

2. 开放留言页面跳转方式事件逻辑修改

3. 推送例子

3. bug修复


SDK v3.5.7版本更新功能

1. 支持bitcode


SDK v3.5.6版本更新功能

1. 修改复制大量文字到输入框引起的crash


SDK v3.5.5版本更新功能

1. 支持将未读消息标记为已读

2. 修复关闭会话之后有几率性不弹满意度调查


SDK v3.5.4版本更新功能

1. 适配iOS10.3


SDK v3.5.3版本更新功能

1. 支持管理员端sdk配置

2. 支持放弃排队

3. 初始化不再支持单点登录的key,统一使用创建每个应用时生成对应的appid,和appkey。


SDK v3.4版本更新功能

1. 支持推送

2. 支持多app

3. 新增查看客户是否正在会话API

4. 满意度调查bug修复


SDK v3.3.4版本更新功能

1. 优化相册、语音权限流程

2. 转接优化


SDK v3.3.3版本更新功能:

1. 支持主动满意度调查

2.push接口增加完成回调

3. 文字过多时计算bug修复

4. 支持https

八、功能截图

udesk