iOS IM SDK 5.x 版本(master分支)

公告

接入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 iOS16编译。

目录

一、集成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文件夹拖到你的工程里,并进行以下配置

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文件夹拖到你的工程里,并进行以下配置

libicucore.tbd
CFNetwork.framework
Security.framework

注意:UdeskCall最低支持iOS8.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 = @"test@udesk.cn";
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 用户自定义字段

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];

三、自定义配置

3.1 自定义UI

//此处只是示例,更多UI参数请参看 SDK包中文件: UdeskSDKStyle.h 
//路径如: UdeskSDK/UDChatMessage/UDTools/Config/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从而显示机器人语音识别按钮。

如果需要使用百度语音请自行替换sdk里的“UD_API_KEY”、“UD_SECRET_KEY”、“UD_APP_ID”!

其他自定义配置请查看代码文件 “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];
}

离线推送接口要求

基本要求

参数

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

参数名 类型 说明
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,定义在 UdeskManager.h 中。

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://dn-udeskim.qbox.me/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,该开源库会和判断输入框的逻辑冲突。

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

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

我们产品逻辑: 假设客户A 选了客服组B下的客服B1,进行会话。 之后客户A退出会话界面,进入另外界面,之后通过客服组C下的客服C 1分配会话: 这时后台会判断,如果和B1会话还存在,则会直接分配给B1,而不会分配給客服C 1。 只有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页面直接crash,堆栈信息显示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 这个 Property,导致 SDK 获取不到 App 的名字。

七、更新记录

更新记录:

sdk v5.2.10版本更新功能:

1、修复 富文本嵌入图片打开

2、修复 视频消息无发送状态

3、修复 app被杀死时放弃排队


sdk v5.2.9版本更新功能:

1、兼容armv7架构


sdk v5.2.8版本更新功能:

1、iOS 16 crash修复

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.已知bug修改


sdk v5.1.6版本更新功能:

1.支持机器人消息跳转

2.支持评价事件消息

3.适配iOS14

4.已知bug修改


sdk v5.1.5版本更新功能:

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

2.已知bug修改


sdk v5.1.4版本更新功能:

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

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

3.已知bug修改


sdk v5.1.3版本更新功能:

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

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

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

4.已知bug修改


sdk v5.1.2版本更新功能:

1.对话留言优化

2.修复了iOS13 deviceToken的问题

3.已知bug修改


sdk v5.1.1版本更新功能:

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

2.已知bug修改


sdk v5.1.0版本更新功能:

1.支持模版消息

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

3.已知bug修改


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” crash修复


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